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这个神器!


写在最后

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


  • 2018-11-17 23:25:38

    Android高效内存1:一张图片占用多少内存

    在做内存优化的时候,我们发现除了解决内存泄露问题,剩下的就只有想办法减少真实的内存占用。而在App中,大部分内存可能被我们图片占用了,所以减少图片的内存占用可以带来直接的效果。本文就简单介绍一张图片到底占用多少内存,我们先假设我们有一张图片时 600 * 800 的,图片占用空间大小假设是 100KB。另外本文知识点也是面试官喜欢问的一个点,看看自己的回答到什么级别了。

  • 2018-11-18 09:06:06

    Android子线程中更新UI的3种方法

    UI的更新必须在主线程中完成,所以不管上述那种方法,都是将更新UI的消息发送到了主线程的消息对象,让主线程做处理。

  • 2018-11-19 15:10:23

    nodemailer的使用,nodejs发送邮件

    前段时间有个很普通的项目需要发邮件的功能,而且是刚开始学nodejs,所以只是搜索了下用什么好的库能实现,就找到了nodemailer了。这篇文章主要是记录一下使用的过程和经验。

  • 2018-11-21 09:07:37

    Android为每个应用分配多少内存?

    熟悉Android内存分配机制的朋友都知道,Android为每个进程分配内存时,采用弹性的分配方式,即刚开始并不会给应用分配很多的内存,而是给每一个进程分配一个“够用”的内存大小。

  • 2018-11-22 21:13:28

    webview之独立进程

    app内存占用大,被系统回收的概率就高,当每次把app切到后台再回到app时,可能每次app都会重启,最常见的是activity或fragment被回收了,导致fragment使用activity的数据时,出现NullPointerException。内存占用大,app越不稳定。运行性能差。webview加载页面后会占用更多的内存,从而导致app内存占用大,最终导致出现以上问题。

  • 2018-11-22 21:14:34

    为什么要采用WebView独立进程

    App中大量Web页面的使用容易导致App内存占用巨大,存在内存泄露,崩溃率高等问题,WebView独立进程的使用是解决Android WebView相关问题的一个合理的方案。

  • 2018-11-22 21:15:45

    Android WebView: 性能优化不得不说的事

    Mo说:大家通过前两篇文章想必都能顺利的 get 到 WebView 与 JavaScript 交互的技能了。现在 App 嵌入 H5 页面已经是稀松平常的事情了,开发者要面对 WebView 也越来越多的爆发出来,比如页面加载慢,内存泄露,不同 Android 系统版本采用了不同内核的兼容问题等等。 所以当我们使用了 WebView 这个组件的时候,性能优化的事情就不能不提上议程了。这篇文章我们就针对上述问题来总结下 Android WebView 性能优化的常见方法。 作者:MoTalksCn_林墨 链接:https://www.jianshu.com/p/95d4d73be3d1 來源:简书 简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。