Python / 使用 Selenium 撰寫網路爬蟲程式 (chromedriver)

Python / 使用 Selenium 撰寫網路爬蟲程式 (chromedriver)

想要用 Python 實作網路爬蟲程式的方法有兩種:使用 requests 套件或 selenium 套件。兩個套件的差異在於 requests 套件是使用最基礎的 GET 和 POST 方法和 server 溝通,好處在於它的速度快、作法單純,壞處是必須處裡來自於網站的一切資料傳輸動作、Cookies Handling、甚至更複雜的 JS 渲染、網頁程式互動等複雜的動作。如果要爬的目標網站內容比較單純,或甚至可以透過 API 取的資料,那可以考慮使用 requests 套件。不過現在的網站設計越來越複雜,本篇使用的 selenium 套件則是透過控制瀏覽器 (本篇使用 chromedriver),讓瀏覽器為我們處裡上面提到的複雜動作,例如登入帳號之後的 cookies handling、表單填寫並送出 POST request 或是 JS 渲染後的網站動作,讓我們模擬實際操作網站的方式進行網站爬蟲。本篇目前不是完整的爬蟲程式教學,只是筆記一些關於使用 Selenium 套件撰寫爬蟲程式的方法。

目錄

▍如何取得 HTML 的 attribute (how to get attribute of element)

使用 element.get_attribute("attribute name") 方法即可

from selenium import webdriver

driver = webdriver.Chrome()
driver.get('http://note.charlestw.com/')
elmt = driver.find_element_by_id('element-name') #找到 id="element-id" 的物件
attr = elmt.get_attribute("attribute-name") #取得該物件某 attribute 的值

Reference

▍實作捲動畫面 (Scrolling)

使用 selenium-webdriver 可以把畫面滾動到指定位置,例如在某些網站把畫面拉到最底下之後會之後載入更多的資料,這時候就需要將畫面捲動到最下面的位置。實作的方法有四種:

  1. 使用 Actions 捲動到指定的物件 (假設要找到 id = “bottom” 的物件)
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains

driver = webdriver.Chrome()
driver.get('http://note.charlestw.com/')
target = driver.find_element_by_id('bottom') #找到指定的物件(element)
actions = ActionChains(driver)
actions.move_to_element(target)
actions.perform()

  1. 使用 JavaScript 捲動到指定的物件 (假設要找到 id = “bottom” 的物件)
from selenium import webdriver

driver = webdriver.Chrome()
driver.get('http://note.charlestw.com/')
target = driver.find_element_by_id('bottom') #找到指定的物件(element)
driver.execute_script('arguments[0].scrollIntoView(true);', target)

  1. 使用內建方法 location_once_scrolled_into_view(假設要找到 id = “bottom” 的物件)
from selenium import webdriver

driver = webdriver.Chrome()
driver.get('http://note.charlestw.com/')
target = driver.find_element_by_id('bottom') #找到指定的物件(element)
target.location_once_scrolled_into_view

location_once_scrolled_into_view 方法會回傳捲動後的物件 x, y 座標所在位置。

  1. 送出鍵盤快速鍵捲動到頁面底部
from selenium import webdriver
from selenium.webdriver.common.keys import Keys 

driver = webdriver.Chrome()
driver.get('http://note.charlestw.com/')
driver.find_element_by_tag_name('body').send_keys(Keys.END) #等同按下鍵盤END

另外還有 send_keys(Keys.DOWN) / send_keys(Keys.UP) / send_keys(Keys.PAGE_DOWN) / send_keys(Keys.PAGE_UP) 可以控制畫面移動,等同於鍵盤的 Home、End、Page Up 和 Page Down 按鍵。

Reference