步骤:
1、随机选择一个视频点进去,本文以红框视频为例
2、复制视频标题,按F12,Ctrl+R刷新,此时搜索标题,可得到对应接口
3、在接口中查找可得到对应清晰度的url链接
4、则我们可知,使用request访问该接口获取链接即可下载
代码:
class getHuYa(object):
def __init__(self):
self.url1 = 'https://liveapi.huya.com/moment/getMomentContent'
self.isBarOpen = True
def get_videoId(self):
url3 = 'https://www.huya.com/video/g/all'
response = Spiders().fetch(url3)
doc = etree.HTML(response.text)
videId_list = doc.xpath('//li/@data-vid')
return videId_list
def detail_Video(self,videoId):
expando = "jQuery1124"
rand = str(random.random()).replace('.','')
callback = f'{expando}{rand}_{int((time.time()*1000))}'
params = {
"callback": callback,
"videoId": videoId,
"_": int((time.time()*1000)) # 时间戳
}
response = Spiders().fetch(url=self.url1,params=params)
res_new = response.text.replace(callback,'').replace('(','').replace(')','')
data = json.loads(res_new)
videoInfo = data['data']['moment']['videoInfo']
category = videoInfo['category']
actorNick = videoInfo['actorNick']
defName = videoInfo['definitions'][0]['defName']
url2 = videoInfo['definitions'][0]['url']
filename = f'{category}_{actorNick}_{defName}.mp4'
video_res = Spiders().fetch(url2)
if self.isBarOpen:
util().progress_bar(video_res,filename)
else:
with open(filename,'wb') as f:
f.write(video_res.content)
def run(self):
video_list = self.get_videoId()
# 使用多线程
with ThreadPoolExecutor(max_workers=3) as executor:
executor.map(self.detail_Video,video_list)
# 不使用多线程,通过单个VideoID进行下载
# self.detail_Video(982231768)
if __name__ == '__main__':
my = getHuYa()
my.run()
注:代码中的Spiders().fetch()及util().progress_bar()均使用前文编写的爬虫工具类
关于如何去构造params:
从接口的载荷我们可以看到需要4个参数callback,videoID,uid,_,其中uid为空不需要去管。_参数为时间戳,对比接口参数,可使用time.time()函数构造并乘以1000,这样构造的时间戳长度就跟接口中的参数长度一致,同理callback后半段的数字也为时间戳
callback构造
步骤如下:
1、点开接口对应启动器栈顶js文件
2、Ctrl+F搜索即可定位,打上断点刷新网页
3、此时鼠标停留在E.expando即可发现该参数即为我们想要构造的callback的前半段,后半段由常识可知为时间戳,故我们只需了解如何构造前半段即可
4、Ctrl+F搜索expando,打上断点,重新刷新页面即可定位。此时我们可得知expando是由jQuery字符串加上字符串o以及随机函数构成而成,我们可在控制台输出o得到o的值为'1.12.4'
具体代码如下
expando = "jQuery1124"
rand = str(random.random()).replace('.','')
callback = f'{expando}{rand}_{int((time.time()*1000))}'
params = {
"callback": callback,
"videoId": videoId,
"_": int((time.time()*1000)) # 时间戳
}