基于Webmagic的爬取B站用户数据的爬虫
github: https://github.com/Al-assad/Spider-bilibiliUser-active
数据示例样本:http://pan.baidu.com/s/1dFchDZj 验证码:b2fi
学校数据挖掘作业要弄一个聚类分析,我就想不如到我大B站搞搞事情吧,于是开始研究B站用户数据的获取接口;
B站现在大概有1亿左右的有效用户,由于时间的限制,爬取全部的用户对于作业的期限是肯定来不及,于是我选择爬取活跃用户(高关注数和高被关注数用户),B站的用户主页如下:
爬虫设计思路
打开F12调试器后,发现该页面是一个前端渲染页面,通过css或xpath无法获取到动态渲染的节点的数据,于是选择通过JsonPath获取json文件的数据,使用的时FrieFox自带的调试工具该页面的是主要用户数据接口为: http://space.bilibili.com/ajax/member/GetInfo,发送方式为POST,参数为 mid(用户ID);
这里推荐一个很不错的Web调试工具:Fiddler 4;
结果我写得的前嗅程序发现,该接口的反爬虫机制为对IP的接入频率,上限大概为 150~200 次/分钟,解决方式大概有2种:
1. 减低爬虫爬取频率;
2. 使用IP代理池,更具请求频率调整更换IP频率;
出于公共道德考虑,我选择了第一种方式(其实是因为我之前爬取的公共IP池里面大多数IP已经失效,懒得再爬取,况且这也只是一个作业而已就随便应付了);
接下来是解决请求跳转,通过调试工具的抓包,发现用户的关注对象、被关注对象的数据接口为:http://space.bilibili.com/ajax/friend/GetAttentionList?mid=633003&page=1, http://space.bilibili.com/ajax/friend/GetFansList?mid=633003&page=1,请求方式为GET,参数mid为用户ID,page为页数;
在这两个数据接口B站的反爬机制为限制页面访问,客户端最多只能访问前5个page,也就是说page取值为1~5,每page返回的json有20个用户数据对象,也就是一个用户最多只能跳转200个用户(估计B站被爬怕了),这我没想到其他的解决方法,只能暂时这样;
解决了爬取逻辑后,接下来解决数据持久化的问题,由于之后要使用rapidminer进行数据挖掘,于是使用MySQL储存数据,也方便之后对数据进行筛选,ADO层引擎使用JDBC;
爬虫引擎选用黄亿华前辈写的 webmagic ,Webmagic是一个小巧强大、支持多线程,可定制的垂直爬虫引擎,这里给大家安利一个;