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

起初好像是我发现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

Read More
Unix Process State

问题

有时候会在晚上睡觉之前开始在mac mini上下几个大文件或者跑brew update,等命令跑到一半发现不想再继续等下去了,因为等待的时间比预期的远远要长。我又不想因为一句命令让机器一整晚上都运行着,还是想着应该让这个命令结束之后再立刻休眠(pmset sleepnow)。

于是问题来了,我要么找到结束当前正在一直运行的这个命令再重新编辑(追加&& pmset sleepnow)达到效果,要么想办法找到那个进程执行完毕的那个时间点。其实对于brew update这类命令的话,结束执行再跑一点儿关系都没有,主要还是针对curl和封装了curl的任务,毕竟杀掉了重新来过一般只能重新开始。

思路

在这之前我是知道jobs, fgbg这几个常用命令的:一个在运行的程序,如果我发送Ctrl+Z的组合时间给它,就相当于挂起(suspend)了这个进程,这个时候开始它只能等待恢复(或者直接被杀掉)。jobs能直接查看到当前shell的进程列表中所有的任务列表,通过fg可以把最顶端挂起的任务恢复并分发到前台运行模式,相当于把目标任务提到了当前shell的正在执行的命令模式,相当于接替上一个状态继续执行。bg的作用基本一致,区别在于目标任务被分到了后台运行模式,当前shell仍然处于带输入模式接受下一个命令的执行。如果不考虑stdout或者目标任务的stdout被重定向到了其他文件,bg会表现得目标任务不存在一样,直到执行完毕会从后台运行模式下输出一个进程执行完毕的提示。

sleep举例:

➜ ~ 
  
Code Review Service

There is a wonderful channel called Code Review in Stack Exchange, it provides for a kind of question and answer style to review code for programmer.

Code Review Stack Exchange is a question and answer site for peer programmer code reviews.

Code Review不是一个新词,甚至是老生常谈。这次我们不讨论它的方式和规范,而是从商业的角度上看待这个问题。没有国外IT公司的开发经历,我们只基于国内的开发环境来看待这个问题。

论点