爬虫实战——虎牙视频

步骤:

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()均使用前文编写的爬虫工具类

爬虫工具类-CSDN博客

关于如何去构造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))  # 时间戳
        }

运行结果

下载成功

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值