本文是上期文章()的补充说明,主要说明两个内容,一个是回调函数,另一个爬虫下载多页虎牙视频。
一.回调函数的说明从上篇文章分析,我们分析的是不同视频的videoid与_:(时间戳)不一样,而没有分析callback。
首先认识下callback,callback是回调函数,JavaScript中的一种函数。
被作为实参传入另一个函数,并在该外部函数内被调用,用来完成某些任务的函数,称为回调函数。也就是说回调函数是一个函数,作为参数传给另一个JavaScript函数,回调函数将会在这个函数执行完成后立即执行。回调函数是在传给的函数内部被调用执行的。
说简单点就是执行完这个函数再次执行,下面用实例讲述,便于理解。
包含mp4视频链接的网址如下为:
网址callback与“预览”里网址的callback值一样,即执行了或者说回调。
这样就在python中网址中不写入callback(见下图),就不会执行回调函数,requests请求得到的内容就不会有上图所标出的callback内容,请求内容以json格式输出也不会报错。
二.多页下载虎牙视频因为我们把各个步骤都写成函数了,多页下载就需要找到规律,我们发现第一级网址中page参数代表页数,因此只需要循环一次执行每一页的下载即可。
代码如下:
import requests
import re
import time
import pprint
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36 Edg/107.0.1418.52',
'referer': 'https://v.huya.com/'
}
#获取网址内容
def get_response(url,headers):
response = requests.get(url,headers=headers)
return response
#获取视频id
def get_video_id(response):
obj = re.compile(r'<li data-vid="(.*?)">',re.S)
video_id_list = obj.findall(response.text)
return video_id_list
#获取视频链接地址,名称
def get_video_url(video_id,headers):
url = f'https://liveapi.huya.com/moment/getMomentContent?videoId={video_id}&_={str(time.time()*1000)}'
response = get_response(url,headers)
#pprint.pprint(response.json())
data_dict = response.json()
video_url = data_dict['data']['moment']['videoInfo']['definitions'][0]['url']
video_title = data_dict['data']['moment']['videoInfo']['videoTitle']
return video_url,video_title
#下载保存视频
def download(url,title):
with open('./video_huya/' title '.mp4',mode='wb') as f:
f.write(requests.get(url).content)
if __name__ == '__main__':
for num in range(1,6):
url = f'https://v.huya.com/g/all?set_id=67&order=hot&page={num}'
resp = get_response(url, headers)
video_id_list = get_video_id(resp)
for video_id in video_id_list:
[video_url, video_title] = get_video_url(video_id, headers)
download(video_url, video_title)
三.总结
现在我们可以多页下载虎牙视频,不过运行后下载速度有点慢,大家可以试试用异步等方式快速下载,欢迎大家在评论区讨论学习,谢谢大家。
,Copyright © 2008-2022 秒下下载站
m.down10s.com .All Rights Reserved