使用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从数据库文件中获取。

总结

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,036评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,046评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,411评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,622评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,661评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,521评论 1 304
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,288评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,200评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,644评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,837评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,953评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,673评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,281评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,889评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,011评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,119评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,901评论 2 355

推荐阅读更多精彩内容

  • 必备的理论基础 1.操作系统作用: 隐藏丑陋复杂的硬件接口,提供良好的抽象接口。 管理调度进程,并将多个进程对硬件...
    drfung阅读 3,541评论 0 5
  • PYTHON爬虫入门&视频网站BILIBILI用户爬取爬虫详解 前言 Python使用版本:2.7 得到数据挖掘的...
    phenanthrene阅读 2,568评论 0 1
  • 一、简历准备 1、个人技能 (1)自定义控件、UI设计、常用动画特效 自定义控件 ①为什么要自定义控件? Andr...
    lucas777阅读 5,202评论 2 54
  • 4月17日,晴。 阅读书目:《强者的逻辑》。 作者:高原,是中国图书“潜意识”类题材最畅销的作家。他在潜能引导、自...
    陈陈_19b4阅读 289评论 0 1
  • 一年始一年终,今天是所有日子里过得最悠闲最放松的一天了。没有了家务没有了琐事的打扰,可以静静的思考。。。 接触的人...
    艾赵霞阅读 329评论 0 0