想要用 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 可以把畫面滾動到指定位置,例如在某些網站把畫面拉到最底下之後會之後載入更多的資料,這時候就需要將畫面捲動到最下面的位置。實作的方法有四種:
- 使用
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()
- 使用
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)
- 使用內建方法
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 座標所在位置。
- 送出鍵盤快速鍵捲動到頁面底部
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
Copyright announcement:
the featured image: Photo by Florian Olivo on Unsplash