代码概述
这段Python代码的主要目的是从Bilibili旅游频道获取热门视频数据。通过调用Bilibili API,我们可以获取视频的相关信息。代码将抓取的数据存储在一个Pandas DataFrame中,并将其输出为CSV文件。
这是 Bilibili 数据分析项目的一部分。
代码详解
设置请求头
这部分代码定义了请求头和生活区API接口的URL。其中,请求头用于伪装成浏览器发送请求,防止被B站识别为爬虫。API接口的URL是获取生活区视频数据的接口,可以通过修改接口参数来获取不同的数据。
注:需要改成你自己的COOKIE
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.182 Safari/537.36',
'Referer': 'https://www.bilibili.com/',
'cookie': "YOUR COOKIE",
'origin': 'https://www.bilibili.com'
}
api_url = 'https://api.bilibili.com/x/web-interface/web/channel/multiple/list?channel_id=6572&sort_type=hot&offset=%s&page_size=30'
获取频道内视频的bvid
这部分代码通过循环从API接口获取生活区视频的bvid,并存储到DataFrame中。
df = pd.DataFrame()
bvid_list = []
item_list = []
i = 0
offset = "865828963_1679311956"
while i <= 6000:
page_url = api_url % offset
response = requests.get(page_url, headers=headers)
data = json.loads(response.text)
offset = data['data']['offset']
print(offset)
# print(data)
for item in data['data']['list']:
# 将新行数据转换为一个DataFrame
item_df = pd.DataFrame(item, index=[0])
if i == 0:
df = pd.concat([df, item_df], ignore_index=True)
i += 1
else:
# 检查新行的'bvid'值是否与原始DataFrame中的任意一个'bvid'不同
if item['bvid'] not in df['bvid'].values:
# 如果不在,则将新行数据添加到原始DataFrame
df = pd.concat([df, item_df], ignore_index=True)
i += 1
注意事项
- 确保在请求头中设置合适的
User-Agent
和cookie
,以防止被B站识别为爬虫并拦截请求。同时,请遵守网站的爬虫政策,避免频繁请求。 - 在处理API返回的数据时,确保正确处理JSON数据,避免出现解析错误。
- 为了避免重复数据,代码会检查新抓取的视频bvid是否已存在于DataFrame中。如果已存在,则不会将新行数据添加到原始DataFrame。这样可以确保我们获取到的数据是唯一的。
- 在使用
pd.concat()
将新行数据添加到原始DataFrame时,请注意使用ignore_index=True
,以便在合并后重置索引。 - 本代码示例中设置的视频获取数量为6000,您可以根据需求调整该值。但请注意,大量数据的抓取可能会导致请求过于频繁,从而触发网站的反爬机制。
- 代码最后将整个DataFrame输出为CSV文件。您可以根据需要更改输出文件名和路径。
df.to_csv('/Volumes/SSD/Data/getVideoid_new.csv')
总结
本文档介绍了如何使用Python代码从Bilibili旅游频道获取热门视频数据。我们详细讲解了代码的各个部分,包括设置请求头、获取频道内视频的bvid等。在使用此代码时,请注意遵守网站的爬虫政策,并注意处理JSON数据和DataFrame。最后,您可以将抓取到的数据保存为CSV文件,以便后续分析和处理。