@
littleqx 曾经做过类似的事情,给一些建议。
YouTube 信息抓取可以走 Google 的 API ,个人感觉 API 设计的比国内的视频网站合理很多。抓取的的方式是通过 playlist 来抓取下面 videoId ,然后存下或者扔队列,供之后下载。
这里有个小技巧可以拿到一个 channel 下全部上传的视频 playlistId ,首先找到 channel 的 id ,有的用户会自定义 channel 页面 url ,这样的可以去用户视频跳转链接里面找,形如『 UCxxx...』的一个字符串,然后把这个 channel Id 的前两个字母从 UC 改为 UU ,然后把修改后的 id 当做 playlistId ,调用接口,就能拿到这个 channel 下所有视频了。
所以爬虫循环抓取的种子列表就是自己整理的一个 UU 开头的 playlistId 列表。 YouTube API 支持 etag ,支持下可以少好多网络请求。
下载可以写 Python 脚本调用 youtube-dl 来做,需要限制下 mp4 格式,这样抓下来的视频大概是 720p 清晰度,更高码率其他格式声音画面有些是分离的,还得合并不划算。最好也限制下大小,有些几个小时超长的视频其实搬过来没啥用,根据抓的码率和要的时长来算下限制的大小。
下载上传基本流程就是读取下载队列的 videoId 把视频下载到指定目录,之后把 videoId 扔到上传队列。上传脚本通过读取队列,从本地目录查找到文件调用接口上传,上传后删除本地视频文件。下载上传脚本都可以根据情况开多个。
代理方面更倾向于国外的服务器只做代理,不跑逻辑,无论境内外服务器中间用的啥协议传输,最后都在境内服务器上封装成 HTTP 代理,给抓取和下载使用。
有一段时间没接触过这些了,可能有的信息比较旧,仅供参考。