不使用selenium插件如何抓取網(wǎng)頁的動(dòng)態(tài)加載數(shù)據(jù),針對(duì)這個(gè)問題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問題的小伙伴找到更簡(jiǎn)單易行的方法。
網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)建站!專注于網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、小程序定制開發(fā)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了高臺(tái)免費(fèi)建站歡迎大家使用!
下面講的是不使用selenium插件模擬瀏覽器,如何獲得網(wǎng)頁上的動(dòng)態(tài)加載數(shù)據(jù)。
步驟如下:
一、找到正確的URL。
二、填寫URL對(duì)應(yīng)的參數(shù)。
三、參數(shù)轉(zhuǎn)化為urllib可識(shí)別的字符串data。
四、初始化Request對(duì)象。
五、urlopen這個(gè)Request對(duì)象,獲得數(shù)據(jù)。
url='http://www.*****.*****/*********'
formdata = {'year': year,
'month': month,
'day': day
}
data = urllib.urlencode(formdata)
request=urllib2.Request(url,data = data) #如果URL不帶參數(shù)就是request=urllib2.Request(url)
r = urllib2.urlopen(request)
html=r.read() # html就是你要的數(shù)據(jù),可能是html格式,也可能是json,或去他格式
后面步驟都是相同的,關(guān)鍵在于如何獲得URL和參數(shù)。我們以新冠肺炎的疫情統(tǒng)計(jì)網(wǎng)頁為例(https://news.qq.com/zt2020/page/feiyan.htm#/)。
如果直接抓瀏覽器的網(wǎng)址,你會(huì)看見一個(gè)沒有數(shù)據(jù)內(nèi)容的html,里面只有標(biāo)題、欄目名稱之類的,沒有累計(jì)確診、累計(jì)死亡等等的數(shù)據(jù)。因?yàn)檫@個(gè)頁面的數(shù)據(jù)是動(dòng)態(tài)加載上去的,不是靜態(tài)的html頁面。需要按照我上面寫的步驟來獲取數(shù)據(jù),關(guān)鍵是獲得URL和對(duì)應(yīng)參數(shù)formdata。下面以火狐瀏覽器講講如何獲得這兩個(gè)數(shù)據(jù)。
肺炎頁面右鍵,出現(xiàn)的菜單選擇檢查元素。
點(diǎn)擊上圖紅色箭頭網(wǎng)絡(luò)選項(xiàng),然后刷新頁面。如下,
這里會(huì)出現(xiàn)很多網(wǎng)絡(luò)傳輸記錄,觀察最右側(cè)紅框“大小”那列,這列表示這個(gè)http請(qǐng)求傳輸?shù)臄?shù)據(jù)量大小,動(dòng)態(tài)加載的數(shù)據(jù)一般數(shù)據(jù)量會(huì)比其它頁面元素的傳輸大,119kb相比其它按字節(jié)計(jì)算的算是很大的數(shù)據(jù)了,當(dāng)然網(wǎng)頁的裝飾圖片有的也很大,這個(gè)需要按照文件類型那列來甄別。
然后點(diǎn)擊域名列對(duì)應(yīng)那行,如下
可以在消息頭中看見請(qǐng)求網(wǎng)址,這個(gè)就是url,點(diǎn)擊參數(shù)可以看見url對(duì)應(yīng)的參數(shù)
https://view.inews.qq.com/g2/getOnsInfo?name=disease_h6&callback=jQuery341004532487105727312_1584498763134&_=1584498763135
可以看到url的尾部?后面已經(jīng)把參數(shù)寫上了。
我們?nèi)绻褂脦?shù)的URL,那么就
request=urllib2.Request(url),不加data參數(shù)。
如果使用request=urllib2.Request(url,data = data)
那么url="https://view.inews.qq.com/g2/getOnsInfo"
formdata = {'name': 'disease_h6',
'callback': '',
'_': 當(dāng)前時(shí)間戳
}
name是disease_h6,callback是頁面回調(diào)函數(shù),我們不需要有回調(diào)動(dòng)作,所以設(shè)置為空,_對(duì)應(yīng)的是時(shí)間戳(Python很容易獲得時(shí)間戳的),因?yàn)椴樵兎窝谆颊邤?shù)量和時(shí)間是緊密相關(guān)的。
如果都寫在一個(gè)url中是下面形式的
url='https://view.inews.qq.com/g2/getOnsInfo?name=disease_h6&callback=&_=%d'%int(stamp*1000)
按照這個(gè)思路就可以獲得疫情數(shù)據(jù)了。兩種方案任你選擇。
找url和參數(shù)是一項(xiàng)需要耐心,需要一定的分析能力的,才能正確甄別url和參數(shù)的含義,進(jìn)行正確的編程實(shí)現(xiàn)。參數(shù)是否可以空,是否可以硬編碼寫死,是否有特殊要求,其實(shí)是一個(gè)很考驗(yàn)經(jīng)驗(yàn)的事情。
有的url很簡(jiǎn)單,返回一個(gè).dat文件,里面直接就是json格式的數(shù)據(jù),這種是最友好的了。有的需要你設(shè)置大量參數(shù),才能獲得,而且獲得的是html格式的,需要解析才能提取數(shù)據(jù)。
關(guān)于不使用selenium插件如何抓取網(wǎng)頁的動(dòng)態(tài)加載數(shù)據(jù)問題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識(shí)。