首页 > 编程语言 >当我用Python爬了斗鱼舞蹈区视频后,差点不出来了!

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

时间:2023-02-10 13:44:05浏览次数:45  
标签:视频 vid m3u8 Python point ts url 斗鱼 data

嗨喽,兄弟们,昨晚无聊溜进了斗鱼舞蹈区,好家伙,差点出不来了,这么好的东西当然是要分享给表弟了,于是我全部用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)

 

尾语

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

标签:视频,vid,m3u8,Python,point,ts,url,斗鱼,data
From: https://www.cnblogs.com/hahaa/p/17105602.html

相关文章