36.5月22日 综合项目:爬取并分析知名B站UP主-1
综合项目:爬取并分析知名B站UP主-1
本项目为综合项目,本课内容主要实现:
- 对某up主的所有视频数据进行爬取
- 得到链接、标题、观看数量、点赞数、投币数、标签、封面图
- 存储到csv文件供后续分析

基本框架
本次以“百大UP”小约翰可汗的视频为例:https://space.bilibili.com/23947287/video?tid=0&pn=1&keyword=&order=pubdate
from DrissionPage import WebPage
import time
wp=WebPage()
wp.get("https://space.bilibili.com/23947287/video?tid=0&pn=1&keyword=&order=pubdate")
网页能正常打开,建议登录!
后续过程早晚要登陆。否则爬取过程会持续弹窗。
找到视频列表json
过程略

wp.listen.start('/space/wbi/arc/search')
wp.get("https://space.bilibili.com/23947287/video?tid=0&pn=1&keyword=&order=pubdate")
packet=wp.listen.wait()
vlist=packet.response.body['data']['list']['vlist']
print(vlist)

关键信息提取1
我们需要的信息如图

包括了:
- 标题
- BVID
- 视频封面图
vlist=packet.response.body['data']['list']['vlist']
for v in vlist:
title=v['title']
pic=v['pic']
bvid=v['bvid']
v_info=[title,bvid,pic]
print(v_info)

可见缺失了重要的:
- 播放数量
- 点赞数量
- 视频标签
关键信息提取2
其他信息需要打开相应视频网页才能获取
创建函数处理视频页面中的信息
def get_v(wp,bvid):
tab = wp.new_tab("https://www.bilibili.com/video/"+bvid)
time.sleep(2)
tab.close()
return
- wp.new_tab() 新建一个标签页
- 访问完成后,tab.close()关闭标签页
别忘了在合适位置调用函数!
别忘了在合适位置调用函数!
别忘了在合适位置调用函数!
找到视频页面中的信息

def get_v(wp,bvid):
tab = wp.new_tab("https://www.bilibili.com/video/"+bvid)
tab.listen.start('x/web-interface/wbi/view/detail')
packet=tab.listen.wait()
message=packet.response.body['data']['View']['stat']
v_info=[message['view'],message['like'],message['coin'],packet.response.body['data']['participle']]
# time.sleep(2)
tab.close()
return v_info
别忘了在合适位置调用函数!
别忘了在合适位置调用函数!
别忘了在合适位置调用函数!
for v in vlist:
title=v['title']
pic=v['pic']
bvid=v['bvid']
v_info=[title,bvid]
v_info.extend(get_v(wp,bvid))
v_info.append(pic)
print(v_info)

循环并翻页
while True:
time.sleep(2)
packet=wp.listen.wait()
vlist=packet.response.body['data']['list']['vlist']
# 。。。。。。。。。。。
# 这里代码略过
try:
wp.ele('.be-pager-next').click()
except:
break
文件存储
为后续分析,需要完成文件存储。
由于视频很多,本次存储使用csv格式。
并且,不再室所有完成后存
而是,边解析边存储
import csv
# 这部分内容略!!!!!
with open('v_info.csv', 'a', newline='', encoding='utf-8') as f:
writer = csv.writer(f)
writer.writerow(v_info)

异常处理
部分视频,打开的时候没有 'x/web-interface/wbi/view/detail'
程序会无限等待下去。
所以,我们在这里需要添加timeout
packet=tab.listen.wait(timeout=5)
使得程序能正常执行下去。
但是。
后续的代码 message=packet.response.body['data']['View']['stat']
由于没有获取到包,程序依旧会报错。
故,需要try
v_info=['','','','']
try:
message=packet.response.body['data']['View']['stat']
v_info=[message['view'],message['like'],message['coin'],packet.response.body['data']['participle']]
except:
print(bvid+"报错")
# time.sleep(2)
tab.close()
return v_info
提高效率
当前程序永远是从头开始爬取
当视频量大的时候,这种方式是不可取的
我们需要判断一下 视频ID 是否已经爬取过
生成csv
我们在程序初始,就生成个csv文件并设置好列标题
这里我们需要判断,csv是否已经存在
import os
import csv
import pandas as pd
col=['名称','编号','播放数','点赞数','投币数','标签','封面图']
file_path = '小约翰可汗.csv'
if not os.path.exists(file_path):
# 文件不存在,创建文件并写入列名
with open(file_path, 'w', newline='', encoding='utf-8') as f:
writer = csv.writer(f)
writer.writerow(col)
读取csv中编号信息
# 读取刚创建的CSV文件到DataFrame
df = pd.read_csv(file_path)
bvid_list=df['编号'].tolist()
print(bvid_list)
其中的bvid_list 就是已经文件中已经存在的视频编号
在程序爬取阶段做判断
在程序爬取阶段判断编号是否在已完成编号列表中
for v in vlist:
title=v['title']
pic=v['pic']
bvid=v['bvid']
if bvid not in bvid_list:
tmp=[]
tmp=get_vinfo(wp,bvid)
v_info=[title,bvid]
v_info.extend(tmp)
v_info.append(pic)
print(v_info)
with open('小约翰可汗.csv', 'a', newline='', encoding='utf-8') as f:
writer = csv.writer(f)
writer.writerow(v_info)
else:
print(bvid+"已经存在")
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 现代职校董良
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果
