之前在工作中有点忙,所以就没有写文章。因为之前有写过爬取图片的文章 ,所以今天就想写一篇爬取视频的文章。
首先第一步还是先要分析站,确定要爬取的网站链接:
https://haokan.baidu.com/tab/gaoxiao
爬取的视频为搞笑这个栏目的视频。
接下来要做的就是网站数据包的抓取,谷歌浏览器的抓包工具为我们分类好了每一个网络数据包的类型。
通过对该网站的分析可以得出网站是通过Ajax来局部刷新的,因为你不断往下拉的过程中,一个一个视频会跟着加载出来,所以,判断这是Ajax局部刷新。在不断下拉的过程中会加载出大量的数据包,当然有效数据包含在接口类型的数据中。
既然已经分析出,接口数据了那么接下来就可以通过这个接口数据获取到视频的标题与链接了。
经过测试,发现play_url是视频的链接。
根据接口的headers信息,找到request url,这个就是我们需要请求的url地址。
看看刚刚那些参数会不会有什么变化
接下来开始上代码:
首先第一步,获取所有的接口数据。
# 获取数据
def get_data(url):
response = requests.get(url, headers=headers)
if response.status_code == 200:
data = response.json()
else:
print('请求失败')
return data
第二步,获取数据中videos下的所有内容,vedios下的内容就包括视频的标题与链接
# 获取视频列表
def get_video_list(data):
video_lists = data['data']['response']['videos']
return video_lists
获取到视频列表之后,就对视频的链接play_url发起请求,获取视频流,一般图片、视频、音频都是二进制文件。
def save_vedio(vedio_lists):
# page = 0
# while True:
# page += 1
# print('=' * 20 + '正在下载第{}页'.format(page) + '='*20)
for vedio_list in vedio_lists:
try:
vedio_url = vedio_list['play_url']
vedio_title = vedio_list['title'] + '.mp4'
time.sleep(5)
vedio = requests.get(vedio_url, headers=headers).content
if not os.path.exists('vedio'):
os.mkdir('vedio')
with open('./vedio/{}'.format(vedio_title), mode='wb') as f:
f.write(vedio)
except Exception as e:
break
print('下载完成\n\n')
最后发现一个问题,就是通过这样的方式只能获取到20个视频,往下加载的视频无法获取到,这是为什么呢?
通过不断的检查发现每次下拉过程中抓取到的接口数据包都是一样的,最后经过测试发现,这个是cookies信息包含了时间戳,通过这一点来为访问的用户加载出其他页面的视频,这里的其他页面指的是每下拉加载一次为一页。
所以这里要构造请求头的时候要添加cookie信息,接下来你也会发现你获取的视频与你在浏览器中的不同。当然不同啦,你每访问一次就相当于刷新一下页面,你每一次刷新里面的视频内容都是不一样的。