Python爬蟲實戰:爬取騰訊視頻的評論


前言

本文的文字及圖片來源於網絡,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯系我們以作處理。

作者: 易某某

PS:如有需要Python學習資料的小伙伴可以加點擊下方鏈接自行獲取

http://note.youdao.com/noteshare?id=3054cce4add8a909e784ad934f956cef

一、前提條件

  • 安裝了Fiddler了(用於抓包分析)

  • 谷歌或火狐瀏覽器

  • 如果是谷歌瀏覽器,還需要給谷歌瀏覽器安裝一個SwitchyOmega插件,用於代理服務器

  • 有Python的編譯環境,一般選擇Python3.0及以上

聲明:本次爬取騰訊視頻里 《最美公里》紀錄片的評論。本次爬取使用的瀏覽器是谷歌瀏覽器

二、分析思路

1、分析評論頁面

在這里插入圖片描述

根據上圖,我們可以知道:評論使用了Ajax異步刷新技術。這樣就不能使用以前分析當前頁面找出規律的手段了。因為展示的頁面只有部分評論,還有大量的評論沒有被刷新出來。

這時,我們應該想到使用抓包來分析評論頁面刷新的規律。以后大部分爬蟲,都會先使用抓包技術,分析出規律!

2、使用Fiddler進行抓包分析——得出評論網址規律

fiddler如何抓包,這個知識點,需要讀者自行去學習,不在本博客討論范圍。

在這里插入圖片描述

在這里插入圖片描述

把上面兩張圖里面的內容對比一下,可以知道這個JS就是評論存放頁面。(這需要大家一個一個找,一般Ajax都是在JS里面,所以這也找JS進行對比即可)

我們復制這個JS的url:右擊 > copy > Just Url

大家可以重復操作幾次,多找幾個JS的url,從url得出規律。下圖是我刷新了4次得到的JS的url:

在這里插入圖片描述

根據上圖,我們發現url不同的地方有兩處:一是cursor=?;二是_=?。

我們很快就能發現 _=?的規律,它是從1576567187273加1。而cursor=?的規律看不出來。這個時候如何去找到它的規律呢?

百度一下,看前人有沒有爬取過這種類型的網站,根據他們的規律和方法,去找出規律;

羊毛出在羊身上。我們需要有的大膽想法——會不會這個cursor=?可以根據上一個JS頁面得到呢?這只是很多大膽想法中的一個,我們就一個想法一個想法的試試。

我們就采用第二種方法,去js里面找。復制其中一個url為:

url = https://video.coral.qq.com/varticle/3242201702/comment/v2?callback=_varticle3242201702commentv2&orinum=10&oriorder=o&pageflag=1&cursor=6460163812968870071&scorecursor=0&orirepnum=2&reporder=o&reppageflag=1&source=132&_=1576567187273

去瀏覽器里面打開,在里面搜索一下此url的下一個url的cursor=?的值。我們發現一個驚喜!

如下:

在這里插入圖片描述

一般情況下,我們還要多試幾次,確定我們的想法是正確的。

至此,我們發現了評論的url之間的規律:

  • _=?從1576567187273加1

  • cursor=?的值存在上面一個JS中。

三、代碼編寫

 1 import re
 2 import random
 3 import urllib.request
 4  5 #構建用戶代理
 6 uapools=["Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36",
 7          "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36",
 8          "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:71.0) Gecko/20100101 Firefox/71.0",
 9         ]
10 #從用戶代理池隨機選取一個用戶代理
11 def ua(uapools):
12     thisua=random.choice(uapools)
13     #print(thisua)
14     headers=("User-Agent",thisua)
15     opener=urllib.request.build_opener()
16     opener.addheaders=[headers]
17     #設置為全局變量
18     urllib.request.install_opener(opener)
19 20 #獲取源碼
21 def get_content(page,lastId):
22     url="https://video.coral.qq.com/varticle/3242201702/comment/v2?callback=_varticle3242201702commentv2&orinum=10&oriorder=o&pageflag=1&cursor="+lastId+"&scorecursor=0&orirepnum=2&reporder=o&reppageflag=1&source=132&_="+str(page)
23     html=urllib.request.urlopen(url).read().decode("utf-8","ignore")
24     return html
25 26 #從源碼中獲取評論的數據
27 def get_comment(html):
28     pat='"content":"(.*?)"'
29     rst = re.compile(pat,re.S).findall(html)
30     return rst
31 32 #從源碼中獲取下一輪刷新頁的ID
33 def get_lastId(html):
34     pat='"last":"(.*?)"'
35     lastId = re.compile(pat,re.S).findall(html)[0]
36     return lastId
37 38 def main():
39     ua(uapools)
40     #初始頁面
41     page=1576567187274
42     #初始待刷新頁面ID
43     lastId="6460393679757345760"
44     for i in range(1,6):
45         html = get_content(page,lastId)
46         #獲取評論數據
47         commentlist=get_comment(html)
48         print("------第"+str(i)+"輪頁面評論------")
49         for j in range(1,len(commentlist)):
50             print(""+str(j)+"條評論:" +str(commentlist[j]))
51         #獲取下一輪刷新頁ID
52         lastId=get_lastId(html)
53         page += 1
54 55 main()

 

四、結果展示

在這里插入圖片描述 .


免責聲明!

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



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