Selenium WebDriver with Ruby on Headless Chrome/Firefox 無頭爬蟲模式

有 N 人看过

使用 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 国际许可协议 进行许可。