怎樣爬取通過ajax加載數(shù)據(jù)的網(wǎng)站-創(chuàng)新互聯(lián)

小編給大家分享一下怎樣爬取通過ajax加載數(shù)據(jù)的網(wǎng)站,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

成都創(chuàng)新互聯(lián)是一家專注于成都網(wǎng)站設計、成都網(wǎng)站建設、外貿(mào)網(wǎng)站建設與策劃設計,滄源網(wǎng)站建設哪家好?成都創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設十余年,網(wǎng)設計領域的專業(yè)建站公司;建站業(yè)務涵蓋:滄源等地區(qū)。滄源做網(wǎng)站價格咨詢:028-86922220

目前很多網(wǎng)站都使用ajax技術動態(tài)加載數(shù)據(jù),和常規(guī)的網(wǎng)站不一樣,數(shù)據(jù)時動態(tài)加載的,如果我們使用常規(guī)的方法爬取網(wǎng)頁,得到的只是一堆html代碼,沒有任何的數(shù)據(jù)。

請看下面的代碼:

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)

上面的代碼是爬取今日頭條的一個網(wǎng)頁,并打印出get方法返回的文本內(nèi)容如下圖所示,值現(xiàn)在一堆網(wǎng)頁代碼,并沒有相關的頭條新聞信息

怎樣爬取通過ajax加載數(shù)據(jù)的網(wǎng)站

內(nèi)容過多,只截取部分內(nèi)容,有興趣的朋友可以執(zhí)行上面的代碼看下效果。

對于使用ajax動態(tài)加載數(shù)據(jù)的網(wǎng)頁要怎么爬取呢?我們先看下近日頭條是如何使用ajax加載數(shù)據(jù)的。通過chrome的開發(fā)者工具來看數(shù)據(jù)加載過程。

首先打開chrome瀏覽器,打開開發(fā)者工具,點擊Network選項,點擊XHR選項,然后輸入網(wǎng)址:https://www.toutiao.com/search/?keyword=美女  ,點擊Preview選項卡,就會看到通過ajax請求返回的數(shù)據(jù),Name那一欄就是ajax請求,當鼠標向下滑動時,就會出現(xiàn)多條ajax請求:

怎樣爬取通過ajax加載數(shù)據(jù)的網(wǎng)站

通過上圖我們知道ajax請求返回的是json數(shù)據(jù),我們繼續(xù)分析ajax請求返回的json數(shù)據(jù),點擊data展開數(shù)據(jù),接著點擊0展開數(shù)據(jù),發(fā)現(xiàn)有個title字段,內(nèi)容剛好和網(wǎng)頁的第一條數(shù)據(jù)匹配,可知這就是我們要爬取的數(shù)據(jù)。如下所示:

怎樣爬取通過ajax加載數(shù)據(jù)的網(wǎng)站

鼠標向下滾動到網(wǎng)頁底部時就會觸發(fā)一次ajax請求,下面是三次ajax請求:

https://www.toutiao.com/search_content/?offset=0&format=json&keyword=%E7%BE%8E%E5%A5%B3&autoload=true&count=20&cur_tab=1&from=search_tab&pd=synthesis
https://www.toutiao.com/search_content/?offset=20&format=json&keyword=%E7%BE%8E%E5%A5%B3&autoload=true&count=20&cur_tab=1&from=search_tab&pd=synthesis
https://www.toutiao.com/search_content/?offset=40&format=json&keyword=%E7%BE%8E%E5%A5%B3&autoload=true&count=20&cur_tab=1&from=search_tab&pd=synthesis

觀察每個ajax請求,發(fā)現(xiàn)每個ajax請求都有offset,format,keyword,autoload,count,cur_tab,from,pd參數(shù),除了offset參數(shù)有變化之外,其他的都不變化。每次ajax請求offset的參數(shù)變化規(guī)律是0,20,40,60…,可以推測offset是偏移量,count參數(shù)是一次ajax請求返回數(shù)據(jù)的條數(shù)。

為了防止爬蟲被封,每次請求時要把請求時都要傳遞請求頭信息,請求頭信息中包含了瀏覽器的信息,如果請求沒有瀏覽器信息,就認為是網(wǎng)絡爬蟲,直接拒絕訪問。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/?'
  #請求頭信息
  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'
  }
  #每個ajax請求要傳遞的參數(shù)
  parm = {
    'offset': offset,
    'format': 'json',
    'keyword': '美女',
    'autoload': 'true',
    'count': 20,
    'cur_tab': 1,
    'from': 'search_tab',
    'pd': 'synthesis'
  }
  #構造ajax請求url
  ajax_url = url + urlencode(parm)
  #調(diào)用ajax請求
  response = requests.get(ajax_url, headers=headers)
  #ajax請求返回的是json數(shù)據(jù),通過調(diào)用json()方法得到json數(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()

以上是“怎樣爬取通過ajax加載數(shù)據(jù)的網(wǎng)站”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學習更多知識,歡迎關注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

本文題目:怎樣爬取通過ajax加載數(shù)據(jù)的網(wǎng)站-創(chuàng)新互聯(lián)
當前URL:http://muchs.cn/article22/dhgijc.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站排名、建站公司、小程序開發(fā)、靜態(tài)網(wǎng)站網(wǎng)頁設計公司全網(wǎng)營銷推廣

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都做網(wǎng)站