年轻小伙竟用python爬取B站视频评论!

大家好,我是啃书君。

今天为大家带来的小demo是爬取B站视频的评论。开始还以为很难,等正真上手的时候发现,也就是那么回事。

高考对于每个人来说都是人生的重大转折点,你考上一所什么样的大学,极大可能改变你未来的人生。因此,读书很重要,读书可以改变自己的命运。

衡水中学的张锡锋,想必很多小伙伴们都认识吧,也是他激励了大多数人的学习热情,他的19年演讲视频在B站已经有1574万的播放量了,最近又出了一个新的视频《无产阶级的孩子跨越阶级的希望》,目前还没有多少人看,没有火起来。因此,我就爬取他在19年衡中的演讲视频,抓取评论数据。

网页分析

和之前的不太一样,在以前,B站视频的评论是一页一页进行加载的,但是现在经过测试发现,目前它是通过Js经行渲染的,想通了这一点,那就可以马上去找接口了。

将滚动条不断往下拉的时候,便也加载出来了我们需要的数据包,数据包里面就有我们需要提取的数据。当我继续往下拉的时候,出现类似的数据包越来越多,接下来要做的就是分析这些数据包。

数据包分析

https://api.bilibili.com/x/v2/reply/main?callback=jQuery17203842468693368224_1623154626698&jsonp=jsonp&next=2&type=1&oid=53043610&mode=3&plat=1&_=1623156094225

https://api.bilibili.com/x/v2/reply/main?callback=jQuery17203842468693368224_1623154626699&jsonp=jsonp&next=3&type=1&oid=53043610&mode=3&plat=1&_=1623156100241

https://api.bilibili.com/x/v2/reply/main?callback=jQuery17203842468693368224_1623154626700&jsonp=jsonp&next=4&type=1&oid=53043610&mode=3&plat=1&_=1623156846207

https://api.bilibili.com/x/v2/reply/main?callback=jQuery17203842468693368224_1623154626701&jsonp=jsonp&next=5&type=1&oid=53043610&mode=3&plat=1&_=1623156849736

上面的是四个数据包的请求地址。

从上面的URL地址以及图片,可以看出一共有8个查询参数。

  • callback:每加载出一次便加1操作。
  • next:每加载一次便加1操作,next是从0开始加载的。
  • _:13位的时间戳。

理清楚了这些,写起代码,那还不是顺风顺水吗?

获取数据

def get_json(url):
    response = requests.get(url, headers=headers)
    text = response.text[41:-1]
    json_data = json.loads(text)
    return json_data

运行结果,如下所示:

接下来对上面的代码做简单的解释

text = response.text[41:-1]

这里做了一个切片,因为在这个数据包内获取的数据并不是json格式的,而是字符串。如下图所示:

除了上面框起来的内容要去掉以外,还有最后还有圆括号的另一半也要去掉,这样才能保证截取下来的数据是json格式的。

提取数据

因为,我们要获取的数据都在replies里面,因此我的目标就是先提取到replies里面的数据即可。

代码如下所示:

def get_data(datas):
    replies = datas['data']['replies']
    return replies

运行结果,如下所示:

从上图可以看到,已经拿下了replies下的所有数据信息。

我需要的数据信息有:

  • 用户名
  • 性别
  • 个性签名
  • 评论
  • 评论时间
  • 点赞数

具体代码如下所示:

def save_data(replies):

    for reply in replies:
        message = reply.get('content').get('message')
        ctime = reply.get('ctime')
        content_time = time.strftime('%Y-%m-%d %H:%M', time.localtime(ctime))
        like = reply.get('like')
        uname = reply.get('member').get('uname')
        sex = reply.get('member').get('sex')
        sign = reply.get('member').get('sign', '什么都没有写')
        print(uname, sex, sign, message, content_time, like)

运行结果,如下所示:

实现翻页爬取

在前面所描述的内容,都只是爬取一页的数据,因此,接下来我要实现类于翻页爬取的效果。

其实只要修改我上面所描述的3个查询参数即可。

具体代码,如下所示:

def main():
    for i in range(1000):
        try:

            print(f'正在获取第{i}页')
            time_thick = int(time.time()*1000)
            url = f'https://api.bilibili.com/x/v2/reply/main?callback=jQuery17205968577164832078_{1623221229967+i}&jsonp=jsonp&next={i}&type=1&oid=53043610&mode=3&plat=1&_={time_thick}'
            datas = get_json(url)
            replies = get_data(datas)
            save_data(replies)
        except:
            continue

    print('爬取完毕')

保存数据

最后将爬取下来的数据,保存至CSV文件中,一共获取到了9千多条数据。

### 如何用 Python 爬取 B 用户的粉丝列表 要通过 Python 实现爬取 B 用户粉丝列表的功能,通常需要调用 B 公开的 API 接口来获取目标数据。以下是具体实现方式: #### 使用 B 官方接口 可以通过访问 B 的关系统计接口 `https://api.bilibili.com/x/relation/stat` 来获取指定用户的关注者数量和其他基本信息[^3]。然而需要注意的是,该接口仅返回简单的统计数据(如粉丝总数),而无法直接提供完整的粉丝列表。 为了进一步获取详细的粉丝列表信息,则需利用另一个更复杂的接口地址 `https://api.vc.bilibili.com/following/v1/Following/follower_list` 或类似的路径结构来进行请求操作[^1]。此过程可能涉及分页加载机制以及身份认证等问题。 #### 请求头设置与参数说明 在发送 HTTP GET 请求之前,请确保设置了合适的 User-Agent 字符串模拟真实浏览器行为;同时还需要传递必要的查询字符串参数,比如 mid (即 UP 主 ID),ps 表示每页显示条目数目,pn 则用于标记当前所在页面编号等[^2]: ```python import requests headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)', } params = { 'vmid': '<target_user_id>', 'ps': 50, 'pn': 1, } response = requests.get('https://api.vc.bilibili.com/following/v1/Following/follower_list', headers=headers, params=params) print(response.json()) ``` 上述代码片段展示了如何构建基础版本的数据采集脚本框架^。其中 `<target_user_id>` 应替换为目标UP主的实际UID值。 #### 数据解析处理 接收到服务器响应后,应先判断状态码是否正常再继续后续逻辑运算。如果一切顺利的话,就可以从 JSON 结果集中提取所需字段并保存至本地文件或者数据库当中去了: ```python if response.status_code == 200: data = response.json() followers = [] if 'data' in data and isinstance(data['data'], dict): items = data['data'].get('items', []) for item in items: follower_info = {} user_profile = item.get('owner', {}) follower_info["username"] = user_profile.get("name", "") follower_info["uid"] = str(user_profile.get("mid", "")) followers.append(follower_info) else: print("Failed to retrieve the page.") ``` 以上部分实现了初步的信息抽取功能^。最终得到的结果将会是以字典形式存储的一系列追随者的用户名及其对应的唯一标识号组成的列表对象。 #### 注意事项 - 频繁发起网络请求可能会触发反爬策略从而导致 IP 被暂时封禁。 - 对于某些特殊账号而言,其个人主页可能存在额外的安全防护措施使得常规手段难以奏效。 - 尊重网服务条款,在合法合规的前提下开展活动。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值