提供另一种方式的采集《 youtube批量采集-低成本解决方案-2》
https://blog.csdn.net/ucsheep/article/details/85066173
背景:对于我们这些国内玩家而言,实现youtube视频爬虫和批量采集有先天性的遗憾。起初,公司需要一大批的youtube视频,时长3分钟左右,720p下载的话,每视频30-50M左右。公司雇了一大批人,采购科学上网神器手工下载 ,无奈,效率之低令人发指。所以老板要我做爬虫自动采集,需求每天下载2000+个视频,视频存储需要提高国内访问速度,方便合作方的程序抓取我们的内容。
需求来了,接招
第一步,盲人摸路:
分析了一下需求,需要解决的技术节点就三个
1.输入一个youtube创作主页面链接,输出该创作主发布的所有视频,包括此视频封面、标题、播放页链接
针对第一点,首要解决的是访问外网,有两种选择,国外vps和直接购买位于国外云主机。在选择之前,首先要清楚的是,我们每天的下载流量差不多60-80G。而vps的免费流量有限,无法达到需求,云主机按带宽购买,流量没有限制,出于成本考虑,选择云主机。
从财务领了90块钱买了腾讯云位于法兰克福的一台海外云主机一个月,1G1核1M带宽,够用了。至于为什么买腾讯云的呢?其实我们的合作方就是tx,习惯性到了腾讯云,价格比较一下无甚差别,此外出于对第3点的考虑,存储时可以用腾讯云对象存储,抓取效率或许会有增益。
登陆云主机第一件事情,ping www.youtube.com ,可是糟糕了,无应答。怎么回事?看了一下对应ip地址,有点问题,应该是dns的锅,看一下/etc/resolv.conf,问题果然出在这里,腾讯云海外云主机默认使用腾讯云dns服务,这怎么能行(我猜测,原因无外乎两点,1.腾讯云团队的系统镜像制作问题2.或许是法律法规原因)不过也没关系,手动修改,直接换google的dns。测试,访问成功。
接下来,youtube爬虫。youtube页面动态加载,采集这块不想耗费太多时间,而且对速度要求不高,每天需求才2k,所以直接python+selenium+phantomjs,模拟浏览器翻页,把某创作主的所有视频爬到手,存到数据库。不一会,第一个技术节点已经轻松解决!
2.输入一个youtube视频播放页链接,输出一个视频,mp4格式
这块稍稍花了一些时间,原因是希望找到一种提供api的可以直接获取一个下载链接的方式,这样或许可以节约存储成本。google搜索youtube download,有很多第三方网站可以输入一个链接,设置码率然后直接下载,但是很抱歉,并没有一家提供api的。
紧接着,去看了Youtube API,由于没有中文文档,颤抖着读完了英文文档,youtube也没有下载的api,不过,我也发现了一些不错的功能,比如可以通过作者name,或者频道id直接获取播放列表,然后拿到视频详情,这样,爬虫或许是有办法使用Youtube API来实现的,在后续的功能增加中,youtube API也帮了忙,比如在我们的视频审核页面加一个youtube源地址播放,在页面嵌入youtube提供的代码就实现了。
最终,还是选用了强悍的youtube-dl,我们的1M带宽渣渣配置,youtube视频下载速度平均可以达到1.3M/s以上。这样算下来,这样的配置我们就可以实现每天2k+视频的下载需求了。下载需求解决了,视频存储迫在眉睫。
3.输入一个mp4格式的视频,输出一个国内可以轻松下载的链接
视频存储的难点在于,需要在海外就近解决的同时,对国内网络的下载速度不至于太低。使用腾讯云在法兰克福地区的对象存储测试,国内下载速度基本满意。本来希望在一台服务器一边下载一边上传,但是问题来了,上传进程显示上传速度奇慢无比,半小时传一个30M视频。很恼火,但突然之间我也意识到了问题所在。之前为了解决外网访问,我们替换了腾讯云的dns服务,这也意味着腾讯云在海外的数据中心应该是一个庞大的网络,本来可以就近访问,却硬生生绕了巨大的一个圈子!
但是我们还不可以变动这台服务器的网络环境,索性,再搞一台。又和财务领了90块钱,同区买了一台同等配置的服务器,单独作为上传服务。在不更换dns的情况下,文件上传速度果然很喜人,是下载速度的5倍以上,这也意味着,假如我们的需求扩展到每天1w个视频,我们只需要再有4倍的下载性能就解决了,所有的下载的视频都推给上传服务去解决。
由于两台机器处在同一网段,我配置两台机器ssh免秘钥登陆,这样就可以使用内网ip在两台机器之间复制文件(哈哈哈,之前搭Hadoop集群的时候正好做过),速度很快!秒传!600M的文件,1s搞定。
到此,第三个技术点也解决了。
第二步,实现
说来说去,无非是把上面三个点串起来,形成一个链条就OK。
第三部,跑起来
跑了一天,下载并存储了2533个视频,使用内存75G。
我的收获
短短几天,这样一个项目下来,
首先、公司每个月在服务器加存储方面的成本在500RMB以内,效率大幅度提升,省去很多人员工资成本。我为公司创造了不小的价值!
其次、我对于海外网络环境下的开发积累了一定的经验,对于YouTube API做了很多了解,认识了youtube-dl这个神器!
写在最后
我相信,看到这篇文章的差不多都是搞搬运的,好自为之。