前言
利用Python實作抓取騰訊視頻彈幕,廢話不多說,
讓我們愉快地開始吧~
開發工具
Python版本: 3.6.4
相關模塊:
requests模塊;
pandas模塊
以及一些Python自帶的模塊,
環境搭建
安裝Python并添加到環境變數,pip安裝需要的相關模塊即可,
思路分析
本文以爬取電影《革命者》為例,講解如何爬取騰訊視頻的彈幕和評論!
目標網址
https://v.qq.com/x/cover/mzc00200m72fcup.html
抓取彈幕
分析網址
依然進入瀏覽器的開發者工具進行抓包,當視頻播放30秒它就會更新一個json資料包,里面包含我們需要的彈幕資料,

得到準確的URL:
https://mfm.video.qq.com/danmu?otype=json&callback=jQuery19109541041335587612_1628947050538&target_id=7220956568%26vid%3Dt0040z3o3la&session_key=0%2C32%2C1628947057×tamp=15&_=1628947050569\
https://mfm.video.qq.com/danmu?otype=json&callback=jQuery19109541041335587612_1628947050538&target_id=7220956568%26vid%3Dt0040z3o3la&session_key=0%2C32%2C1628947057×tamp=45&_=1628947050572
其中有差別的引數有timestamp和_,_是時間戳,timestamp是頁數,首條url為15,后面以公差為30遞增,公差是以資料包更新時長為基準,而最大頁數為視頻時長7245秒,依然洗掉不必要引數,得到URL:
https://mfm.video.qq.com/danmu?otype=json&target_id=7220956568%26vid%3Dt0040z3o3la&session_key=0%2C18%2C1628418094×tamp=15&_=1628418086509
代碼實作
import pandas as pd\
import time\
import requests\
\
headers = {\
'User-Agent': 'Googlebot'\
}\
# 初始為15,7245 為視頻秒長,鏈接以三十秒遞增\
df = pd.DataFrame()\
for i in range(15, 7245, 30):\
url = "https://mfm.video.qq.com/danmu?otype=json&target_id=7220956568%26vid%3Dt0040z3o3la&session_key=0%2C18%2C1628418094×tamp={}&_=1628418086509".format(i)\
html = requests.get(url, headers=headers).json()\
time.sleep(1)\
for i in html['comments']:\
content = i['content']\
print(content)\
text = pd.DataFrame({'彈幕': [content]})\
df = pd.concat([df, text])\
df.to_csv('革命者_彈幕.csv', encoding='utf-8', index=False)
效果展示

抓取評論
網頁分析
騰訊視頻評論資料在網頁底部,依然是動態加載的,需要按下列步驟進入開發者工具進行抓包:

點擊查看更多評論后,得到的資料包含有我們需要的評論資料,得到的真實URL:
https://video.coral.qq.com/varticle/6655100451/comment/v2?callback=_varticle6655100451commentv2&orinum=10&oriorder=o&pageflag=1&cursor=0&scorecursor=0&orirepnum=2&reporder=o&reppageflag=1&source=132&_=1628948867522\
https://video.coral.qq.com/varticle/6655100451/comment/v2?callback=_varticle6655100451commentv2&orinum=10&oriorder=o&pageflag=1&cursor=6786869637356389636&scorecursor=0&orirepnum=2&reporder=o&reppageflag=1&source=132&_=1628948867523
URL中的引數callback以及_洗掉即可,重要的是引數cursor,第一條url引數cursor是等于0的,第二條url才出現,所以要查找cursor引數是怎么出現的,經過我的觀察,cursor引數其實是上一條url的last引數:

代碼實作
import requests\
import pandas as pd\
import time\
import random\
\
headers = {\
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'\
}\
df = pd.DataFrame()\
a = 1\
# 此處必須設定回圈次數,否則會無限重復爬取\
# 281為參照資料包中的oritotal,資料包中一共10條資料,回圈280次得到2800條資料,但不包括底下回復的評論\
# 資料包中的commentnum,是包括回復的評論資料的總數,而資料包都包含10條評論資料和底下的回復的評論資料,所以只需要把2800除以10取整數+1即可!\
while a < 281:\
if a == 1:\
url = 'https://video.coral.qq.com/varticle/6655100451/comment/v2?orinum=10&oriorder=o&pageflag=1&cursor=0&scorecursor=0&orirepnum=2&reporder=o&reppageflag=1&source=132'\
else:\
url = f'https://video.coral.qq.com/varticle/6655100451/comment/v2?orinum=10&oriorder=o&pageflag=1&cursor={cursor}&scorecursor=0&orirepnum=2&reporder=o&reppageflag=1&source=132'\
res = requests.get(url, headers=headers).json()\
cursor = res['data']['last']\
for i in res['data']['oriCommList']:\
ids = i['id']\
times = i['time']\
up = i['up']\
content = i['content'].replace('\n', '')\
text = pd.DataFrame({'ids': [ids], 'times': [times], 'up': [up], 'content': [content]})\
df = pd.concat([df, text])\
a += 1\
time.sleep(random.uniform(2, 3))\
df.to_csv('革命者_評論.csv', encoding='utf-8', index=False)
~完整代碼私信獲取
效果展示

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/348351.html
標籤:其他
上一篇:零基礎學Python(二)
