查看原文
其他

如何抓取视频资源-以头条视频为例

2017-06-04 大邓 大邓带你玩python

今天淘宝上接了单爬头条视频的活,晚上刚刚交付。😆想到之前写的爬虫都可以爬文本、图片,好像视频这种多媒体资源我还没有写过。

今天咱们就以头条视频为例,写个爬虫,当然是简化版,重在分析思路。

一、爬取思路

  1. 分析网页源码,查找解析出视频资源url

  2. 对该url发起请求,返回二进制数据

  3. 将二进制数据保存为视频格式

上述是大的框架,具体实施肯定要比上面多一些步骤。下面咱们开始实例部分。

二、头条爬虫分析

打开头条视频,刘涛上新闻了。真是佩服刘涛,一个人帮其丈夫还债4个亿。反正我是挺佩服的,按照年薪十万,大邓十年100万,一百年赚1000万,,,4000年才能赚到赚4亿。

从挣钱的角度来说,人与人的差距不是一般的大,其区别之大远甚于人与狗的区别。啊,扯远了!!

  1. 视频主页网址

  2. http://video.eastday.com/a/170602114054589846059.html?indexlbt

查看网页源码,希望在其中查找视频格式,如mp4、rmvb、mov等,这里我就直接搜mp4试一试。


哇,还真的搜到了。这里出现的第一个mp4似乎是一个视频网址,我们复制到网址框,试一试这个链接


在浏览器中真的是视频,而且是我们要找的视频链接。



三、开始撸代码

3.1 访问视频主页,获得该主页html文件

在部分,对主页的url发起请求,查看返回的数据中是否包含刘涛的视频链接。 

  1. import requests


  2. main_url = 'http://video.eastday.com/a/170602114054589846059.html?indexlbt'

  3. resp = requests.get(main_url)

  4. ##没有下面这行,打印的结果中文是乱码

  5. resp.encoding='utf-8'

  6. html = resp.text

  7. print(html)

在打印结果(下图)中,成功查找到mp4,找到了视频链接,这说明本部分请求代码正常。 


 


3.2 解析视频链接

我们发现那个mp4视频链接,是在javasrcipt文本中,并不是html文本,无法用beautifulsoup定进行准确定位。

在这种情况下,正则匹配即快速又准确。

使用正则匹配,我们希望匹配规则的结果能是唯一的。那么在本案例中,我先使用 var mp4,在网页源码中查找了下,发现是唯一的(看下图)。



接下来,我们就要使用正则表达式,匹配出这个链接。我们要从这个中

  1. var mp4 = "//mv.eastday.com/vyule/20170602/20170602114054589846059_1_06400360.mp4";

抽取出

  1. //mv.eastday.com/vyule/20170602/20170602114054589846059_1_06400360.mp4

我建立一个匹配规则 r'var mp4 = "(.*?)";'

3.2.1代码

  1. import re

  2. """findall返回的是匹配的结果列表,

  3. 由于我确保了匹配的唯一性,这里返回的结果只有一个,

  4. 我们要在后面加个[0],把唯一的匹配结果提取出来

  5. """

  6. link = re.findall(r'var mp4 = "(.*?)";', html)[0]

  7. print(link)

3.2.2运行结果

运行正常,返回希望的mp4链接



3.3 下载MP4视频

下载视频步骤:

  1. 访问mp4的link,返回二进制数据data

  2. 用open(path,'wb')新建一个mp4文件f

  3. 在该文件f中写入二进制数据data

  4. 关闭这个文件f,这样就下载好视频了。

  1. dest_resp = requests.get(link)

  2. \#视频是二进制数据流,content就是为了获取二进制数据的方法

  3. data = dest_resp.content

  4. \#保存数据的路径及文件名

  5. path = '/Users/suosuo/Desktop/头条视频/刘涛.mp4'

  6. f = open(path, 'wb')

  7. f.write(data)

  8. f.close()

  9. print('下载完成')

运行结果

我艹,报错。奥,原来返回的link是这样的

  1. //mv.eastday.com/vyule/20170602/20170602114054589846059_1_06400360.mp4

正常的link都是这样。

  1. http://mv.eastday.com/vyule/20170602/20170602114054589846059_1_06400360.mp4

link中缺了http协议这个东西。更改代码(下图1)运行如下图:



图中2位置可以看出视频下载成功

四、视频下载完整源码

  1. import requests

  2. import re

  3. main_url = 'http://video.eastday.com/a/170602114054589846059.html?indexlbt'

  4. resp = requests.get(main_url)

  5. \#没有这行,打印的结果中文是乱码

  6. resp.encoding = 'utf-8'

  7. html = resp.text

  8. link = re.findall(r'var mp4 = "(.*?)";', html)[0]

  9. link = 'http:'+link

  10. dest_resp = requests.get(link)

  11. \#视频是二进制数据流,content就是为了获取二进制数据的方法

  12. data = dest_resp.content

  13. \#保存数据的路径及文件名

  14. path = '/Users/suosuo/Desktop/头条视频/刘涛.mp4'

  15. f = open(path, 'wb')

  16. f.write(data)

  17. f.close()

  18. print('下载完成')





您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存