動態網頁爬取流程總結


  眾所周知,動態網站通常使用例如ajax等異步加載技術來加載網頁,相比於靜態網頁,動態網頁通常包含多個請求,且數據往往並不存在於網頁源碼中,我們便需要通過抓包來尋找數據所在的請求並分析,編寫響應的爬蟲代碼。動態網站的爬取包含下以下三個步驟:抓包,分析參數,提取數據。(以下使用爬取b站評論來作為講解案例)

 

一、抓包

  抓包有很多方式,比較常見的有用例如fiddle這種抓包軟件以及瀏覽器自帶的開發者調試工具(即f12),這里只介紹chrome的f12。

  f12里有許多的菜單,這里我們只需要用到network,下面是我們會經常用到的功能

  
  
  上面三個箭頭指向的按鈕功能從左到右依次為
  1.開關,變紅即為開始抓包,變灰則為停止,當開啟時會清空之前的抓包歷史記錄
  2.清空歷史記錄
  3,搜索功能,可以查詢哪些包中存在指定的字段
  下面一欄為過濾器,可以選擇看哪種類型的包,一般動態網頁的包都為xhr
 
  接下來就開始抓包了,抓包一般有兩種方法:
  1.通過觸發指定事件來定位數據所存在的包
  
  分析一下網站,可以很明顯的發現,能觸發b站評論改變的事件有點擊如圖的兩個按鈕以及下滑至評論所在的地方,這里我們選擇按鈕事件來觸發。
  
  很明顯,我們需要的包就在眼前,點進去看一下內容發現是json文件,便確定了這就是我們要的包
 
  某些動態網站可能是在網站加載之時就觸發了事件,或者傳來的包根本不是xhr包,導致歷史記錄里一大片的包不知道如何是好,這時之前所提到的搜索功能就起作用了
  
  打開搜索框后,將我們需要定位的數據填入search里,如圖
  
  可以看到,數據包被我們快速的查找的出來,這種方法對比第一種來得有效,但效率不如第一種,各有優劣
 

二、分析參數

  異步數據包不像網頁一樣有着獨一無二的uri,作為傳遞數據的api,網站通常只會使用一個api來傳遞一類的數據,並通過包內的參數來通知服務器后台應該傳回什么數據,而我們需要分析的參數便是這些影響后台的關鍵數據。

  點開我們已經定位到的包,選中header,可以看到有幾個下拉欄

 

  其中有三個欄目是我們需要關注的:

  1.Respuest Headers

  請求頭,在我們爬靜態網站的時候也同樣會用到的一組參數,例如user-agent,referer等字段,有些網站會在請求頭內傳遞一些數據來通知后台,主要還是為了反爬,除了user-agent和referer之外其他的字段很少用到,具體情況具體分析,爬的時候注意即可。

  2.Form data

  請求體,只存在於POST請求,也同樣是一組需要分析的參數,因為我們很少會爬到POST請求的api,所以不展開說。

  3.Query String Parameters

  這是最重要的一組參數,存在於url當中,url鏈接問號后面的那一串字符串就是用來傳這組參數的,不過在f12中我們可以直觀的看到,如下圖

  

  接下來我們需要開始分析這些參數,找出哪些是有用的,哪些是不需要傳的,哪些又是沒用但是需要傳的。這里沒有一個很萬金油的方法,無非就是用刪改參數后訪問並檢查傳過來的數據,或者尋找使用同一api的事件,對比有什么不同,我們可以用python shell或者寫個python腳本用來測試,例如

  

import requests

header = {
    'referer': 'https://www.bilibili.com/',
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36'
}

query = {
    'callback': 'jQuery172015271738099074472_1610803920156',
    'jsonp': 'jsonp',
    'pn': 1,
    'type': 1,
    'oid': 412935552,
    'sort': 2,
    '_': 1610804916511
}

url = 'https://api.bilibili.com/x/v2/reply?callback={}&jsonp={}&pn={}&type={}&oid={}&sort={}&_={}'

print(requests.get(url.format(query['callback'],query['jsonp'],query['pn'],query['type'],query['oid'],query['sort'],query['_']),headers=header).text)

 

 

  測試完后我們可知參數callback、jsonp、_是不需要的,type是需要但無意義的,pn表示頁數,sort表示排序方式(即熱度排序和最新排序),oid指定唯一一個視頻(但不是av號),因此我們便可以通過循環pn來把所有的評論都給爬到。

 

三、提取數據

  api大部分采用json數據格式傳輸數據,當然也有直接將參數加到網頁url里傳回html的情況(用bs解析即可),解析json我們需要用到json庫,這里不再詳細講關於json的知識(需要的話去百度查

 

  

 

 

   如圖所示,我們要找的路徑即為root -> data -> replies。每一條評論的內容、作者、時間等都在這里

 

四、總結

  關於動態網站的爬取主要還是在於對異步加載這類前端技術的認識程度,以及對於web開發的理解,雖然作為爬蟲工具人,但前后端的技術學習那是一個沒落下,甚至於某些網站用js來反爬,難度又能上一級。不過對於數據挖掘來說這種基本的爬蟲技術已經夠用,網路上90%的數據爬取都是沒問題的。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM