批次地址轉坐標part2

[實用技巧](提供Nominatim小工具)地址轉換經緯度PART2-Python爬蟲進行轉換

關鍵字: #地址轉換 #Python #爬蟲 #實用技巧

23/10/03更新: 提供地理對位小工具

地理對位小工具

點我進入工具頁面

大量地址轉換經緯度PART1

[實用技巧系列-大量地址轉換經緯度PART2]

在上一篇文章中,我們介紹了如何多種使用實現單一地址轉換經緯度的功能,例如採用各種地址轉換服務,例如Google Map API(Geocoding)、台灣TGOS的地址轉換服務等。其中最主要推薦的是採用Google Earth進行間接轉換(單次5000筆)。

這篇文章則提供另外的批次處理方法,主要採用Python的Selenium進行網頁自動化操作,模擬人工進行地址轉換,其他用到的模組「Pandas」用來讀取和寫入csv檔案,可以用來儲存表格型態的資料,例如地址清單。我們也將使用Python的os模組來操作檔案路徑,以及time模組來控制爬蟲的速度。

這邊示範資料將採用財政部資料中的夾娃娃機營業資料作為練習

[示範操作]

1安裝Python以及相關模組:

這邊建議新手可以直接安裝Anaconda建置Python環境,以下提供幾個相關的安裝教學

Anaconda介紹及安裝教學- Python4U – Medium

第01 天:Python:Anaconda 環境配置 – iT 邦幫忙

安裝完成後我們可以利用PIP指令在Anaconda Prompt中依序安裝需要用到的模組

pip install pandas
pip install selenium

2.地址轉換坐標網站介紹:

這次示範採用以下網站進行爬蟲坐標轉換,同樣的方法也可以應用在例如Google MAP、TGOS圖台等,僅需稍微修改程式碼即可。

https://share-my-location.com/zh-TW/geocoding

該網站的使用方式非常簡單,僅需要輸入坐標後按下轉換按鈕即可以獲得坐標資訊

台北101地址進行轉換

3.利用Python+Selenium進行自動操作:

接下來我們需要透過Python+Selenium來模擬人為操作,首先我們輸入以下的程式碼先導入需要用到的模組: time、pandas以及selenium等。

import time

import pandas as pd
from selenium import webdriver
from selenium.webdriver.support.ui import Select
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains

***在進行網頁交互操作之前,需要先下載對應瀏覽器版本的驅動程式,範例採用Chrome,可以依照以下連結下載對應版本的Driver。

Chrome Driver: https://chromedriver.chromium.org/downloads

下載完成後,我們透過以下程式碼指定Driver,並打開轉換地址網頁,打開網頁後會顯示如下圖所示,這時候我們手動點擊下方的同意使用Cookie選項,以免找不到網頁元素。

browser = webdriver.Chrome(executable_path='chromedriver.exe')
browser.get("https://share-my-location.com/zh-TW/geocoding")
瀏覽器會顯示受到自動軟體的控制

接下來使用以下的定義好的Function進行模擬操作,可以直接複製取用,排版應該如下圖

def get_coordinate(addr):
    try:
        search = browser.find_element(By.ID,"lat") #找尋輸入框
        search.clear() #清空輸入框
        search.send_keys(addr) #輸入地址
        button = browser.find_element(By.XPATH,'//*[@id="geo"]/div[1]/button') #找尋轉換按鈕
        button.click() #點擊按鈕
        time.sleep(1) #等待1秒
        text=browser.find_element(By.XPATH,'//*[@id="geo"]/div[1]/h2') #找到轉換後的坐標資訊
        lat,lon=float(text.text.split()[0]),float(text.text.split()[2]) #坐標格式化取用
        browser.refresh() #重新整理
        print(addr,lat,lon)
    except:
        print(addr,'發生錯誤')
        pass
    return lat,lon

接下來我們利用娃娃機的營業地址進行測試:

接下來可以簡單的利用for迴圈,將營業地址逐一調用get_coordinate進行轉換,以下為部分成果。

今天的分享就到這裡了,目前測試下來可以進行批次轉換,但有時時候網頁不穩的時候會出現錯誤訊息,後續可能會新增一些判斷網頁元素是否載入完成的判別式提高運行的穩定度,如果喜歡的我內容的話可以訂閱的YT頻道以及FB專頁,支持我產出更多優質內容

練習檔下載:

娃娃機資料下載請點這

其他教學

分享

發表迴響