我觉得python这个东西不需要开课,真的自然就会了,而且人人都应该去学一下,前几天被同系但不是专修编程(ta比较偏硬件)的同学找了,一番寒暄后得知是她的好朋友,艺术学院的想搜集抖音,b站的弹幕呀啥的数据,在我们计算机学院找人,找上我来了。然后她和我说她们淘宝上找过商家,报价300元,哇去,这不是赤裸裸的抢钱么?
啊这,既然接了任务,那就好好写吧~无他。
b站的爬虫是最友好的,因为他官方发布了接口
from bilibili_api import video, sync
我们直接用,爬下来一小段数据。
{
'bvid': 'BV17m4y1e7mR',
'aid': 700082614,
'videos': 2,
'tid': 249,
'tname': '足球',
'copyright': 1,
'pic': 'http://i2.hdslb.com/bfs/archive/69c44de4c4ccae9bdbe8767756b10e64ed99857f.png',
'title': '【4K至臻】经典回顾,詹张解说,欧冠复仇战 曼城4-0皇家马德里超长集锦',
'pubdate': 1687399247,
'ctime': 1687359496,
'desc': '最强画质,不服来战',
'desc_v2': [{
'raw_text': '最强画质,不服来战',
'type': 1,
'biz_id': 0
}],
'state': 0,
'duration': 1499,
'rights': {
'bp': 0,
'elec': 0,
'download': 1,
'movie': 0,
'pay': 0,
'hd5': 0,
'no_reprint': 1,
'autoplay': 1,
'ugc_pay': 0,
'is_cooperation': 0,
'ugc_pay_preview': 0,
'no_background': 0,
'clean_mode': 0,
'is_stein_gate': 0,
'is_360': 0,
'no_share': 0,
'arc_pay': 0,
'free_watch': 0
},
'owner': {
'mid': 395970429,
'name': '土卫三的兰帕德',
'face': 'https://i0.hdslb.com/bfs/face/7ad8662b730cdc25f922894fba5a0430f731b044.jpg'
},
'stat': {
'aid': 700082614,
'view': 11642,
'danmaku': 91,
'reply': 42,
'favorite': 141,
'coin': 105,
'share': 14,
'now_rank': 0,
'his_rank': 0,
'like': 468,
'dislike': 0,
'evaluation': '',
'argue_msg': ''
},
'dynamic': '',
'cid': 1171317439,
'dimension': {
'width': 3840,
'height': 2160,
'rotate': 0
},
'premiere': None,
'teenage_mode': 0,
'is_chargeable_season': False,
'is_story': False,
'is_upower_exclusive': False,
'is_upower_play': False,
'no_cache': False,
'pages': [{
'cid': 1171317439,
'page': 1,
'from': 'vupload',
'part': '全场集锦',
'duration': 1485,
'vid': '',
'weblink': '',
'dimension': {
'width': 3840,
'height': 2160,
'rotate': 0
},
'first_frame': 'http://i0.hdslb.com/bfs/storyff/n23062102vowo4d03cdia1779ktm91x0_firsti.jpg'
}, {
'cid': 1171317582,
'page': 2,
'from': 'vupload',
'part': '猫猫',
'duration': 14,
'vid': '',
'weblink': '',
'dimension': {
'width': 720,
'height': 1284,
'rotate': 0
},
'first_frame': 'http://i2.hdslb.com/bfs/storyff/n23062103sir908z7rghbhcyz281qqh7_firsti.jpg'
}],
'subtitle': {
'allow_submit': False,
'list':
可以发现里面除了没有标签和弹幕,几乎涵盖了大部分数据。
由于爬取的是纯文本形式的json,我们需要将其转化为json格式的数据
# 将得到的json文本转化为可读json,这段是复制的
if 'code' in response.text:
c_json = json.loads(response.text)
else:
c_json = {'code': -1}
if c_json['code'] != 0:
print('json error!')
print(response.status_code)
print(response.text)
return 0 # 读取错误
return c_json
你也可以用chatGPT帮你完成这个工作。当然也可以先不用管,直接用code.json()也是一样的效果。然后将其写入文本,你需要的格式,txt或者表格xlsx,一切依你。
def save_top_to_csv(v_list):
t = time.strftime('%m%d', time.localtime())
file_path = ("videoTop_%s.csv" % t)
# 如果文件存在,则覆盖写入
f = open(file_path, mode="w", encoding='utf-8', newline='')
csv_writer1 = csv.DictWriter(f,
fieldnames=[
'up主', '视频标题', '视频BV号', '视频播放量',
'评论数量', '发布时间', '点赞量',
'投币量', '收藏量','转发量','分p数量','视频分区','自制or转载','视频描述']
)
csv_writer1.writeheader()
for info in v_list:
info = method_get_videos_info(info)
# 防止过快
time.sleep(0.1)
# 有些数值需要做些处理再往里传
if info.get('copyright', "None") == 1:
copyright = "自制视频"
else:
copyright = "转载视频"
released_time = time_string = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(info.get('pubdate', "None")))
data_dict1 = {
'up主':info.get('owner',"None").get('name',"None"),
'视频标题': info.get('title', "None"),
'视频BV号': info.get('bvid', "None"),
'视频播放量': info.get('stat', "None").get('view', "None"),
'评论数量': info.get('stat', "None").get('reply', "None"),
'发布时间': released_time,
'点赞量': info.get('stat', "None").get('like', "None"),
'投币量': info.get('stat', "None").get('coin', "None"),
'收藏量': info.get('stat', "None").get('favorite', "None"),
'转发量': info.get('stat', "None").get('share', "None"),
'分p数量': info.get('videos', "None"),
'视频分区': info.get('tname', "None"),
'自制or转载': copyright,
'视频描述': info.get('desc', "None"),
}
csv_writer1.writerow(data_dict1)
f.close()
最后完成b站热门数据的爬取,帮同学节约了300元~
完整代码请联系本人 xinkong1418@163.com