很多新手在遇到動態網頁的時候,都會不知所措,因為它需要額外的網頁操作,像是會員登入、滾動網頁卷軸、點擊按鈕等等,才有辦法爬取到網頁資料。
今天這篇文章我就用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套件的網頁操作方法,之後在遇到動態網頁的時候,我們就可以透過操作網頁上的元素,來爬取動態產生的資料,像是登入後的網頁資料、查詢後的統計資料、滾動網頁捲軸後動態載入的資料等。









留言
張貼留言