Selenium WebDriver with Ruby on Headless Chrome/Firefox 無頭爬蟲模式
使用 geckodriver 來連接 headless Firefox 與 Selenium 或是使用 chromedriver 來連接 Chrome 與 Selenium
安裝 Geckodriver / Chromedriver
$ brew install geckodriver // Firefox
$ brew cask install chromedriver // Chrome
安裝 Selenium Gem
$ gem install selenium-webdriver
引用 Selenium WebDriver 模組
require 'selenium-webdriver'
指定欲使用的瀏覽器
Firefox
options = Selenium::WebDriver::Firefox::Options.new(args: ['-headless'])
driver = Selenium::WebDriver.for :firefox, options: options
Chrome
options = Selenium::WebDriver::Chrome::Options.new(args: ['headless'])
driver = Selenium::WebDriver.for :chrome, options: options
使用 selenium 操控無頭瀏覽器
# 連結到台灣電子地圖服務網
driver.get('http://www.map.com.tw')
# 點擊搜尋欄位
# <input type="text" style="margin-left:7px;" id="searchWord" value="例如:新北市中和區中正路716號" ondblclick="this.value=''">
driver.find_element(id: 'searchWord').click
# 由於 input 的值設定為'例如:新北市中和區中正路716號',所以必須先清除掉
driver.find_element(id: 'searchWord').clear
# 讓瀏覽器代替輸入'高雄市苓雅區和平一路147號'並送出表單
driver.find_element(id: 'searchWord').send_keys '高雄市苓雅區和平一路147號', :return
# 這邊要等待兩秒, 否則 .winfoIframe 還沒有產生會發生找不到 element
# 當初在這邊卡超久的,幸好有看到花哥分享了 Python 爬蟲有寫到等待,才發現可以這樣用
sleep 2
# store iframe web element
# 另一種方法 iframe = driver.find_element(:css, ".windowInfo > iframe")
iframe = driver.find_element(class: 'winfoIframe')
# 切換到 iframe
driver.switch_to.frame(iframe)
# 點擊 '座標' 圖示進行跳頁
driver.find_elements(class: 'fun')[1].click
# 使用 xpath 取得頁面上的經緯度
coordinates = driver.find_element(xpath: "/html/body/form/div[5]/table/tbody/tr[2]/td").text.split(' ')
# 經緯度
latitude = coordinates[0].split(':')[1]
longitude = coordinates[1].split(':')[1]
puts latitude
puts longitude
Reference:
Geocoding - 批量處理地址轉換經緯度
Selenium
本作品采用 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议 进行许可。