一塊兒學爬蟲——如何爬取經過ajax加載數據的網站

  一塊兒學爬蟲——如何爬取經過ajax加載數據的網站
  
  目前不少網站都使用ajax技術動態加載數據,和常規的網站不同,數據時動態加載的,若是咱們使用常規的方法爬取網頁,獲得的只是一堆html代碼,沒有任何的數據。
  
  請看下面的代碼
  
  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)
  
  上面的代碼是爬取今日頭條的一個網頁,並打印出get方法返回的文本內容以下圖所示,值如今一堆網頁代碼,並無相關的頭條新聞信息
  
  python ajax
  
  內容過多,只截取部份內容,有興趣的朋友能夠執行上面的代碼看下效果。
  
  對於使用ajax動態加載數據的網頁要怎麼爬取呢?咱們先看下近日頭條是如何使用ajax加載數據的。經過chrome的開發者工具來看數據加載過程。
  
  首先打開chrome瀏覽器,打開開發者工具,點擊Network選項,點擊XHR選項,而後輸入網址:https://www.toutiao.com/search/?keyword=美女 ,點擊Preview選項卡,就會看到經過ajax請求返回的數據,Name那一欄就是ajax請求,當鼠標向下滑動時,就會出現多條ajax請求:
  
  python ajax
  
  經過上圖咱們知道ajax請求返回的是json數據,咱們繼續分析ajax請求返回的json數據,點擊data展開數據,接着點擊0展開數據,發現有個title字段,內容恰好和網頁的第一條數據匹配,可知這就是咱們要爬取的數據。以下所示:
  
  python ajax
  
  鼠標向下滾動到網頁底部時就會觸發一次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請求,發現每一個ajax請求都有offset,format,keyword,autoload,count,cur_tab,from,pd參數,除了offset參數有變化以外,其餘的都不變化。每次ajax請求offset的參數變化規律是0,20,40,60...,能夠推測offset是偏移量,count參數是一次ajax請求返回數據的條數。
  
  爲了防止爬蟲被封,每次請求時要把請求時都要傳遞請求頭信息,請求頭信息中包含了瀏覽器的信息,若是請求沒有瀏覽器信息,就認爲是網絡爬蟲,直接拒絕訪問。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.quwanyule157.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":www.michenggw.com/ "Mozilla/5.0 (Windows NT 10.0;www.gcyL157.com WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0",
  
  "referer": "https://www.yigouyule2.cn /search/",
  
  'x-requested-with': 'XMLHttpRequest'
  
  }
  
  #每一個ajax請求要傳遞的參數
  
  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)
  
  #調用ajax請求
  
  response = requests.get(ajax_url, headers=headers)
  
  #ajax請求返回的是json數據,經過調用json()方法獲得json數據
  
  json = response.json()
  
  data = json.get('data')
  
  for item in data:
  
  if item.get('title') is not None:
  
  print(item.get('title'))
  
  def main():
  
  #調用ajax的次數,這裏調用5次。
  
  for offset in (range(0,5)):
  
  parse_ajax_web(offset*20)
  
  if __name__ == '__main__':
  
  main()
  
  上面是爬取經過ajax請求加載數據網站的例子,若是想要其餘的數據,能夠動手本身寫,這裏只是搭了一個架子,各位能夠嘗試將數據寫入到excel或者數據庫中。html

相關文章
相關標籤/搜索