文章目录

  • 爬虫的基本步骤
  • 一些工具
  • 模拟浏览器并监听文件
  • 视频爬取易错点
  • 一个代码示例
  • 参考
  • 爬虫的基本步骤

    1.抓包分析,利用浏览器的开发者工具
    2.发送请求
    3.获取数据
    4.解析数据
    5.保存数据

    一些工具

    1. requests, 用于发送请求,可以通过get,post等方式。通常需要加标头headers将Cookies和User-Agent,referer带上。
    2. re, 正则表达式,用于查找目标字符串,解析网页。
    3. urllib.parse.unquote, 用于解码 URL 编码的字符串。URL 编码(也称为百分号编码)是将某些字符转换为 % 后跟两位十六进制数的形式,以便在 URL 中安全传输。
    4. json.loads(), 将json数据格式转化为字典。
    5. pprint.pprint(), 用于“美化打印”(pretty-print)复杂的数据结构,如字典、列表等。它可以使输出更易于阅读,特别是在处理嵌套结构时。
    6. DrissionPage.ChromiumPage,用于模拟浏览器。

    模拟浏览器并监听文件

    dp=ChromiumPage()
    dp.listen.start(‘文件名称’)
    dp.get(url)
    resp=dp.listen.wait()
    resp_dict=resp.response.body

    视频爬取易错点

    短视频一般是mp4的文件。长视频往往是m3u8流媒体,需要爬取多个ts文件。但是,长视频也可能是音频(audio)+视频(video)的形式传输,并利用ffmpeg合成。

    爬完一个视频后应当停顿几秒,防止服务器发爬机制。

    一个代码示例

    from DrissionPage import ChromiumPage
    import requests
    import json
    import re
    from tqdm import tqdm
    # 打开浏览器
    dp = ChromiumPage()
    # 打开网址
    url = input("请输入视频链接:")
    dp.get(url)
    # 监听数据包
    dp.listen.start('proxyhttp')
    # 等待数据包加载
    resp = dp.listen.wait()
    # 获取相应数据
    response = resp.response.body
    # print(response)
    json_data = response['vinfo']
    # print(type(json_data))
    # 将json字符串转换成json字典
    info_json = json.loads(json_data)
    # print(type(info_json))
    # 取出视频切片链接包的地址
    m3u8_url = info_json['vl']['vi'][0]['ul']['ui'][-1]['url']
    # print(m3u8_url)
     
    headers = {
        # 用户信息
    'cookie':
    '填写自己的用户信息',
       'referer':
    'https://v.qq.com/',
        # 防盗链
        'user-agent':
    '填写自己的设备信息'
        # 设备信息
    }
    # 请求获取所有的视频ts片段
    m3u8 = requests.get(url=m3u8_url, headers=headers).text
    # print(m3u8)
    ts_list = re.findall(',\n(.*?)\n#',  m3u8)
    ts_name = '/'.join(m3u8_url.split('/')[:-1]) + '/'
    # print(ts_name)
    # print(ts_list)
    for ts in tqdm(ts_list):
        # 拼接完整的ts视频链接
        ts_url = ts_name + ts
        # 获取视频片段内容
        ts_content = requests.get(url=ts_url, headers=headers).content
        #以追加的形式,写入2进制数据
        with open('保存位置.mp4', mode='ab') as f:
            f.write(ts_content)
    

    参考

    https://blog.csdn.net/2201_75495538/article/details/143438422

    作者:zoujiahui_2018

    物联沃分享整理
    物联沃-IOTWORD物联网 » python视频爬虫

    发表回复