如何爬取通過(guò)ajax加載數(shù)據(jù)的網(wǎng)站
目前很多網(wǎng)站都使用ajax技術(shù)動(dòng)態(tài)加載數(shù)據(jù),和常規(guī)的網(wǎng)站不一樣,數(shù)據(jù)時(shí)動(dòng)態(tài)加載的,如果我們使用常規(guī)的方法爬取網(wǎng)頁(yè),得到的只是一堆html代碼,沒(méi)有任何的數(shù)據(jù)。
請(qǐng)看下面的代碼:
url = 'https://www.toutiao.com/search/?keyword=美女' headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0"} response = requests.get(url,headers=headers) print(response.text)
上面的代碼是爬取今日頭條的一個(gè)網(wǎng)頁(yè),并打印出get方法返回的文本內(nèi)容如下圖所示,值現(xiàn)在一堆網(wǎng)頁(yè)代碼,并沒(méi)有相關(guān)的頭條新聞信息
內(nèi)容過(guò)多,只截取部分內(nèi)容,有興趣的朋友可以執(zhí)行上面的代碼看下效果。
對(duì)于使用ajax動(dòng)態(tài)加載數(shù)據(jù)的網(wǎng)頁(yè)要怎么爬取呢?我們先看下近日頭條是如何使用ajax加載數(shù)據(jù)的。通過(guò)chrome的開(kāi)發(fā)者工具來(lái)看數(shù)據(jù)加載過(guò)程。
首先打開(kāi)chrome瀏覽器,打開(kāi)開(kāi)發(fā)者工具,點(diǎn)擊Network選項(xiàng),點(diǎn)擊XHR選項(xiàng),然后輸入網(wǎng)址:https://www.toutiao.com/search/?keyword=美女 ,點(diǎn)擊Preview選項(xiàng)卡,就會(huì)看到通過(guò)ajax請(qǐng)求返回的數(shù)據(jù),Name那一欄就是ajax請(qǐng)求,當(dāng)鼠標(biāo)向下滑動(dòng)時(shí),就會(huì)出現(xiàn)多條ajax請(qǐng)求:
通過(guò)上圖我們知道ajax請(qǐng)求返回的是json數(shù)據(jù),我們繼續(xù)分析ajax請(qǐng)求返回的json數(shù)據(jù),點(diǎn)擊data展開(kāi)數(shù)據(jù),接著點(diǎn)擊0展開(kāi)數(shù)據(jù),發(fā)現(xiàn)有個(gè)title字段,內(nèi)容剛好和網(wǎng)頁(yè)的第一條數(shù)據(jù)匹配,可知這就是我們要爬取的數(shù)據(jù)。如下所示:
鼠標(biāo)向下滾動(dòng)到網(wǎng)頁(yè)底部時(shí)就會(huì)觸發(fā)一次ajax請(qǐng)求,下面是三次ajax請(qǐng)求:
觀察每個(gè)ajax請(qǐng)求,發(fā)現(xiàn)每個(gè)ajax請(qǐng)求都有offset,format,keyword,autoload,count,cur_tab,from,pd參數(shù),除了offset參數(shù)有變化之外,其他的都不變化。每次ajax請(qǐng)求offset的參數(shù)變化規(guī)律是0,20,40,60…,可以推測(cè)offset是偏移量,count參數(shù)是一次ajax請(qǐng)求返回?cái)?shù)據(jù)的條數(shù)。
為了防止爬蟲(chóng)被封,每次請(qǐng)求時(shí)要把請(qǐng)求時(shí)都要傳遞請(qǐng)求頭信息,請(qǐng)求頭信息中包含了瀏覽器的信息,如果請(qǐng)求沒(méi)有瀏覽器信息,就認(rèn)為是網(wǎng)絡(luò)爬蟲(chóng),直接拒絕訪問(wèn)。request header信息如下:
headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0", "referer": "https://www.toutiao.com/search/?keyword=%E7%BE%8E%E5%A5%B3", 'x-requested-with': 'XMLHttpRequest' }
完整代碼如下:
import requests from urllib.parse import urlencode def parse_ajax_web(offset): url = 'https://www.toutiao.com/search_content/?' #請(qǐng)求頭信息 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0", "referer": "https://www.toutiao.com/search/", 'x-requested-with': 'XMLHttpRequest' } #每個(gè)ajax請(qǐng)求要傳遞的參數(shù) parm = { 'offset': offset, 'format': 'json', 'keyword': '美女', 'autoload': 'true', 'count': 20, 'cur_tab': 1, 'from': 'search_tab', 'pd': 'synthesis' } #構(gòu)造ajax請(qǐng)求url ajax_url = url + urlencode(parm) #調(diào)用ajax請(qǐng)求 response = requests.get(ajax_url, headers=headers) #ajax請(qǐng)求返回的是json數(shù)據(jù),通過(guò)調(diào)用json()方法得到j(luò)son數(shù)據(jù) json = response.json() data = json.get('data') for item in data: if item.get('title') is not None: print(item.get('title')) def main(): #調(diào)用ajax的次數(shù),這里調(diào)用5次。 for offset in (range(0,5)): parse_ajax_web(offset*20) if __name__ == '__main__': main()
上面是爬取通過(guò)ajax請(qǐng)求加載數(shù)據(jù)網(wǎng)站的例子,如果想要其他的數(shù)據(jù),可以動(dòng)手自己寫(xiě),這里只是搭了一個(gè)架子,各位可以嘗試將數(shù)據(jù)寫(xiě)入到excel或者數(shù)據(jù)庫(kù)中。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 十個(gè)優(yōu)秀的Ajax/Javascript實(shí)例網(wǎng)站收集
- 編碼為GB2312網(wǎng)站讓AJAX接收的數(shù)據(jù)顯示支持中文
- php ajax網(wǎng)站瀏覽統(tǒng)計(jì)功能的簡(jiǎn)單實(shí)現(xiàn)
- PHP+Ajax 網(wǎng)站SEO查詢工具 提供代碼
- 爬取今日頭條Ajax請(qǐng)求
- ajax+node+request爬取網(wǎng)絡(luò)圖片的實(shí)例(宅男福利)
- 通過(guò)抓取淘寶評(píng)論為例講解Python爬取ajax動(dòng)態(tài)生成的數(shù)據(jù)(經(jīng)典)
相關(guān)文章
Python中np.percentile和df.quantile分位數(shù)詳解
分位數(shù)(Quantile)亦稱分位點(diǎn)是指將一個(gè)隨機(jī)變量的概率分布范圍分為幾個(gè)等份的數(shù)值點(diǎn),下面這篇文章主要給大家介紹了關(guān)于Python中np.percentile和df.quantile分位數(shù)的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-05-05Python標(biāo)準(zhǔn)庫(kù)shutil用法實(shí)例詳解
這篇文章主要介紹了Python標(biāo)準(zhǔn)庫(kù)shutil用法,結(jié)合實(shí)例形式分析了shutil庫(kù)針對(duì)文件與文件夾各種常見(jiàn)操作技巧與相關(guān)使用注意事項(xiàng),需要的朋友可以參考下2018-08-08python使用knn實(shí)現(xiàn)特征向量分類
這篇文章主要為大家詳細(xì)介紹了python使用knn實(shí)現(xiàn)特征向量分類,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-12-12python elasticsearch從創(chuàng)建索引到寫(xiě)入數(shù)據(jù)的全過(guò)程
這篇文章主要介紹了python elasticsearch從創(chuàng)建索引到寫(xiě)入數(shù)據(jù)的方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-08-08python如何使用pywebview打造一個(gè)現(xiàn)代化的可視化GUI界面詳解
pywebview是一個(gè)輕量級(jí)的跨平臺(tái)庫(kù),它可以讓你在Python程序中嵌入一個(gè)瀏覽器窗口,下面這篇文章主要給大家介紹了關(guān)于python如何使用pywebview打造一個(gè)現(xiàn)代化的可視化GUI界面的相關(guān)資料,需要的朋友可以參考下2024-07-07解決python3 json數(shù)據(jù)包含中文的讀寫(xiě)問(wèn)題
今天小編就為大家分享一篇解決python3 json數(shù)據(jù)包含中文的讀寫(xiě)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-05-05python生成多個(gè)只含0,1元素的隨機(jī)數(shù)組或列表的實(shí)例
今天小編就為大家分享一篇python生成多個(gè)只含0,1元素的隨機(jī)數(shù)組或列表的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-11-11Python中reduce()函數(shù)的語(yǔ)法參數(shù)與作用詳解
這篇文章主要介紹了Python中reduce()函數(shù)的語(yǔ)法參數(shù)與作用詳解,reduce函數(shù)是通過(guò)函數(shù)對(duì)迭代器對(duì)象中的元素進(jìn)行遍歷操作,Python3.x中reduce函數(shù)已經(jīng)從內(nèi)置函數(shù)中取消了,轉(zhuǎn)而放在functools模塊中,需要的朋友可以參考下2023-08-08