很多新手在遇到動態網頁的時候,都會不知所措,因為它需要額外的網頁操作,像是會員登入、滾動網頁卷軸、點擊按鈕等等,才有辦法爬取到網頁資料。
今天這篇文章我就用Facebook網站為例,分享在建置Python動態網頁爬蟲上,最常使用的5個Selenium網頁操作方法,讓你之後可以順利爬取到動態網頁的資料,包含:
- Selenium send_keys()方法:輸入表單資料
- Selenium submit()方法:送出表單資料
- Selenium click()方法:點擊按鈕
- Selenium move_to_element()方法:移動滑鼠到特定元素上
- Selenium execute_script()方法:執行JavaScript程式碼
$ pip install selenium webdriver-manager
from selenium import webdriver # 瀏覽器驅動模組 from webdriver_manager.chrome import ChromeDriverManager # Chrome瀏覽器驅動模組 from selenium.webdriver.chrome.options import Options # 瀏覽器選項設定模組 from selenium.webdriver.common.by import By # 定位元素模組 import time # 時間模組
options = Options() options.add_argument("--disable-notifications") # 取消瀏覽器的通知訊息 # 安裝及啟動Chrome瀏覽器 driver = webdriver.Chrome(ChromeDriverManager().install(), chrome_options=options) # 發送請求到Facebook網站 driver.get('https://www.facebook.com/')
一、Selenium send_keys()方法:輸入表單資料
在爬取網頁資料的時候,有些網頁會需要輸入帳號、密碼登入,或是輸入查詢條件進行查詢的動作,才會顯示網頁資料,這時候就可以利用Selenium套件的send_keys()方法來輸入表單資料。
這邊用Facebook網站的登入頁面為例,它的網頁原始碼為:
而Selenium套件的send_keys()方法輸入表單資料應用如下:
# 定位帳號欄位 email = driver.find_element(By.ID, "email") # 定位密碼欄位 password = driver.find_element(By.ID, "pass") # 輸入帳號欄位資料 email.send_keys("你的帳號") # 輸入密碼欄位資料 password.send_keys("你的密碼")
二、Selenium submit()方法:送出表單資料
網頁爬蟲在輸入網頁資料之後,通常會搭配送出表單的動作,才會登入網頁或是查詢資料,這時候就可以使用Selenium套件的submit()方法來送出表單資料。
接續上面的範例,使用Selenium套件的submit()方法送出輸入的帳號、密碼表單欄位資料如下:
#定位帳號欄位 email = driver.find_element(By.ID, "email") #定位密碼欄位 password = driver.find_element(By.ID, "pass") #輸入帳號欄位資料 email.send_keys("你的帳號") #輸入密碼欄位資料 password.send_keys("你的密碼") #送出表單資料 password.submit()
三、Selenium click()方法:點擊按鈕
在網頁上任何的點擊動作,都可以利用Selenium套件的click()方法來進行點擊,比如說網頁爬蟲很多時候會需要點擊網頁上的按鈕或超連結,來導向到新網頁執行爬取的動作,就可以用這個方法達成。
在上面的範例中,我們也可以透過點擊「登入」按鈕來進行登入的動作,它的網頁原始碼為:
使用Selenium套件的click()方法點擊登入按鈕如下:
# 定位帳號欄位 email = driver.find_element(By.ID, "email") # 定位密碼欄位 password = driver.find_element(By.ID, "pass") # 輸入帳號欄位資料 email.send_keys("你的帳號") # 輸入密碼欄位資料 password.send_keys("你的密碼") # 定位登入按鈕 login = driver.find_element(By.NAME, "login") # 點擊登入按鈕 login.click()
四、Selenium move_to_element()方法:移動滑鼠到特定元素上
有些網頁資料,會需要把滑鼠移動到元素上面,才會顯示詳細的資料訊息視窗,就像我們將滑鼠移動到Facebook網站的使用者名稱上面,會顯示使用者的資訊,如下圖:
使用者名稱的網頁原始碼為:
這時候就可以呼叫Selenium套件的move_to_element()方法,將滑鼠移動到使用者名稱元素上面,讓我們後續可以爬取使用者的資料,如下範例:
# 增加引用ActionChains模組 from selenium.webdriver.common.action_chains import ActionChains # 定位第一篇貼文的使用者名稱元素 first_post = driver.find_element(By.CSS_SELECTOR, "span[class='xt0psk2']") # 建立ActionChains物件 actionChains = ActionChains(driver) # 移動滑鼠到第一篇貼文的使用者名稱元素上(perform()為執行動作的意思) actionChains.move_to_element(first_post).perform() # 暫停10秒(觀察操作後的效果) time.sleep(10)
五、Selenium execute_script()方法:執行JavaScript程式碼
當網頁有Selenium套件無法操作的元素,需要利用JavaScript來操作的時候,就可以使用Selenium套件的execute_script()方法,來執行JavaScript程式碼。
假設登入Facebook網站後,想要滾動4次網頁捲軸,Selenium套件的execute_script()方法應用如下:
for x in range(4): # 滾動網頁捲軸 driver.execute_script("window.scrollTo(0,document.body.scrollHeight)") #滾動一次暫停5秒(這行可有可無) time.sleep(5)
六、小結
只要學會了上述Selenium套件的網頁操作方法,之後在遇到動態網頁的時候,我們就可以透過操作網頁上的元素,來爬取動態產生的資料,像是登入後的網頁資料、查詢後的統計資料、滾動網頁捲軸後動態載入的資料等。
留言
張貼留言