前提
除了在網(wǎng)頁中使用接口外,還有的網(wǎng)站會在頁面中使用大量的 函數(shù)進行頁面的各種交互和數(shù)據(jù)生成。這樣的網(wǎng)站或者數(shù)據(jù),我們在瀏覽器控制的“”選項卡中是找不到相關(guān)的接口的。那么該怎么辦呢?
我們可以使用一個 Web 的自動化測試工具—— 來調(diào)用真實的瀏覽器內(nèi)核來進行數(shù)據(jù)采集。
是一個瀏覽器自動化測試框架,其能夠調(diào)用相關(guān)的接口來運行瀏覽器并執(zhí)行一系列的動作,就像是真正的用戶在網(wǎng)頁上操作一樣。 最初多用于 Web 應(yīng)用的功能測試中,后來因為其能夠調(diào)用瀏覽器的特性,能夠繞過很多的反爬蟲機制,日益在爬蟲領(lǐng)域流行開來。
一個完整的 由兩部分組成:
其中,負責(zé)接收程序的指令和操作js如何判斷瀏覽器是否是ie, 負責(zé)具體的瀏覽器動作的執(zhí)行。
安裝
pip install selenium
下載安裝
在 中,我們通常有四種瀏覽器驅(qū)動方案:
查看谷歌版本
鏡像地址:
找到對應(yīng)版本后下載對應(yīng)版本的。
win下載這個
下載后,壓縮包內(nèi)系統(tǒng)下為exe文件,下為elf文件,將壓縮包內(nèi)的可執(zhí)行文件放在你自己知道的一個任意目錄下。
這樣我們的就已經(jīng)下載完成了,在中使用API指定相關(guān)路徑,就可以進行自動化測試了。
引入 和實例化一個瀏覽器引擎
# coding:utf-8
from selenium import webdriver
# 引入 selenium 和實例化一個瀏覽器引擎
driver = webdriver.Chrome(executable_path=r"E:\wwwroot\python\PyTest\test\chromedriver.exe")
打開一個網(wǎng)頁
driver.get('http://www.baidu.com')
元素定位
在 + 的模式中,我們一般使用 css 選擇器和 find()方法來進行元素的地位
和解析,而在 中,我們有七種方式對元素進行定位:
獲取元素值
在定位到元素之后,我們需要獲取相應(yīng)元素的文本值或者是屬性值。在 中可以使用 text
屬性獲取元素的文本值,使用 ()方法獲取元素的屬性值。
保存頁面代碼供
除了直接使用 定位元素的方法和獲取值的方法外,我們可以將 打開后的網(wǎng)頁
保存為源碼,再將其傳輸給 用于元素定位和文本解析。
中將網(wǎng)頁保存為源碼的方法為 :
wbdata = driver.page_source
示例:
# coding:utf-8
from selenium import webdriver
from bs4 import BeautifulSoup
driver = webdriver.Chrome(executable_path=r"E:\wwwroot\python\PyTest\test\chromedriver.exe")
driver.get('http://www.toutiao.com')
wbdata = driver.page_source
soup = BeautifulSoup(wbdata,'lxml')
img_news = soup.select('div.bui-box > div.bui-left > div.bui-box > ul.slide-list.bui-
left > li > a')
for i in img_news:

print(i.get_text())
表單輸入與點擊事件
一些網(wǎng)頁,我們需要輸入表單之后才能獲取結(jié)果。在 中,我們可以先定位到表單元素,
然后使用 ()方法,在表單中輸入文本,然后使用 click()方法或者 ()方法進行提
交。
下面我們以百度搜索為例,使用 輸入關(guān)鍵詞“臭大佬”并進行搜索:
# coding:utf-8
from selenium import webdriver
import time
# 引入 selenium 和實例化一個瀏覽器引擎
driver = webdriver.Chrome(executable_path=r"E:\wwwroot\python\PyTest\test\chromedriver.exe")
# 打開首頁
driver.get('http://www.baidu.com')
# 定位搜索框
inputs = driver.find_element_by_id('kw')
# 在搜索框中輸入文本
inputs.send_keys('臭大佬')
# 定位"百度一下"搜索按鈕
search = driver.find_element_by_id('su')
# 點擊搜索按鈕
search.click()
# 等待 5 秒
time.sleep(5)

# 進行屏幕截屏
driver.save_screenshot('search_choudalao.jpg')
切換框架() 和窗口
在 html 中, 標簽用來創(chuàng)建一個包含在網(wǎng)頁文檔中的另一個文檔框架,在 中可以自
定義 html 的頁面、樣式和內(nèi)容。
默認情況下js如何判斷瀏覽器是否是ie, 打開和操作的都是最外層的框架,如果我們需要提取的內(nèi)容或是需要輸入
的表單以及點擊的按鈕存在于子框架()中,我們就需要先切換定位在子框架上。
另一個情況就是,某些鏈接點擊之后會新建一個窗口,新的內(nèi)容出現(xiàn)在新的窗口上,這時候我們
也需要將窗口切換到新的窗口中。
在 中,我們可以使用 來對框架和窗口進行切換:
執(zhí)行 js 代碼
在某些特殊情況下,我們的點擊按鈕或是其他瀏覽器行為使用 的內(nèi)置方法操作不了(比
如 引擎不支持非 元素的點擊事件),那么可以執(zhí)行 JS 代碼來對瀏覽器進行
操作。
在 中執(zhí)行 js 代碼的方法為:()
driver.execute_script(js 代碼)
在linux中安裝使用中
如果是寶塔環(huán)境,默認是的,運行如下命令,安裝獨立版,這種情況下,后面的所有和pip命令都要變成和pip3
curl https://download.bt.cn/install/update_panel.sh|bash
python3 -V
pip3 install selenium
下載谷歌瀏覽器
yum install https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm
這個命令是下載安裝最新的穩(wěn)定的版本,不是固定的版本,所以要注意下載時要對應(yīng)版本
我是在本地win10系統(tǒng)又下了一遍,由于無法解壓,為此我還特意下載了個360解壓,解壓可以看到版本是95.0.4638.69
安裝依賴庫
yum install pango.x86_64 libXcomposite.x86_64 libXcursor.x86_64 libXdamage.x86_64 libXext.x86_64 libXi.x86_64 libXtst.x86_64 cups-libs.x86_64 libXScrnSaver.x86_64 libXrandr.x86_64 GConf2.x86_64 alsa-lib.x86_64 atk.x86_64 gtk3.x86_64 -y
安裝(驅(qū)動程序)
打開鏈接: , 我剛才版本是95.0.4638.69,找到自己對應(yīng)的版本.
進入到目錄中,下載linux版本,
wget http://chromedriver.storage.googleapis.com/95.0.4638.69/chromedriver_linux64.zip
解壓
unzip chromedriver_linux64.zip
給予運行權(quán)限
chmod +x chromedriver

放到環(huán)境變量PATH路徑中
cp chromedriver /usr/bin/
查看的版本
chromedriver --version
測試
進行腳本測試(1.py)
#coding:utf-8
from selenium import webdriver
ch_options = webdriver.ChromeOptions()
# 為Chrome配置無頭模式
ch_options.add_argument("--headless")
ch_options.add_argument('--no-sandbox')
ch_options.add_argument('--disable-gpu')
ch_options.add_argument('--disable-dev-shm-usage')
# 在啟動瀏覽器時加入配置
dr = webdriver.Chrome(options=ch_options)
# 這是測試網(wǎng)站
url = "https://www.baidu.com"
dr.get(url)
# 打印源碼
print(dr.page_source)
能打印頁面說明就成功了