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-04-01 23:20:58

    隐藏在图片中的密钥

    在客户端开发的时候,有时需要把密钥保存在本地。这时就会遇到密钥安全性的问题。要保证密钥安全性,无非就是混淆、隐藏、白盒等手段。本文以隐藏在图片中来阐述密钥的安全保存。

  • 2019-04-01 23:22:33

    验证数字签名

    应预先设置验证首选项。在打开 PDF 后显示包含签名的验证详细信息时,这有助于确保数字签名有效。有关详细信息,请参阅设置签名验证首选项。

  • 2019-04-01 23:23:27

    图像隐写之使用PHP隐藏图像中的文本

    隐写术是一门研究隐藏信息的科学艺术,通过隐写术,可以只让发送者和接收者知道隐藏的信息。 图像隐写术则是研究将数据隐藏在图像中,通过该技术可以防止无关用户发现这些隐藏的信息或数据。

  • 2019-04-08 16:01:57

    Window 设置pm2开机自启动服务

    下面用 pm2 来启动我们自己的服务程序 app.js, 然后告诉 pm2 开机后自动运行我 app.js 继续在管理员命令行下, cd 到 app.js 所在目录

  • 2019-04-10 17:25:21

    Joda-Time详解,最好用的java时间工具

    任何企业应用程序都需要处理时间问题。应用程序需要知道当前的时间点和下一个时间点,有时它们还必须计算这两个 时间点之间的路径。使用 JDK 完成这项任务将非常痛苦和繁琐。