planningalerts-scrapers / city_of_busselton_development_applications

City of Busselton Development Applications


City of Busselton Development Applications (WA)

This is a scraper that runs on Morph. To get started see the documentation

Add any issues to https://github.com/planningalerts-scrapers/issues/issues

Development Requirements

Install pdftohtml

MacOS

  • Homebrew: Run brew install pdftohtml
  • MacPorts: Run sudo port install pdftohtml

Linux (Ubuntu/Debian)

Install poppler-utils by running:

sudo apt-get install poppler-utils

To run the scraper

bundle exec ruby scraper.rb

Expected output

Retrieving https://www.busselton.wa.gov.au/documents/13944/applications-lodged-2026 ...
Running pdftohtml to convert pdf to xml pages...
Page-1
...
Page-46
Parsing XML document ...
Processing page# 1
Page header: Applications Lodged – 13/03/2026 – 19/03/2026
Group: Development Applications
Saving DA26/0185 - Lot 75 No 20 Old Mill Grove QUINDALUP  WA  6281
...
Saving DA26/0195 - Lot 45 No 21 Carline Loop GEOGRAPHE  WA  6280
Processing page# 2
...
Processing page# 17
Page header: Applications Lodged – 13/02/2026 – 19/02/2026
Finished! Processed 178 records.

Execution time ~ 10 seconds

To run style and coding checks

bundle exec rubocop

To check for security updates

gem install bundler-audit
bundle-audit

Development

Set:

  • DEBUG=1 - to enable debug output from scraper

Data source

Home >> Plan and Build >> Applications Issued, Determined and Lodged

"Applications Lodged" links for the current year and previous year are links to PDFs covering the whole year. The scraper fetches the first (current year) PDF and continues to the second (prior year) PDF only if it has not yet found a date range ending more than 30 days ago — this naturally handles the January overlap without any special date logic in ApplicationsLodgedPage.

Format: Each PDF is a concatenation of weekly "Applications Lodged – DD/MM/YYYY – DD/MM/YYYY" documents, ordered from the most recent week to the earliest week for the year. The date range heading repeats on every page of each weekly section.

Each weekly section lists one or more groups (eg "Development Applications" or "Building Applications"), each preceded by a bold group heading and a table with columns:

  • Application Number
  • Description
  • Primary Property Address
  • Date Application Received
  • Date Deemed Complete (later Development Applications only — ignored by scraper)

Notes:

  • There is a fixed header and footer region; the data table/s and group headings is contained between them, and rows are split across pages when they do not fit.
  • Table headings are not repeated on a continuation of a table onto following pages;
  • Group headings do not force a page break (a new table starts below)
  • Table headings are sometimes split mid-word, eg "Applicatio" on one line and "n Number" on the next line. A list of known headings is maintained to handle this to determine if a space should be inserted between lines or not.
    • This implies that column alignment may vary
  • Table headings may change with the addition of "Date Deemed Complete", though this was not seen in the last 30 days
  • Cell contents are normally aligned to the bottom of the row.
  • When a row is split across pages, the first page holds as much of each cell that fits, with the remaining cell content appearing on the following page. The scraper uses previous_record to handle this.
  • html2xml may merge text from two columns, which may cause classification issues, we handle this by
    • moving the 2nd word from council reference to address if present, eg: "BAC26/0109 Certified:"
    • moving dates at the end of addresses to datereceived and ignoring multiple dates for datereceived

Contributors gooch equivalentideas CloCkWeRX mlandauer benrfairless ianheggie-oaf

Last run failed with status code 1.

Console output of last run

Injecting configuration and compiling... Injecting scraper and running... Retrieving https://www.busselton.wa.gov.au/documents/13985/applications-lodged ... Running pdftohtml to convert pdf to xml pages... Syntax Warning: Bad annotation destination Page-1 Page-2 Page-3 Page-4 Page-5 Page-6 Page-7 Page-8 Page-9 Page-10 Page-11 Page-12 Page-13 Page-14 Page-15 Page-16 Page-17 Page-18 Page-19 Page-20 Page-21 Page-22 Page-23 Page-24 Page-25 Page-26 Page-27 Page-28 Page-29 Page-30 Page-31 Page-32 Page-33 Page-34 Page-35 Page-36 Page-37 Page-38 Page-39 Page-40 Page-41 Page-42 Page-43 Page-44 Page-45 Page-46 Page-47 Page-48 Page-49 Page-50 Page-51 Page-52 Page-53 Page-54 Page-55 Page-56 Page-57 Page-58 Page-59 Page-60 Page-61 Page-62 Page-63 Page-64 Page-65 Page-66 Page-67 Page-68 Page-69 Page-70 Page-71 Page-72 Page-73 Page-74 Page-75 Page-76 Page-77 Page-78 Page-79 Page-80 Page-81 Page-82 Page-83 Page-84 Page-85 Page-86 Page-87 Page-88 Page-89 Page-90 Page-91 Page-92 Page-93 Page-94 Page-95 Page-96 Page-97 Page-98 Page-99 Page-100 Page-101 Page-102 Page-103 Page-104 Page-105 Page-106 Page-107 Page-108 Page-109 Page-110 Page-111 Page-112 Page-113 Page-114 Page-115 Page-116 Page-117 Page-118 Page-119 Page-120 Page-121 Page-122 Page-123 Page-124 Page-125 Page-126 Page-127 Page-128 Page-129 Page-130 Page-131 Page-132 Page-133 Page-134 Page-135 Page-136 Page-137 Page-138 Page-139 Page-140 Page-141 Page-142 Page-143 Page-144 Page-145 Page-146 Page-147 Page-148 Parsing XML document ... Processing page# 1 scraper.rb:45:in `block (2 levels) in process_site': undefined method `<' for nil:NilClass (NoMethodError) if pdf_page.lodged_upto_date < earliest_date_of_interest ^ from /app/vendor/bundle/ruby/3.2.0/gems/nokogiri-1.17.2-x86_64-linux/lib/nokogiri/xml/node_set.rb:237:in `block in each' from /app/vendor/bundle/ruby/3.2.0/gems/nokogiri-1.17.2-x86_64-linux/lib/nokogiri/xml/node_set.rb:236:in `upto' from /app/vendor/bundle/ruby/3.2.0/gems/nokogiri-1.17.2-x86_64-linux/lib/nokogiri/xml/node_set.rb:236:in `each' from scraper.rb:41:in `block in process_site' from scraper.rb:33:in `each' from scraper.rb:33:in `process_site' from scraper.rb:23:in `run' from scraper.rb:132:in `<main>'

Data

Downloaded 5689 times by openaustralia LoveMyData mlandauer jesse-a-reilly dcalde tkrikke repose-lecture gooch TheZepto 538digital Jedwards157 Joel-Tan_valocity

To download data sign in with GitHub

Download table (as CSV) Download SQLite database (244 KB) Use the API

rows 10 / 678

council_reference address description info_url comment_url date_scraped on_notice_to date_received on_notice_from
DA16/0639
1301 Wildwood Road, Yallingup, WA
Use Not Listed Tavern (Micro Brewery)
mailto:city@busselton.wa.gov.au?subject=DA16/0639
2016-09-16
2016-09-21
DA16/0618
44 Bell Drive, Broadwater, WA
Multiple Dwellings (16 Multiple Dwellings)
mailto:city@busselton.wa.gov.au?subject=DA16/0618
2016-09-16
2016-09-21
DA16/0606
190 Bussell Highway, West Busselton, WA
Medical Centre
mailto:city@busselton.wa.gov.au?subject=DA16/0606
2016-09-16
2016-09-28
DA16/0696
216 Fish Road, Sabina River, WA
Extractive Industry (Sand) --
mailto:city@busselton.wa.gov.au?subject=DA16/0696
2016-10-03
2016-10-26
DA16/0723
88 Genoli Road, Wonnerup, WA
Animal Establishment (Horse and Working Dog Shows)
mailto:city@busselton.wa.gov.au?subject=DA16/0723
2016-10-03
2016-10-26
DA16/0742
1086 Kaloorup Road, Kaloorup, WA
Extractive Industry (Gravel)
mailto:city@busselton.wa.gov.au?subject=DA16/0742
2016-10-06
2016-10-26
DA16/0699
130 and Lot 237 Ludlow Park Road, Ludlow, WA
Extractive Industry and Crushing Facility (Limestone)
mailto:city@busselton.wa.gov.au?subject=DA16/0699
2016-10-07
2016-11-02
AMD21/0022
182 Geographe Bay Road QUINDALUP WA 6281
SCHEME AMENDMENT NO. 22 - RECODING LOT 41 GEOGRAPHE BAY ROAD QUINDALUP AND AMENDING SCHEDULE 4
2016-11-23
2016-06-20
2016-10-12
AMD21/0010
City of Busselton Administration Building 2 Southern Drive BUSSELTON WA 6280
Text Amendment - Introduce a requirement to obtain development approval for development comprising Re-purposed dwellings and Second-hand dwellings.
2016-11-23
2015-04-23
2016-10-12
AMD21/0023
Layman Road GEOGRAPHE WA 6280
SCHEME AMENDMENT NO. 23 - REZONING OF LOT9507 LAYMAN ROAD GEOGRAPHE
2016-11-16
2016-07-08
2016-10-05

Statistics

Average successful run time: 1 minute

Total run time: 9 days

Total cpu time used: about 1 hour

Total disk space used: 367 KB

History

  • Auto ran revision 6a0f0cfd and failed .
    nothing changed in the database
  • Auto ran revision 22dbb4ca and failed .
    nothing changed in the database
  • Auto ran revision 22dbb4ca and failed .
    nothing changed in the database
  • Auto ran revision 22dbb4ca and completed successfully .
    156 records added, 155 records removed in the database
  • Auto ran revision 22dbb4ca and completed successfully .
    155 records added, 155 records removed in the database
  • ...
  • Created on morph.io

Show complete history