1. 程式人生 > >python 爬取騰訊視訊的全部評論

python 爬取騰訊視訊的全部評論

## 一、網址分析 查閱了網上的大部分資料,大概都是通過抓包獲取。但是抓包有點麻煩,嘗試了F12,也可以獲取到評論。以[電視劇《在一起》](https://v.qq.com/x/cover/mzc00200jg5gfcq.html)為例子。評論最底端有個**檢視更多評論**猜測過去應該是 Ajax 的非同步載入。 網上的大部分都是構建評論的網址,通過 requests 獲取,正則表示式進行資料處理。本文也利用該方法進行資料處理,其實利用 scrapy 會更簡單。 根據前輩給出的經驗,順利找到了評論所在的連結。 ![](https://img2020.cnblogs.com/blog/1535189/202102/1535189-20210217155824776-351090316.png) 在新標籤中開啟,該網址的連結。 ![](https://img2020.cnblogs.com/blog/1535189/202102/1535189-20210217155954484-1879056671.png) 評論都在```"content":"xxxxx"```裡面,所有可以通過正則表示式獲取。 那麼現在要開始構建網址,找到其規律。 在查詢評論連結的過程中無意發現,點選影評旁邊的評論總數,可以獲取到更為乾淨的評論介面。結果是一樣的。 ![](https://img2020.cnblogs.com/blog/1535189/202102/1535189-20210217160313286-454649652.png) 既然是要爬取所有的評論,所以知道評論數是必不可少的。 ![](https://img2020.cnblogs.com/blog/1535189/202102/1535189-20210217160425696-908517358.png) 再通過F12獲取到評論連結,找到網址的規律,構建網址,載入三四個評論就行了。這裡載入了四個網址。把所有網址複製到文字檔案中,進行對比分析。 ![](https://img2020.cnblogs.com/blog/1535189/202102/1535189-20210217160840909-687640559.png) 觀察發現只有 cursor 和 source 進行了改變,其他是不變的,二 source 是在第一個的基礎上進行加一操作,所以只需要獲取到 cursor 即可。我們開啟一個評論連結的網址,我們可以知道,cursor 其實是上一頁 最後一個使用者的ID碼。所以我們只需要在爬取上一頁的時候一起爬蟲了。然後就可以構建網址。 ![](https://img2020.cnblogs.com/blog/1535189/202102/1535189-20210217161400943-556608566.png) ## 二、程式碼編寫 這個程式碼還是簡單的。套用之前上課做的模板就可以直接進行爬蟲了。 通過正則表示式獲取評論,返回一個列表; 正則表示式獲得的 cursor 碼是列表,所以要轉化為字串使用; source 很簡單了,直接在上一個的基礎上加一即可。 ``` def getComment(html): # 爬取單頁評論 findeComment = re.compile(r'"content":"(.*?)"', re.S) comment = re.findall(findeComment, html) # print(comment) return comment def getCursor(html): # 獲取下一頁的cursor碼 findeCursor = re.compile(r'"last":"(.*?)"', re.S) cursor = re.findall(findeCursor, html)[0] # print(cursor) return cursor def getSource(source): # 獲取下一頁的source碼 source = int(source) + 1 return str(source) ``` 有點難度的可能就送弄代理吧,但是代理可以模仿網上其他人的寫法,所以還是不是很難。 ``` #新增使用者代理 def ua(uapools): thisua = random.choice(uapools) # print(thisua) headers = ("User-Agent", thisua) opener = urllib.request.build_opener() opener.addheaders = [headers] # 設定為全域性變數 urllib.request.install_opener(opener) ``` ## 三、遇到的問題 ### 1. 獲取評論的時候也將子評論爬蟲進去了。 仔細查看了原始碼,發現評論主要在 data 下面的 oriCommList 列表裡,其他範圍的評論為子評論。個人認為子評論也算有效評論,目前不打算處理。 ![](https://img2020.cnblogs.com/blog/1535189/202102/1535189-20210217180343716-475418300.png) ### 2. 獲取全部評論數,直接通過 requests 獲取不到 嘗試了 xpath 和 requests 發現不能獲取全部評論數,所以目前只能通過 selenium 獲取,但是 selenium 效率太低了,就獲取一個評論總數,還不如開啟原始碼直接修改評論總數,所以暫時沒有修改 ### 3. 評論總數資料太大 因為之前爬蟲過很多網站,同一個 user-agent 很容易被 ban ,所以目前構建了使用者代理,然後進行隨機。其實還想加一個 ip 代理的,但是使用了 ip 代理的網址,上面寫的正常的 ip ,在使用的時候,拒絕連線。也嘗試過構建代理池。但是代理池一般都是使用docker 和 Redis 進行獲取。暫時沒有選用,之選用了使用者代理,然後在獲取 headers 的時候加個 time.sleep(1)。目前還是正常的。 ### 4. 報錯```'utf-8' codec can't decode byte 0xff in position 1: invalid start byte``` 遇到這個問題,實在無語,我懷疑後面的評論是新出的 emjoy,然後utf-8不能識別,程式掛掉了。但是選取其他格式,在解釋的過程估計還會掛掉,就暫時爬到1萬條吧。 ![](https://img2020.cnblogs.com/blog/1535189/202102/1535189-20210217181956342-2126075617.png) ## 四、完整程式碼 [GitHub地址](https://github.com/Lin1031/first-personal-work/blob/crawl/code/TencentVideo.py) ## 參考資料 [Python爬蟲實戰:爬取騰訊視訊的評論](https://my.oschina.net/u/4397001/blog/3421754) [python爬蟲(3)——使用者和IP代理池、抓包分析、非同步請求資料、騰訊視訊評論爬蟲](https://blog.csdn.net/autfuhyql782263188/article/details/101100006) [應對反爬蟲最簡單的策略——隨機UA+遞迴request](https://www.jianshu.com/p/f319f