当我用Python爬了斗鱼舞蹈区视频后,差点不出来了!

嗨喽,兄弟们,昨晚无聊溜进了斗鱼舞蹈区,好家伙,差点出不来了,这么好的东西当然是要分享给表弟了,于是我全部用Python爬了下来,悄悄放到了他的电脑中。

果然不出我所料,今天早上一起来,表弟就被打了一顿!


话不多说,也给大家分享分享!

基本流程

一、数据来源分析

抓包 数据包

m3u8: 视频流 m3u8文本类型文件 将 mp4 切分为n个片段(.ts片段视频) 每一个片段为10秒钟

二、代码实现(实现的基本流程)

  1. 发送请求
  2. 获取数据
  3. 解析数据
  4. 保存数据
  5. 多页采集

代码展示

导入模块

import requests
import re
import time
import execjs
from tqdm import tqdm

 

请求头(伪装)

vid = 'kDe0W2m4JO2MA4Bz'
# 为了防止大家看了文章不会操作,我特地录制了视频,跟源代码一起直接在这个q裙自取就好了:708525271
headers = {
    'cookie': 'cookie数据我就删除了,修改成自己的就可以了',
    'origin': 'https://v.douyu.com',
    'referer': f'https://v.douyu.com/show/{vid}',
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36'
}

 

获取point_id

def get_point_id(vid):
    point_url = f"https://v.douyu.com/wgapi/vod/front/video/secondary/info?hid={vid}"
    point_id = requests.get(point_url, headers=headers).json()['data']['vid']
    return point_id

 

获取sign

复制代码
def get_sign(vid, point_id, did, tt):
    """
    :param vid: 作品id
    :param point_id: point_id
    :param did: did
    :param tt: 时间戳
    :return: sign值
    """
    main_url = f'https://v.douyu.com/show/{vid}'
    html_data = requests.get(main_url, headers=headers).text
    title = re.findall('<title>(.*?)</title>', html_data)[0]
    f = "const CryptoJS = require('crypto-js');" + re.findall('<script> (var v.*?)</script>', html_data)[0]
    ctx = execjs.compile(f)
    result = ctx.call('ub98484234', point_id, did, tt)
    sign = result.split('sign=')[-1]
    return [sign, title]
复制代码

 

获取m3u8链接

复制代码
def get_streamUrl(v, did, tt, sign, vid):

    data = {
        'v': v,
        'did': did,
        'tt': str(tt),
        'sign': sign,
        'vid': vid
    }
    url = 'https://v.douyu.com/api/stream/getStreamUrl'
    # 1. 发送请求
    response = requests.post(url=url, headers=headers, data=data)
    # 2. 获取数据
    m3u8_url = response.json()['data']['thumb_video']['high']['url']
    return m3u8_url
复制代码

 

下载视频

复制代码
def download_m3u8(m3u8_url, title):
    sub_ts = m3u8_url.split('playlist')[0]
    m3u8_text = requests.get(m3u8_url).text
    ts_list = re.sub('#E.*', '', m3u8_text).split()
    for ts in tqdm(ts_list):
        ts_url = sub_ts+ts
        ts_data = requests.get(ts_url).content
        with open(f'{title}.mp4', mode='ab') as f:
            f.write(ts_data)
复制代码

 

尾语

感谢你观看我的文章~本次航班到这里就结束啦 🛬

希望本篇文章有对你带来帮助 🎉,有学习到一点知识~

躲起来的星星🍥也在努力发光,你也要努力加油(让我们一起努力)。

posted @   轻松学Python  阅读(137)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
历史上的今天:
2022-02-10 没买抢冰墩墩,那咱们自己用python画一个,自我安慰一下
2022-02-10 【从小白开始学python系列八】数值类型
点击右上角即可分享
微信分享提示