如何用Python快速爬取B站全站视频信息

B站我想大家都熟悉吧,其实 B 站的爬虫网上一搜一大堆。不过纸上得来终觉浅,绝知此事要躬行,我码故我在。最终爬取到数据总量为 760万 条。

准备工作

首先打开 B 站,随便在首页找一个视频点击进去。常规操作,打开开发者工具。这次是目标是通过爬取 B 站提供的 api 来获取视频信息,不去解析网页,解析网页的速度太慢了而且容易被封 ip。

勾选 JS 选项,F5 刷新

B站

找到了 api 的地址

复制下来,去除没必要的内容,得到https://api.bilibili.com/x/web-interface/archive/stat?aid=15906633 ,用浏览器打开,会得到如下的 json 数据

 数据

动手写码

好了,到这里代码就可以码起来了,通过 request 不断的迭代获取数据,为了让爬虫更高效,可以利用多线程。

核心代码

代码

迭代爬取

代码

整个项目的最主要部分的代码也就是 20 行左右,挺简洁的。

运行的效果大概是这样的,数字是已经已经爬取了多少条链接,其实完全可以在一天或者两天内就把全站信息爬完的。

至于爬取后要怎么处理就看自己爱好了,我是先保存为 csv 文件,然后再汇总插入到数据库。

数据库表

数据库

由于这些内容是我在几个月前爬取的,所以数据其实有些滞后了。

数据总量

数据

查询播放量前十的视频

查询回复量前十的视频

各种花样查询任君选择!!视频的链接为https://www.bilibili.com/video/av + v_aid 
详细代码请移步至 bili.py,项目地址:chenjiandongx/bili-spider 欢迎围观

作者:陈建冬

原文来自微信公众号:Python中文社区


Python爬取B热门视频数据时出现`KeyError: 'list'`错误,通常意味着代码尝试访问字典中不存在的`'list'`键。以下是一些可能的解决方法: ### 1. 检查请求是否成功 确保请求B热门视频数据的请求成功,并且服务器返回了预期的响应。可以通过检查响应状态码和打印响应内容来确认。 ```python import requests url = 'https://example.com/bilibili/hot' # 替换为实际的B热门视频数据接口URL response = requests.get(url) if response.status_code == 200: data = response.json() print(data) # 打印响应内容,检查是否包含 'list' 键 else: print(f"请求失败,状态码: {response.status_code}") ``` ### 2. 使用`get`方法替代直接访问 使用字典的`get`方法来访问`'list'`键,这样即使键不存在也不会引发`KeyError`,而是返回`None`或指定的默认值。 ```python data = response.json() video_list = data.get('list') if video_list is not None: # 处理视频列表 for video in video_list: print(video) else: print("响应中不包含 'list' 键") ``` ### 3. 检查JSON结构 确认B热门视频数据的JSON结构是否发生了变化。可以通过打印响应内容或使用在线JSON解析工具来查看实际的JSON结构。 ```python import json data = response.json() print(json.dumps(data, indent=4)) # 格式化打印JSON数据 ``` ### 4. 处理可能的异步加载或反爬机制 有些网会使用异步加载或反爬机制,导致直接请求无法获取完整的数据。可以尝试模拟浏览器行为,添加请求头信息,如`User-Agent`、`Referer`等。 ```python headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36', 'Referer': 'https://www.bilibili.com/' } response = requests.get(url, headers=headers) ``` ### 5. 错误处理 使用`try-except`语句捕获`KeyError`,并进行相应的错误处理。 ```python try: video_list = data['list'] # 处理视频列表 for video in video_list: print(video) except KeyError: print("响应中不包含 'list' 键") ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值