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

我是创始人李岩:很抱歉!给自己产品做个广告,点击进来看看。  

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

作者:邓旭东HIT

想到之前写的爬虫都可以爬文本、图片,好像视频这种多媒体资源我还没有写过。

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

一、爬取思路

  1. 分析网页源码,查找解析出视频资源url
  2. 对该url发起请求,返回二进制数据
  3. 将二进制数据保存为视频格式

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

二、头条爬虫分析

打开头条视频,刘涛上新闻了。真是佩服刘涛,一个人帮其丈夫还债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视频

下载视频步骤:

  1. 访问mp4的link,返回二进制数据data
  2. 用open(path,’wb’)新建一个mp4文件f
  3. 在该文件f中写入二进制数据data
  4. 关闭这个文件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协议这个东西。更改代码运行如下图:

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

视频下载成功

四、视频下载完整源码

					
						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('下载完成')
					
				

End.

转载请注明来自36大数据(36dsj.com): 36大数据 » 如何抓取视频资源-以头条视频为例

随意打赏

头条视频头条视频今日头条技术头条视频视频今日头条视频
提交建议
微信扫一扫,分享给好友吧。