本文的文字及圖片來源於網絡,僅供學習、交流使用,不具備任何商業用途,版權歸原做者全部,若有問題請及時聯繫咱們以做處理。html
做者: 易某某瀏覽器
PS:若有須要Python學習資料的小夥伴能夠加點擊下方連接自行獲取服務器
http://note.youdao.com/noteshare?id=3054cce4add8a909e784ad934f956cef網絡
安裝了Fiddler了(用於抓包分析)dom
谷歌或火狐瀏覽器異步
若是是谷歌瀏覽器,還須要給谷歌瀏覽器安裝一個SwitchyOmega插件,用於代理服務器ide
有Python的編譯環境,通常選擇Python3.0及以上學習
聲明:本次爬取騰訊視頻裏 《最美千米》紀錄片的評論。本次爬取使用的瀏覽器是谷歌瀏覽器網站
一、分析評論頁面ui
根據上圖,咱們能夠知道:評論使用了Ajax異步刷新技術。這樣就不能使用之前分析當前頁面找出規律的手段了。由於展現的頁面只有部分評論,還有大量的評論沒有被刷新出來。
這時,咱們應該想到使用抓包來分析評論頁面刷新的規律。之後大部分爬蟲,都會先使用抓包技術,分析出規律!
二、使用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()