Python爬蟲實戰,requests模塊,Python實現抓取TX視頻彈幕 前言 開發工具 環境搭建 思路分析 抓取彈幕 抓取評論

前言

利用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&timestamp=15&_=1628947050569\
https://mfm.video.qq.com/danmu?otype=json&callback=jQuery19109541041335587612_1628947050538&target_id=7220956568%26vid%3Dt0040z3o3la&session_key=0%2C32%2C1628947057&timestamp=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&timestamp=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&timestamp={}&_=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)

效果展示

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章