背景

上周去做了一个团体核算检测,三天后拿到了结果。直接从他们的机构的官方网站查询就行了,报告格式是PDF,因为整个过程除了输入身份证号和姓名之外,并没有其他的身份校验,所以好奇性地把最终报告的页面地址直接在隐身模式下打开,结果….有下文了,又是一个专门为爬虫设计的简单系统,前端是php,后台是Java。没有登录,没有验证码,没有请求次数限制,就好像是在说:服务全开,全开!

下载

报告分移动端和PC端两个版本,仔细看了前端的JS脚本发现都是走的同一个接口,只不过移动端是把最终的pdf内容转成了图片格式。直接在Network inspector里面找到了下载报告的XHR请求,导出对应的curl命名,贴在命令行运行就可以直接运行了。参数大概是这样的(已脱敏):

curl 'http://the/post/url' \ -H 'Connection: keep-alive' \ -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36' \ -H 'Content-Type: multipart/form-data; boundary=----WebKitFormBoundarybfGJ0I90Seu9Ywjc' \
  

背景

下午从某个搞笑视频里听到火影忍者里面的OP,突然很想重温一下其中的一部分剧情,想起几年前最后一次更新的本地库里的集数并不全,有些集数还因为数据来源混乱的原因分辨率特别差。索性想办法这次更新一个完整集合,结合我最近知道的一个爬数据利器。

非(shi)常(zai)感(bao)谢(qian)优酷为我们提供的数据支撑,目前我看到的是所有数据全部无限制可播,所以我应该不用考虑VIP权限和cookie的问题了。下载方法优先想到的是you-get,虽然下载过程中发现有些问题,不过还是想办法绕了过去。其中最大的问题就是--playlist / -l没有生效,貌似是输入url类型不对,不过我始终找不到优酷关于这个播放列表的页面逻辑,貌似并不存在想youtube那样的playlist的单独页面,它只有单集的播放页面,播放列表是嵌套在所有单集页面的右侧的,you-get目前的实现可能还没有覆盖到那一部分数据解析,所以始终提示我找不到下一集。

不想在这个时候去给他们修bug,只能想办法手动找到所有单集的页面地址,然后一一传给you-get去处理了。找了前几集的页面url看了一下规则,也是有规则可寻的,但是优酷在集数之外又有一层分组的逻辑,比如第1-30是第一部分,第31-60是第二部分,依次类推…每个部分的单集url又不一样,这就开始无聊了….我尝试直接在shell里用for生成批量的url然后下载,有两个问题,每个集数部分的URL会不一样,我需要重新不断更换格式化字符串,其次是页面中目前的url中夹杂着特殊符号包括!~,这些符号好像会在shell里面直接被展开,加双引号都没起作用。直接放弃了。

Web Scraper

祭出大杀器Web Scraper,之前看了官方的几个引导视频,但是目前还是不会用太高级的功能,就直接从最基础的操作入口。Create new sitemap -> Input a start-url -> Add new selector -> Input a name ->

Read More

爬虫的开源项目已经满天飞了,各式各样的姿势都有,但是一旦中断维护的项目几乎就算是废掉了,因为网站改版了或者服务升级了。

起初好像是我发现A站上有各种搞笑视频拼接起来的合集,把各种小视频片段拼接起来,然后选择性加一些文案到视频里面,热度都还挺高,所以我想了一下自己实践的可行性。

  1. 首先需要视频素材,小视频片段很容易爬,比如从Twitter上下手。
  2. 需要有一个收集方法,比如从某些po主的首页爬,也可以是自己的点赞过包含视频的Twitter。
  3. 所有爬取的视频存储在本地,生成每日或者每周的视频合集。
  4. 通过ffmpeg合并视频,选择性加一些文案。
  5. 上传视频的自动化。

但是慢慢开始写的时候很多想法又变了,比如:

  1. 核心的操作其实还是下载和上传的自动化,加上任务的自动化管理,所以就放弃了从Twitter上爬视频。虽然我很久之前就写过爬Twitter的各种媒体资源,但是不想一开始就把重心放在视频片段管理和合并的逻辑上。

  2. 最后转向从youtube上爬取,因为相比之下不需要管理片段和合并的操作了。

    但是这么做还是会有一些侵权风险。

  3. 上传视频到A站的自动化应该是我给自己挖的最大的坑了吧,因为我用了Selenium,但是没有一次性考虑好运行环境的问题。

    1. 起初并没有想那么多,打算写完了部署在Google Cloud (GCP) 或者Raspberry Pi 3B+或者家里的mac-mini上的,考虑用Selenium还是没什么大问题的。优先选择GCP的原因是从youtube上下载速度必然非常快,但是上传到A站服务器一定会慢,但是应该还能接受。

    2. 用Selenium的时候最开始我用的是Chrome/chrome-driver,平时不觉得,但是在gcp上跑的第二天后就提醒我该系统升级了,内存已经超载了,GCP应该是有一个tolerance time,前面几天运行没有问题,但是很快就炸了。由于某些不可描述的原因,我还在薅GCP那300刀的羊毛,创建的实例只有0.6G的最低内存配置,升级系统会加速消费速度,猜测还会影响其他已经在运行的其他服务的带宽,所以最终迁移到了Raspberry Pi上。

    3. 家里的RPi最近一次用是用来部署一个Kodi结合Plex的家庭影音平台,后来因为搬家的原因所以基本闲置了。我忘了几年前买它时候的配置,那还是一个armv7l的32bit架构。Chrome又坑了我一次,不知道具体从什么时候开始,Google放弃了支持32bit的Chrome for linux。这下完犊子了,我在Debian 9上各种尝试找到最后一个支持32bit的chrome和chromedriver安装包,尝试dpkg离线安装但是死活不成功,好像是依赖库的版本和其他软件不兼容的问题。

    4. 实在没办法了,Selenium还是支持不少其他webdriver的,优先考虑的自然是Firefox,庆幸的是FF还是一直32bit的(给Mozilla点个赞!),安装过程很顺利。但是运行过程中又碰到了一个奇怪的问题,辗转几次定位到了是virtual display的问题。奇怪的是在GCP上使用Chrome并没有问题,不知道是GCP还是Chrome做了额外的处理。

      UPDATE