使用Python爬取B站数据

简介

最近突发奇想,想获取一下B站上的用户数据做个分析啥的。这个东西已经有很多人做过了,所以网上的成功案例也比较多。但是不少的信息已经不适合现在使用了。比如一些使用api.bilibili.com的接口。这里记录一下趟坑的经历。

流程

由于我最初的目标只是通过用户名获得一个用户的个人空间地址。分析了一下url之后发现,所有用户都会通过一个自增的mid进行区分。

最初看的几篇教程中,获得用户的数据不仅可以通过mid这个参数,还可以通过用户名,也就是user字段来进行查询。即http://api.bilibili.cn/userinfo这个接口。但是发现这个接口已经不能用了。发送消息返回404状态。

那么就只有根据浏览器行为分析找找接口了。检查发现了一个这样的接口https://space.bilibili.com/ajax/member/GetInfo参数是mid字段。但是无法通过用户名获取mid。

接下来的想法是找找还有什么地方可以获取这个人的mid,比如试图抓取关注的up注的关注者,发现只能抓取前五页。或者是使用百度之类的搜索引擎的高级搜索,看看能不能搜索到相关的信息。

以上尝试都失败的情况下,尝试获取bilibili全部的用户数据。因为mid是一个从1开始自增的数据,因此可以用这种方法来遍历这些用户的信息,来找到相关的数据。

bilibili有接近一亿用户。直接单线程跑数据,一秒一条的话,需要27777个小时才能抓取完。时间太久了,尝试使用各种方法来缩短这个时间。

比如改成一秒发送两条请求。这个接口的限制貌似是一分钟100条左右,因此这里每0.5秒发送一个请求。

还可以开启多线程,利用ip代理池来发送请求,这样避免了ip被限制的问题。或许可以缩短一些时间。

此外还可以用其他手段缩短查找范围。因为mid这个字段是自增的,还可以查看注册时间,如果能获得账号的注册时间,就可以尝试通过注册时间二分查找这个账号的mid。

尝试使用参考9中的代理ip池来进行代理操作。按照这个代理池中的说明,安装了SSDB,然后开启了代理池。感觉没什么问题。

在代码中用requests的方式调用了代理池的接口,并使用代理访问查看本机ip的网址http://ip.chinaz.com/。代理的使用没有问题。

之后尝试使用代理拉取bilibili的mid为1到10的数据。表现良好。

尝试接入之前使用mysql写的数据库模块中。发现之前写的东西不支持多线程。需要加入多线程。暂时使用单线程来拉取数据,并写入数据库。看起来没什么问题。

多线程试图通过threading和multiprocessing模块来进行处理。还需要考虑中断的继续和现场的保存。

** 注意多进程之间的数据交互还是要使用multiprocess提供的方法,否则进程之间无法传递数据。 **

threading模块对于多核的使用没有multiprocessing好,一个是。multiprocessing能开启多个进程。这就涉及到了进程之间的通信问题。

开始的时候考虑实现一个能迭代的manager来返回下一个需要处理的mid,然后使用multiprocessing提供的pool和map方法来处理。但是这样产生了消息传递的问题。但是因为需要处理web请求的成功和失败,所以本来使用单例模式的manager在多进程中的共享产生了问题。

搜索了一下考虑使用multiprocessing提供的可供多进程使用的变量,如Value,Array等等。

使用的时候发现其实直接在主线程里对mid进行管理即可。这样需要获取一个拉取的状态。

保存现场最终选择在一个本地的文本文件中序列化了一串字符串,记录了多线程的处理状态和主线程mid管理的进度,方便下次继续。

拉取到的数据选择存储在本地的一个数据库文件中。Python内置了一个sqlite支持。使用这个创建一个db文件即可。

拉取数据的时候插入数据库使用replace而不是使用insert,因为断点续传的时候有可能会遇到id已经之前存储过了的状况。这种状况并不是难以忍受的问题,所以这样的容错处理就可以了。

最终拉取的数据还是要利用sql从数据库文件中获取。

总结

操作的所有代码在我的github上。

这次实践实际的掌握了一下前端页面的network请求以及Python对于数据的处理。虽然看起来量不小,但是其实并不难也没有设置太多的障碍。可以

参考文档

  1. B站API收集整理及开发
  2. 爬虫代理服务
  3. 基于Webmagic的B站用户数据爬虫
  4. python 爬虫 ip池怎么做
  5. 基于Webmagic的爬取B站用户数据的爬虫
  6. Python利用B站API获取视频信息
  7. 抓取了BiliBili能获取哪些数据
  8. Bilibili数据接口整理
  9. Python爬虫代理IP池
    原文作者:Fengya
    原文地址: https://www.jianshu.com/p/d023b8e376fb
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞