在当今时代,Bilibili(哔哩哔哩)作为国内知名的弹幕视频网站,以内容创作为载体,拥有海量活跃的用户,其评论数据也承载了用户的真实观看体验,这些评论数据对于了解用户喜好、分析内容创作趋势以及进行市场调研具有重要价值。但众所周知,Bilibili的反爬虫机制较为严格,有用相对完善的反爬虫体系(如IP检测、频率限制及登录验证等),一旦爬取任务超出阈值,IP很容易被限制或封禁。
为了高效、稳定获取Bilibili评论数据,本文将为你详细介绍如何利用代理IP结合Python爬虫技术,搭配多线程处理机制,突破反爬限制,实现对Bilibili评论数据的抓取。
咱们这次的目标是B站某个视频下面的评论,想抓取的数据有:
用代理IP,搭配多线程处理,我们可以动态调整IP,突破访问频率限制,同时加速爬取速度并提高任务成功率。
爬虫开发前,得先装好这些Python库:
pip install requests
pip install pandas
pip install lxml
通过浏览Bilibili视频页面,我们了解到评论数据是通过Ajax异步加载的。可以通过分析网络请求,找到评论数据的API接口。
可以发现,API链接格式为:
https://api.bilibili.com/x/v2/reply/main?oid={video_id}&type=1&next={page}
video_id
:视频的唯一ID。next
:从分页1开始,用于表示当前页的评论数据。type
:评论类型(通常是1)mode
:排序模式(通常是3,按热度排序)data.replies
字段里。调用青果网络代理IP,通过动态IP轮换解决Bilibili的频率限制问题:
def get_ip():
url = "https://share.proxy.qg.net/get?key=yourkey&num=1&area=&isp=0&format=txt&seq=\r\n&distinct=false"
while 1:
try:
r = requests.get(url, timeout=10)
except:
continue
ip = r.text.strip()
if '请求过于频繁' in ip:
print('IP请求频繁')
time.sleep(1)
continue
break
proxies = {
'https': '%s' % ip
}
return proxies
实现抓取指定视频ID和页码下的评论数据:
import requests
from lxml import etree
import json
def crawl_comments(video_id, page, proxies):
"""爬取指定视频的评论数据"""
url = "https://api.bilibili.com/x/v2/reply/main"
params = {
"oid": video_id,
"type": 1,
"mode": 3,
"next": page
}
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36"
}
try:
response = requests.get(url, params=params, headers=headers, proxies=proxies, timeout=10)
response.raise_for_status()
data = response.json()
comments = data.get("data", {}).get("replies", [])
result = []
for comment in comments:
content = comment.get("content", {}).get("message", "")
nickname = comment.get("member", {}).get("uname", "")
timestamp = comment.get("ctime", "")
likes = comment.get("like", 0)
result.append({
"评论内容": content,
"用户昵称": nickname,
"评论发布时间": timestamp,
"点赞数量": likes
})
return result
except Exception as e:
print(f"Error fetching comments for page {page}: {e}")
return []
通过ThreadPoolExecutor
创建线程池,实现多线程并发抓取多个分页数据:
from concurrent.futures import ThreadPoolExecutor, as_completed
import pandas as pd
import time
def main(video_id):
max_pages = 20 # 需要爬取的评论页数
thread_count = 10 # 最大并行线程数量
all_comments = []
# 初始化青果网络代理池
proxies = get_proxy()
with ThreadPoolExecutor(max_workers=thread_count) as executor:
futures = [executor.submit(crawl_comments, video_id, page, proxies) for page in range(1, max_pages + 1)]
for future in as_completed(futures):
try:
comments = future.result()
all_comments.extend(comments)
except Exception as e:
print(f"Error in thread:{e}")
# 存储数据到Excel
df = pd.DataFrame(all_comments, columns=["用户昵称", "评论内容", "点赞数量", "评论发布时间"])
df.to_excel(f"Bilibili视频_{video_id}_评论数据.xlsx", index=False)
print(f"爬取完成!")
运行主函数,采集Bilibili指定视频下的评论数据:
if __name__ == "__main__":
start_time = time.time()
video_id = "xxxxx" # 替换为目标视频的ID
main(video_id)
end_time = time.time()
print(f"总耗时:{round(end_time - start_time, 2)} 秒")
程序跑完后,评论数据会自动存到Excel文件里,用户昵称、评论内容、点赞数、发布时间都有,格式清晰,方便后续分析处理。
爬Bilibili视频的评论方法就到这了。通过试用优质的代理IP,动态切换IP和业务分池技术能让我们实际操作过程中成功率更高,这种整合代理IP和多线程池的方案,不仅适用于爬Bilibili,也同样适用于其他的项目。
如果如果你正在进行类似任务的业务开发,或者需要高质量的代理IP,可以试一试青果网络的,目前都有6小时免费测试时间,用来测试还是很香的。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。