Python爬蟲 使用selenium處理動態網頁


對於靜態網頁,使用requests等庫可以很方便的得到它的網頁源碼,然后提取出想要的信息。但是對於動態網頁,情況就要復雜很多,這種頁面的源碼往往只有一個框架,其內容都是由JavaScript渲染出來的。這時候,我們就可以使用selenium來直接驅動瀏覽器進行爬取。

selenium是一個自動化測試工具,利用它可以驅動瀏覽器進行一系列操作,並且可以得到當前呈現的網頁的源碼,對動態頁面的爬取非常有效。下面來說一下selenium的簡單使用。

一、安裝

1. selenium

推薦使用pip直接安裝:

pip install selenium

2. ChromeDriver

selenium是一個自動化測試工具,需要配合瀏覽器驅動來使用,以Chrome為例,首先需要下載自己瀏覽器對應版本的驅動。版本對照可以到chromedriver與chrome版本映射表查看。另外Chrome版本70以上的可以直接到ChromeDriverMirror根據瀏覽器版本下載。

在這里插入圖片描述

下載完成后需要將可執行文件配置到環境變量里,Windows系統可以將chromedriver.exe文件直接拖到python環境的scripts目錄下,也可以將其所在路徑配置到系統環境變量,Linux系統下可以將可執行文件移動到環境變量目錄中:sudo mv chromedriver /usr/bin

配置完成后,在命令行直接輸入 chromedriver 如果有如下輸出,則環境配置成功:

在這里插入圖片描述

二、使用

1. 聲明瀏覽器對象

from selenium import webdriver
chrome = webdriver.Chrome()

這樣初始化之后在使用它進行瀏覽器操作時會彈出瀏覽器界面直到關閉,顯然一般情況下我們是希望它默默地在后台干活而不彈出任何界面的,所以還需要設置chrome的無界面模式(老版本可能不支持):

from selenium.webdriver.chrome.options import Options

chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
chrome = webdriver.Chrome(chrome_options=chrome_options)

2. 訪問頁面

訪問頁面使用get函數傳入url即可:

chrome.get('https://www.baidu.com')
print(chrome.page_source)	# 輸出當前頁面源碼

3. 查找節點

用get方法打開一個頁面以后就可以用page_source方法獲得它的源碼進而使用BeautifulSoup等庫進行解析,不過selenium已經提供了對節點進行操作的一系列方法,就不用再額外使用解析庫了。
對於id,class等常見屬性的節點可以通過find_element_by_id這樣的方法獲得,獲取單個節點的方法有:

find_element_by_tag_name()
find_element_by_id()
find_element_by_name()
find_element_by_class_name()

另外還有查找節點的通用方法 find_element(屬性名, 值) ,可以很靈活的查找自定義屬性的節點。以上方法都是獲取單個節點的方法,如果頁面中有多個符合條件的節點則只能返回第一個結果,如果想找到所有符合條件的節點,只需要將方法中的 element 改為 elements 即可,這將返回一個節點列表。

4. 獲取節點信息

定位到某個節點之后就可以使用get_attribute('屬性名')方法獲取它的屬性信息,獲取節點內容可以使用.txt方法:

node = chrome.find_element_by_id('kw')
print(node.get_attribute('class'))
print(node.text)

5. 節點交互

selenium提供了對節點的一系列操作方法,比如向輸入框填入內容:

input = chrome.find_element_by_id('kw')
input.send_keys('python')	# 填入內容
input.clear()	# 清空輸入
input.send_keys('zzu')

點擊指定按鈕:

button = chrome.find_element_by_id('su')
button.click()

6. 延時等待

打開一個頁面時可能會由於網絡問題或者頁面需要加載很多動態信息從而導致立即對頁面進行操作時發生錯誤,所以最好在打開頁面后等待一段時間再進行操作,最簡單的等待方式是使用time庫:

import time
time.sleep(3)

顯然這種方式是很不靈活的,大多數頁面都可以很快的加載出來,這樣的固定延時就會浪費很多時間。更好的方法是使用WebDriverWait類,用一個瀏覽器對象和一個最大等待時間初始化之后再調用until方法,傳入等待完成的條件,最大等待時間內條件滿足則立即結束等待,否則拋出異常,例如:

from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait

# 5秒內id為content_left的節點出現則結束等待,否則拋出異常
WebDriverWait(chrome, 5).until(EC.presence_of_element_located(('id', 'content_left')))

完整的等待條件可以查看官方文檔

7. 執行JavaScript代碼

selenium提供了直接運行JavaScript代碼的方法 excute_script ,對於selenium沒有提供的動作都可以通過執行JavaScript代碼來實現,比如下拉進度條以加載更多內容:

# 下拉進度條到最底部
chrome.execute_script('window.scrollTo(0, document.body.scrollHeight)')
chrome.execute_script('alert("to bottom")')


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM