靜態(tài)頁面的爬取相對來說比較容易,通過請求獲取到靜態(tài)頁面資源進行解析就可以拿到我們想要的帜羊,但很多網(wǎng)站通常會用到Ajax和動態(tài)HTML技術,因而只是使用基于靜態(tài)頁面爬取的方法是行不通的寥院。
對于動態(tài)頁面信息的爬取欠橘,一般分為兩種方法:
1.一種是直接從異步請求中采集數(shù)據(jù)、需要自己去手動分析異步請求的規(guī)律赞季,然后模擬出對應的請求進行采集
2.另一種是直接通過selenium+webdriver從瀏覽器中采集已經(jīng)加載好的數(shù)據(jù)
因為有些網(wǎng)站是通過js代碼動態(tài)生成的內(nèi)容比如搜索引擎
所有異步請求中根本沒有返回json等可以識別的數(shù)據(jù)包愧捕,很顯然采用了動態(tài)HTML技術
我們只能通過selenium和webdriver來模擬瀏覽器行為來進行采集
準備工作
1.python環(huán)境3.x
2.安裝selenium依賴
3.下載webdriver(本文以Chrome瀏覽器的driver為例)
以上環(huán)境安裝不再贅述
模擬瀏覽器
我們來爬取百度搜索"hello"的查詢結果
1.加載瀏覽器
driver = webdriver.Chrome("C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe")
2.打開百度首頁
driver.get("http://www.baidu.com")
3.輸入hello并點擊提交
driver.find_element_by_id('kw').send_keys('hello')
driver.find_element_by_id('kw').submit()
4.根據(jù)xpath提取內(nèi)容
shopName = driver.find_element_by_xpath(".//*[@id='"+str(i)+"']/h3/a").text
print( shopName)
完整代碼
from selenium import webdriver
import time
# 將控制的webdriver的Firefox賦值給driver;獲得了瀏覽器對象才可以啟動瀏覽器碟摆,打開網(wǎng)址,操作頁面
driver = webdriver.Chrome("C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe")
# 獲得瀏覽器對象后叨橱,通過get()方法典蜕,可以向瀏覽器發(fā)送網(wǎng)址
driver.get("http://www.baidu.com")
#等待打開網(wǎng)頁2S
time.sleep(2)
# 這里通過 id = kw 定位到搜索框,并通過鍵盤方法send_keys向輸入框里輸入'hello'并提交
driver.find_element_by_id('kw').send_keys('hello')
driver.find_element_by_id('kw').submit()
time.sleep(3)
# 循環(huán)采集內(nèi)容
for i in range(1,12):
try:
shopName = driver.find_element_by_xpath(".//*[@id='"+str(i)+"']/h3/a").text
print( shopName)
except:
h=1
#采集完成關閉瀏覽器
driver.close()
最后
理論上來講罗洗,這種方法可以應對各種動態(tài)加載愉舔,因為模擬人對瀏覽器行為,所以一些登錄什么的都可以進行模擬伙菜,模擬的核心在于selenium
Selenium是一種自動化測試工具轩缤,Selenium 測試直接在瀏覽器中運行,就像真實用戶所做的一樣。Selenium 測試可以在 Windows火的、Linux 和 Macintosh上的 Internet Explorer壶愤、Chrome和 Firefox 中運行。其他測試工具都不能覆蓋如此多的平臺馏鹤。
上述方式有兩個缺點:
1.每次執(zhí)行都要打開桌面上的Chrome瀏覽器(自動化測試需要)
2.瀏覽器的各個操作步驟都需要sleep幾秒進行等待征椒,效率低
解決這兩個問題的具體辦法可以參考這篇爬取動態(tài)網(wǎng)頁python+Web kit