前言
利用Python實現抓取TX視頻彈幕,廢話不多說。
讓我們愉快地開始吧~
開發工具
Python版本: 3.6.4
相關模塊:
requests模塊;
pandas模塊
以及一些Python自帶的模塊。
環境搭建
安裝Python並添加到環境變量,pip安裝需要的相關模塊即可。
思路分析
本文以爬取電影《革命者》爲例,講解如何爬取TX視頻的彈幕和評論!
目標網址
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)
效果展示
抓取評論
網頁分析
TX視頻評論數據在網頁底部,依然是動態加載的,需要按下列步驟進入開發者工具進行抓包:
點擊查看更多評論後,得到的數據包含有我們需要的評論數據,得到的真實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)
效果展示