您好,我是@馬哥python說,一枚10年程式猿。 一、爬取目標 之前,我分享過一些B站的爬蟲: 【Python爬蟲案例】用Python爬取李子柒B站視頻數據 【Python爬蟲案例】用python爬嗶哩嗶哩搜索結果 【爬蟲+情感判定+Top10高頻詞+詞雲圖】"谷愛凌"熱門彈幕python輿情分析 ...
您好,我是@馬哥python說,一枚10年程式猿。
一、爬取目標
之前,我分享過一些B站的爬蟲:
【Python爬蟲案例】用Python爬取李子柒B站視頻數據
【Python爬蟲案例】用python爬嗶哩嗶哩搜索結果
【爬蟲+情感判定+Top10高頻詞+詞雲圖】"谷愛凌"熱門彈幕python輿情分析
但我學習群中小伙伴頻繁討論B站評論的爬取,所以,再分享一個B站視頻評論的爬蟲。
二、展示爬取結果
首先,看下部分爬取數據:
爬取欄位含:視頻鏈接、評論頁碼、評論作者、評論時間、IP屬地、點贊數、評論內容。
三、爬蟲代碼
導入需要用到的庫:
import requests # 發送請求
import pandas as pd # 保存csv文件
import os # 判斷文件是否存在
import time
from time import sleep # 設置等待,防止反爬
import random # 生成隨機數
定義一個請求頭:
# 請求頭
headers = {
'authority': 'api.bilibili.com',
'accept': 'application/json, text/plain, */*',
'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
# 需定期更換cookie,否則location爬不到
'cookie': "需換成自己的cookie值",
'origin': 'https://www.bilibili.com',
'referer': 'https://www.bilibili.com/video/BV1FG4y1Z7po/?spm_id_from=333.337.search-card.all.click&vd_source=69a50ad969074af9e79ad13b34b1a548',
'sec-ch-ua': '"Chromium";v="106", "Microsoft Edge";v="106", "Not;A=Brand";v="99"',
'sec-ch-ua-mobile': '?0',
'sec-ch-ua-platform': '"Windows"',
'sec-fetch-dest': 'empty',
'sec-fetch-mode': 'cors',
'sec-fetch-site': 'same-site',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.47'
}
請求頭中的cookie是個很關鍵的參數,如果不設置cookie,會導致數據殘缺或無法爬取到數據。
那麼cookie如何獲取呢?打開開發者模式,見下圖:
由於評論時間是個十位數:
所以開發一個函數用於轉換時間格式:
def trans_date(v_timestamp):
"""10位時間戳轉換為時間字元串"""
timeArray = time.localtime(v_timestamp)
otherStyleTime = time.strftime("%Y-%m-%d %H:%M:%S", timeArray)
return otherStyleTime
向B站發送請求:
response = requests.get(url, headers=headers, ) # 發送請求
接收到返回數據了,怎麼解析數據呢?看一下json數據結構:
0-19個評論,都存放在replies下麵,replies又在data下麵,所以,這樣解析數據:
data_list = response.json()['data']['replies'] # 解析評論數據
這樣,data_list裡面就是存儲的每條評論數據了。
接下來嗎,就是解析出每條評論里的各個欄位了。
我們以評論內容這個欄位為例:
comment_list = [] # 評論內容空列表
# 迴圈爬取每一條評論數據
for a in data_list:
# 評論內容
comment = a['content']['message']
comment_list.append(comment)
其他欄位同理,不再贅述。
最後,把這些列表數據保存到DataFrame裡面,再to_csv保存到csv文件,持久化存儲完成:
# 把列表拼裝為DataFrame數據
df = pd.DataFrame({
'視頻鏈接': 'https://www.bilibili.com/video/' + v_bid,
'評論頁碼': (i + 1),
'評論作者': user_list,
'評論時間': time_list,
'IP屬地': location_list,
'點贊數': like_list,
'評論內容': comment_list,
})
# 把評論數據保存到csv文件
df.to_csv(outfile, mode='a+', encoding='utf_8_sig', index=False, header=header)
註意,加上encoding='utf_8_sig',否則可能會產生亂碼問題!
下麵,是主函數迴圈爬取部分代碼:(支持多個視頻的迴圈爬取)
# 隨便找了幾個"世界盃"相關的視頻ID
bid_list = ['BV1DP411g7jx', 'BV1M24y117K3', 'BV1nt4y1N7Kj']
# 評論最大爬取頁(每頁20條評論)
max_page = 30
# 迴圈爬取這幾個視頻的評論
for bid in bid_list:
# 輸出文件名
outfile = 'b站評論_{}.csv'.format(now)
# 轉換aid
aid = bv2av(bid=bid)
# 爬取評論
get_comment(v_aid=aid, v_bid=bid)
四、同步視頻
演示視頻:
https://www.zhihu.com/zvideo/1584884344677437440
完整代碼: 【B站評論爬蟲】用python爬取上千條嗶哩嗶哩評論