YouTube视频爬虫-批量采集-低成本解决方案-技术难点和细节回顾

2019-01-23 20:56:57

提供另一种方式的采集《 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这个神器!


写在最后

我相信,看到这篇文章的差不多都是搞搬运的,好自为之。


  • 2019-02-15 10:36:45

    将MP4转成m3u8

    网上很多垃圾文章推荐segmenter工具,但用的时候,3.5G的ts文件丢了一半的数据,于是想到了ffmpeg转。

  • 2019-02-19 10:01:55

    node下使用open模块在指定浏览器下打开url

    最近在做一个项目的过程中,得到一个远程二维码图片的url,需要扫码登录,每次都是在控制台发url打印出来,再复制粘贴到浏览器的地址栏中打开扫码,整个过程过于繁琐,于是想找一个模块,直接在node下,指定浏览器打开该图片。这样可以省不少事。

  • 2019-02-24 09:47:09

    解决Node.js的命令行输出中文乱码问题(也适用于Electron)

    ​一般我们的js文件都是试用utf8编码保存的,但是中文windows的命令行一般默认使用cp936编码(就是gbk),这样我们用js代码 console.log('中文');输出日志的时候,会发现输出的是乱码。 网上有提供一些解决方案,典型的就是用iconv或iconv-lite,把这些中文字符串先转成gbk再输出。 但是这个方案我试了多次,在win10的命令行下,utf8的字符串是成功转成了gbk字符串了(通过打印Buffer可以见到),但是输出还是乱码。