【python】selenium模擬瀏覽器

1、模塊介紹
selenium最初是一個(gè)自動(dòng)化測(cè)試工具,不過(guò)爬蟲(chóng)也經(jīng)常使用該模塊,主要是為了解決requests庫(kù)無(wú)法直接獲取js代碼渲染的數(shù)據(jù)的問(wèn)題。
selenium本質(zhì)是通過(guò)驅(qū)動(dòng)瀏覽器,完全模擬瀏覽器的動(dòng)作,可以支持多種瀏覽器。
使用selenium獲取到的頁(yè)面是所見(jiàn)即所得的,就是說(shuō)不止后臺(tái)返回的數(shù)據(jù)能獲取到,通過(guò)js渲染的數(shù)據(jù)也會(huì)獲取到。
selenium的性能怎么樣呢?親自測(cè)試,訪問(wèn)一個(gè)鏈接40次(進(jìn)程池=6),快的時(shí)候需要30秒左右,慢的時(shí)候需要180秒左右。
2、模塊安裝
這兒給出了linux arm, linux x86_64, windows環(huán)境安裝步驟,按自己情況進(jìn)行安裝。
2.1 Linux? armv7l安裝
我使用的樹(shù)莓派測(cè)試的sulenium模塊

pip3 install selenium==3.141.0

2.1.2 chromium瀏覽器安裝
sudo apt-get install chromium-browser ? ?# 這樣安裝是最新的瀏覽器
2.1.3 chromium-chromedriver驅(qū)動(dòng)安裝
sudo apt-get install chromium-chromedriver ? ?# 這樣安裝是最新的驅(qū)動(dòng)
一般瀏覽器和驅(qū)動(dòng)安裝最新的版本都會(huì)對(duì)應(yīng)上,如下圖都是92版本:

瀏覽器和瀏覽器驅(qū)動(dòng)版本一定要配套。比如,如果你用92版本的驅(qū)動(dòng)去啟動(dòng)86版本的瀏覽器,直接就會(huì)報(bào)錯(cuò)。如下圖所示:

2.2 Linux x86_64安裝
2.2.1 chrome browser下載安裝
樹(shù)莓派系統(tǒng)架構(gòu)是基于arm的,而現(xiàn)在很多軟件都是基于x86_64的或者windows的,如果你的機(jī)器架構(gòu)是x86_64或者windows的,網(wǎng)上很容易找找到安裝chrome+chromedriver的教程。
安裝最新穩(wěn)定版本的chrome瀏覽器:
yum install https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm
或者
wget https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm
yum install ./google-chrome-stable_current_x86_64.rpm
如果想安裝chrome歷史版本,從下方鏈接里找:
https://www.chromedownloads.net/chrome64linux-stable/
安裝好之后查看chrome browser版本
chrome --version
2.2.2 chromedriver驅(qū)動(dòng)下載安裝
下載后解壓會(huì)得到chromedirver二進(jìn)制文件,并添加a+x執(zhí)行權(quán)限,拷貝到/usr/local/bin或者/usr/bin目錄下
# 這兒注意下載驅(qū)動(dòng)版本,要和上面的瀏覽器版本保持一致
wget https://npm.taobao.org/mirrors/chromedriver/97.0.4692.36/chromedriver_linux64.zip
# 將zip解壓到當(dāng)前目錄chromedriver_linux64下
unzip -d ./chromedriver_linux64 chromedriver_linux64.zip
chmod a+x ./chromedriver_linux64/chromedriver
# 如果機(jī)器上本來(lái)就有驅(qū)動(dòng),備份下
if [ -f "/usr/local/bin/chromedriver" ]; then
? ?mv /usr/local/bin/chromedriver /usr/local/bin/chromedriver_old
fi
cp ./chromedriver_linux64/chromedriver /usr/local/bin
這兒附上兩個(gè)找不同版本驅(qū)動(dòng)的鏈接
官方下載鏈接:chromedriver.storage.googleapis.com/index.html
taobao下載鏈接: http://npm.taobao.org/mirrors/chromedriver
2.3 windows安裝
2.3.1 chrome browser下載安裝
https://www.chromedownloads.net/chrome64win/
2.3.2 chromdriver驅(qū)動(dòng)下載安裝
http://npm.taobao.org/mirrors/chromedriver
注意驅(qū)動(dòng)下載之后,要放到python安裝包的目錄下

3、模塊使用
舉一個(gè)例子:
from selenium import webdriver
if __name__ == "__main__":
? ?options = webdriver.ChromeOptions() ? ?# 實(shí)例化瀏覽器選項(xiàng)
? ?options.add_argument('--headless') ? ? ? # 添加無(wú)頭模式
? ?options.add_argument('ignore-certificate-errors') ? ?# 解決“您的鏈接不是私密鏈接”錯(cuò)誤
? ?driver = webdriver.Chrome(executable_path='/usr/lib/chromium-browser/chromedriver', options=options) ? ?# 啟動(dòng)chrome瀏覽器,executable_path指定的是驅(qū)動(dòng)路徑
? ?driver.get("http://www.baidu.com") ? ?# 訪問(wèn)百度首頁(yè)
? ?print(driver.page_source) ? ?# 獲取訪問(wèn)頁(yè)面的內(nèi)容
? ?driver.close() ? ?# 關(guān)閉瀏覽器
無(wú)頭模式:就是你不用可視化瀏覽器就可以訪問(wèn)url,不需要前臺(tái)展示。沒(méi)有頭嘛~
4、遇到的問(wèn)題
4.1 最常見(jiàn)的就是瀏覽器和驅(qū)動(dòng)版本不一致導(dǎo)致報(bào)錯(cuò),所以發(fā)生錯(cuò)誤的時(shí)候首先檢查自己下載的瀏覽器和驅(qū)動(dòng)版本。
4.2 在創(chuàng)建瀏覽器的時(shí)候,即webdriver.Chrome()這一步卡住了,不輸出任何東西,也不報(bào)錯(cuò)退出。
解決辦法:在/etc/hosts中添加一行:? 127.0.0.1 localhost。?
4.3 報(bào)錯(cuò):Message: Reached error page:about:neterror?e=proxyConnectFailure……
問(wèn)題原因:你訪問(wèn)的鏈接,瀏覽器打不開(kāi)。
解決辦法:檢查你的網(wǎng)絡(luò)是不是確實(shí)打不開(kāi)該網(wǎng)址。

以上知識(shí)如果理解有錯(cuò)誤,歡迎指出,共同學(xué)習(xí)。