Geocoding - 批量處理地址轉換經緯度

Oliver Hua 花雲鴻
花哥的奇幻旅程
3 min readMar 7, 2020

Python + Selenium + Chrome 爬蟲教學

前言

製作口罩地圖的時候,最困難的問題莫過於把Open Data的地址轉換成經緯度。現在網路上對於地址轉換經緯度的方法也大多失效了。其中,最常被使用的Google API被要求必須提供API key,否則會出現以下錯誤:

{‘error_message’: ‘You must use an API key to authenticate each request to Google Maps Platform APIs. For additional information, please refer to http://g.co/dev/maps-no-account', ‘results’: [], ‘status’: ‘REQUEST_DENIED’}

買不起貴貴的API key,於是開始發揮爬蟲技能!

這個方法目前還可以大量批次處理地址轉換經緯度,希望不要被玩壞XD

工欲善其事 必先利其器

這次需要的材料有:

  • Python開發環境
  • Selenium

pip install selenium

  • Beautiful Soup

pip install beautifulsoup4

  • webdriver

以Google Chrome作為範例,先到以下連結下載符合自己Chrome 版本的webdriver

https://chromedriver.chromium.org/downloads

下載之後解壓縮會是一個叫chromedriver的檔案,把它丟到以下目錄

/usr/local/bin/

這樣環境就設定完成啦!

背景原理

我打算去爬「台灣電子地圖服務網」的資料,原生的功能即可輕鬆地查詢經緯度。

輸入地址之後,按查詢的按鈕,就會跳出以下畫面:

接著按框框裡的「座標」,就會出現經緯度了

我們正是要利用Selenium控制Chrome做出上述的行為!

開始實作

先把該用的東西import 進來。其中options設定了Chrome的行為,可以讓Chrome被webdriver呼叫的時候,安靜地在背景中執行,而不會跳出新的視窗,覆蓋過最上層正在執行的App。

接著就是控制Chrome的行為啦~

其中的XPath我是利用一個非常方便的Chrome extension找出來的,叫做XPath Helper。

實作中遇到的一個難題就是:這個網頁用了非常多的頁框,導致find_element_by_xpath()沒有如此順利,需要切換頁框才可以順利抓到資料。

以上function的使用方法非常簡單:

呼叫之後就會回傳一個tuple

('25.017049', '121.533648')

大功告成啦!

補充資料

使用這個方法除了可以爬到最常見的WGS84座標之外,在「座標」的框框裡也有TWD67的資料。只需要改一下XPath就可以爬得到。

但如果要TWD97的資料,我也滿推薦到全國門牌地址定位服務進行爬蟲的。這個服務也有相關的開源資源

原本只是因為太窮酸無法使用每 1,000 次呼叫需要$5.00 美元的Geocoding API,結果卻因禍得福學到了很多的爬蟲小技巧。希望這篇文章可以幫助到需要Geocoding卻苦無資源的人~~

--

--

Oliver Hua 花雲鴻
花哥的奇幻旅程

B07 NTU Mechanical Engineering/ASME@NTU/FSAE Racing Team@NTU/RA@NTU CSIE/Interested in Learning Cutting-edge Techniques