如何抓取视频资源-以头条视频为例
今天淘宝上接了单爬头条视频的活,晚上刚刚交付。😆想到之前写的爬虫都可以爬文本、图片,好像视频这种多媒体资源我还没有写过。
今天咱们就以头条视频为例,写个爬虫,当然是简化版,重在分析思路。
一、爬取思路
分析网页源码,查找解析出视频资源url
对该url发起请求,返回二进制数据
将二进制数据保存为视频格式
上述是大的框架,具体实施肯定要比上面多一些步骤。下面咱们开始实例部分。
二、头条爬虫分析
打开头条视频,刘涛上新闻了。真是佩服刘涛,一个人帮其丈夫还债4个亿。反正我是挺佩服的,按照年薪十万,大邓十年100万,一百年赚1000万,,,4000年才能赚到赚4亿。
从挣钱的角度来说,人与人的差距不是一般的大,其区别之大远甚于人与狗的区别。啊,扯远了!!
视频主页网址
http://video.eastday.com/a/170602114054589846059.html?indexlbt
查看网页源码,希望在其中查找视频格式,如mp4、rmvb、mov等,这里我就直接搜mp4试一试。
哇,还真的搜到了。这里出现的第一个mp4似乎是一个视频网址,我们复制到网址框,试一试这个链接
在浏览器中真的是视频,而且是我们要找的视频链接。
三、开始撸代码
3.1 访问视频主页,获得该主页html文件
在部分,对主页的url发起请求,查看返回的数据中是否包含刘涛的视频链接。
import requests
main_url = 'http://video.eastday.com/a/170602114054589846059.html?indexlbt'
resp = requests.get(main_url)
##没有下面这行,打印的结果中文是乱码
resp.encoding='utf-8'
html = resp.text
print(html)
在打印结果(下图)中,成功查找到mp4,找到了视频链接,这说明本部分请求代码正常。
3.2 解析视频链接
我们发现那个mp4视频链接,是在javasrcipt文本中,并不是html文本,无法用beautifulsoup定进行准确定位。
在这种情况下,正则匹配即快速又准确。
使用正则匹配,我们希望匹配规则的结果能是唯一的。那么在本案例中,我先使用 var mp4
,在网页源码中查找了下,发现是唯一的(看下图)。
接下来,我们就要使用正则表达式,匹配出这个链接。我们要从这个中
var mp4 = "//mv.eastday.com/vyule/20170602/20170602114054589846059_1_06400360.mp4";
抽取出
//mv.eastday.com/vyule/20170602/20170602114054589846059_1_06400360.mp4
我建立一个匹配规则 r'var mp4 = "(.*?)";'
3.2.1代码
import re
"""findall返回的是匹配的结果列表,
由于我确保了匹配的唯一性,这里返回的结果只有一个,
我们要在后面加个[0],把唯一的匹配结果提取出来
"""
link = re.findall(r'var mp4 = "(.*?)";', html)[0]
print(link)
3.2.2运行结果
运行正常,返回希望的mp4链接
3.3 下载MP4视频
下载视频步骤:
访问mp4的link,返回二进制数据data
用open(path,'wb')新建一个mp4文件f
在该文件f中写入二进制数据data
关闭这个文件f,这样就下载好视频了。
dest_resp = requests.get(link)
\#视频是二进制数据流,content就是为了获取二进制数据的方法
data = dest_resp.content
\#保存数据的路径及文件名
path = '/Users/suosuo/Desktop/头条视频/刘涛.mp4'
f = open(path, 'wb')
f.write(data)
f.close()
print('下载完成')
运行结果
我艹,报错。奥,原来返回的link是这样的
//mv.eastday.com/vyule/20170602/20170602114054589846059_1_06400360.mp4
正常的link都是这样。
http://mv.eastday.com/vyule/20170602/20170602114054589846059_1_06400360.mp4
link中缺了http协议这个东西。更改代码(下图1)运行如下图:
图中2位置可以看出视频下载成功
四、视频下载完整源码
import requests
import re
main_url = 'http://video.eastday.com/a/170602114054589846059.html?indexlbt'
resp = requests.get(main_url)
\#没有这行,打印的结果中文是乱码
resp.encoding = 'utf-8'
html = resp.text
link = re.findall(r'var mp4 = "(.*?)";', html)[0]
link = 'http:'+link
dest_resp = requests.get(link)
\#视频是二进制数据流,content就是为了获取二进制数据的方法
data = dest_resp.content
\#保存数据的路径及文件名
path = '/Users/suosuo/Desktop/头条视频/刘涛.mp4'
f = open(path, 'wb')
f.write(data)
f.close()
print('下载完成')