这几天在做b站的一个爬虫项目.
先放api. 感觉爬虫阶段最难的地方就在于通过抓包或者其他手段来找api了, 需要与被爬网站斗智斗勇. 但是说实话b站对爬虫还算比较友好的了. 像京东什么的都需要直接上selenium了.
https://api.bilibili.com/x/web-interface/view?aid={}
aid应该是递增的. 所以从某个值开始遍历就可以了. 中间可能会碰到一些已经被删除了的视频, 这时返回的json文件中是没有”data”这个标签的, 直接跳过即可.
注意, 爬的太频繁会被封ip. 我自己的测试中, 不控制发送请求的速度的话会很快被封, 如果控制爬虫1秒1次请求的话在爬取3000次左右被封. 如果控制爬虫2秒1次请求的话在爬取7000次左右被封. 所以买ip池才是王道.
这里我是从aid = 40000000 开始遍历的. 对应的时间是2019年1月左右. 视频的发布时间越早, aid越小. aid = 30000000的时候就是对应2018年8月左右的时间了. 想要爬取特定的某个时间段的话就可以酌情增减aid.
爬下来的所有信息都是json格式, 很方便解析. 下面说明各个字段的含义. 参考于github和知乎上各种b站爬虫项目. 以https://github.com/SocialSisterYi/bilibili-API-collect/blob/master/video/info.md 为主
1 | insert into av_interpret(columnName, interpret) values("bvid", "视频的bvid号, 唯一"), ("aid", "视频的av号, 唯一"), ("videos", "01变量, 代表是否为视频"), |
现在, 我们获得了每个视频对应的up主mid字段. 但是不清楚up主的相关信息. 例如粉丝数等.
我们还需要一个api, 通过mid获取对应up主的全部信息.
https://api.bilibili.com/x/web-interface/card?mid={}&jsonp=jsonp
爬取下来的json各个字段含义如下所示
1 | insert into up_interpret(columnName, interpret) values("mid", "up主id"), ("name_", "up主昵称"), ("sex", "up主性别"), ("fans", "粉丝数"),("friend", "up主关注的人数"), ("sign", "个性签名"), ("current_level", "当前等级"), ("pendant_id", "头像挂件id"), ("pendant_name", "头像挂件名称(头像挂件仅手机端可见, pc端不可见)"), |
所以接下来就可以用mid作为外键连接两张表了. 爬虫到此结束. 源代码如下所示.
1 | import time |
1 | import time |