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

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

一、爬取思路

  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

我建立一个匹配规则rvar mp4 = “(.*?)”;

3.2.1代码

import re

"""findall返回的是匹配的结果列表,
由于我确保了匹配的唯一性,这里返回的结果只有一个,
我们要在后面加个[0],把唯一的匹配结果提取出来
"""

link = re.findall(rvar 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(rvar 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(下载完成)

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注