?動(dòng)態(tài)網(wǎng)頁(yè)指幾種可能:
1)需要用戶交互食呻,如常見(jiàn)的登錄操作售担;
2)網(wǎng)頁(yè)通過(guò)JS/ AJAX動(dòng)態(tài)生成勇吊,如一個(gè)html里有<div id="test"></div>蜂科,通過(guò)JS生成<div id="test"><span>aaa</span></div>顽决;
3)點(diǎn)擊輸入關(guān)鍵字后進(jìn)行查詢,而瀏覽器url地址不變
?本篇文章不借助任何外部工具导匣,實(shí)例操作如何以觀察網(wǎng)絡(luò)通信的方法解析動(dòng)態(tài)網(wǎng)頁(yè)才菠。
?環(huán)境:Win10 , python2.7,scrapy 1.4.0贡定,Chrome瀏覽器赋访,F(xiàn)irefox瀏覽器
1、觀察是否為動(dòng)態(tài)網(wǎng)頁(yè)
以華盛頓郵報(bào)為例,搜索關(guān)鍵詞 French 蚓耽,搜索到的結(jié)果如下:
該網(wǎng)頁(yè)的url 為https://www.washingtonpost.com/newssearch/?datefilter=All%20Since%202005&query=French&sort=Relevance&utm_term=.3570cb8c6dcf
?F12打開(kāi)控制臺(tái)渠牲,在Element下找到想要獲得的搜索列表數(shù)據(jù)所在的section標(biāo)簽”main-content”
然后轉(zhuǎn)到Network的Doc標(biāo)簽,重新加載當(dāng)前網(wǎng)頁(yè)步悠,在Name下點(diǎn)擊第一個(gè)文件嘱兼,在右邊的Preview下尋找相應(yīng)的section id 為 “main-content”的元素,發(fā)現(xiàn)沒(méi)有數(shù)據(jù):
說(shuō)明該內(nèi)容為動(dòng)態(tài)加載
2贤徒、獲得JS點(diǎn)擊動(dòng)作發(fā)出的請(qǐng)求url
在JS標(biāo)簽下尋找真正存放數(shù)據(jù)的網(wǎng)頁(yè)芹壕,點(diǎn)擊Name下的文件觀察右側(cè)的Preview有沒(méi)有數(shù)據(jù),存放數(shù)據(jù)的網(wǎng)頁(yè)才是我們真正需要爬取的網(wǎng)頁(yè):
一個(gè)小技巧:一般動(dòng)態(tài)加載的數(shù)據(jù)都以json形式存儲(chǔ)接奈,在Filter里填json過(guò)濾踢涌,可以更加快速地尋找到想要的文件,但不是所有的網(wǎng)站都適用序宦,還是需要在JS或XHR里手動(dòng)尋找所需文件睁壁。
復(fù)制當(dāng)前文件的鏈接,得到一個(gè)很長(zhǎng)的url:
在瀏覽器中打開(kāi)這個(gè)地址互捌,發(fā)現(xiàn)這是一個(gè)json文件潘明,但是該url太過(guò)冗長(zhǎng),我們可以根據(jù)需要適當(dāng)?shù)貏h減一些參數(shù)秕噪,這些參數(shù)可以在Headers下得到:
選擇保留count,datefilter,query三個(gè)參數(shù)钳降,注意,必須保證刪減參數(shù)后的網(wǎng)頁(yè)與原url獲得的json數(shù)據(jù)一樣腌巾,精簡(jiǎn)后的url為:
在火狐瀏覽器中打開(kāi)該url(選擇火狐瀏覽器打開(kāi)是因?yàn)閖son數(shù)據(jù)顯示友好)遂填,獲得的頁(yè)面如下:
3、提取json數(shù)據(jù)
根據(jù)以上json文件的結(jié)構(gòu)澈蝙,我們可以用json.loads函數(shù)進(jìn)一步提取想要的數(shù)據(jù):
4吓坚、翻頁(yè)機(jī)制
在網(wǎng)頁(yè)上進(jìn)行操作,觀察url的參數(shù)變化規(guī)律:
第一頁(yè):
第二頁(yè):
第三頁(yè):
發(fā)現(xiàn)每一頁(yè)的url變化都是由多出來(lái)的startat這個(gè)參數(shù)導(dǎo)致的灯荧,解析下一頁(yè)只需要每次讓startat的值增加20礁击,在url后添加該參數(shù)即可,如第二頁(yè):
最后根據(jù)新聞總數(shù)來(lái)計(jì)算出最后一頁(yè)的startat值即可
5逗载、解析以表單形式提交參數(shù)的動(dòng)態(tài)網(wǎng)頁(yè)
有的網(wǎng)站輸入關(guān)鍵字后進(jìn)行查詢哆窿,而瀏覽器url地址不變,有可能是以表單形式提交Request參數(shù)撕贞。
以蘋果日?qǐng)?bào)為例更耻,關(guān)鍵字搜索“法國(guó)”,url中卻沒(méi)有類似“?q=法國(guó)”的參數(shù)
再次加載該url捏膨,發(fā)現(xiàn)其定位在一個(gè)單獨(dú)的搜索頁(yè)面:
分析搜索的結(jié)果秧均,發(fā)現(xiàn)該參數(shù)是以表單的方式提交的:
根據(jù)input 的參數(shù)填充FormRequest:
返回的response就可以用xpath正常解析網(wǎng)頁(yè)了: