bilibili爬虫

一、背景需求

1、抓取内容:给定关键词,并指定分区,获取该分区下的所有视频,同时,该视频如果是一个合集中的子集视频,则抓取该合集的所有视频
2、抓取字段:作者、标题、分区、详情页链接、发布时间、封面图、下载链接、标签、播放量、点赞量、评论量、弹幕量、收藏量

二、需求分析

1、app端分析

抓包后发现,搜索页的接口没有进行加密,将指定的分区映射成对应的分区id,结合关键词,可以构建请求url,获取数据
详情页数据,请求参数中有加密字段,pass

2、手机端H5页面

通过app端搜索页获取的数据,可以构造手机端H5页面的详情页请求链接,如 https://m.bilibili.com/video/av39053212.html ,通过正则匹配获取所有数据,该页面基本可以获取需要的数据,但是有几个数据有些问题

  • 弹幕数:该视频为合集的情况下,获取的弹幕数是所有子集的弹幕数,而不是每个子集的弹幕数
  • 封面图:合集时,所有子集封面图都一样
  • 下载链接:合集时,需要另外请求其它子集的下载链接

通过点击其它子集视频,可以找到获取下载链接的ajax请求,获取下载链接

  • 下载链接无法在电脑端H5页面打开,手机端H5页面有时打不开,但是将链接发到微信上,是都可以打开的
  • 下载链接有时效性,大概2小时就会过期
  • 通过手机端H5获取的下载链接,清晰度过低,无法满足需求

3、电脑端H5页面

  • 防盗链:通过抓包同样找到下载链接的ajax请求,但是获取的下载链接无论在H5页面,还是微信上,都是403错误,一开始以为获取的下载链接有问题,最后通过代码下载该视频时,发现headers中必须加上referer字段才能请求成功
  • 音频视频分离:获取下载链接后,下载视频,打开后有些没有声音,观察接口返回数据,发现有两个下载链接的列表,一个是video, 一个是audio,也就是音频和视频分别是两个链接,解决办法:
    • 1、过滤音视频分离的视频:该接口返回的下载链接有两种形式,一种是音视频分离的,另一种是正常的视频,最终过滤了大概65%左右的视频
    • 2、将音视频合并:ffmpeg -i 55.mp3 -i 55.mp4 output2.mp4, 这种合成太占用cpu,且目前下载部分不支持传递两个链接进行下载拼接,故pass

三、整体流程

采用scrapy-redis实现分布式,构造两个爬虫

1、搜索页爬虫:

  • 目的:获取所有符合要求的视频ID
  • 流程:通过关键词+分区,构造请求,将获取的视频id存入详情页爬虫的消费队列

2、详情页爬虫:

  • 目的:获取视频的信息
  • 流程:从redis中获取视频id,构造请求,获取数据,并通过视频id及子集视频对应的id,构造下载链接的请求,获取下载链接

数据存储在mongo数据中,并通过数据库进行数据去重

四、总结

  • 下载链接:时效性,低清晰度视频只能在微信中打开,高清晰度视频存在防盗链,音视频分离问题
  • 抓取流程:app端搜索页数据->手机端H5详情页数据->电脑端H5下载链接

猜你喜欢

转载自blog.csdn.net/weixin_41074255/article/details/90510171