某快下饭短剧-剧集批量保存(python网页爬取)

github源码:https://github.com/zaq12310/Batch-download-of-short-dramas

一、工具

  1. 解释器:python 3.13
  2. 模块:requests、re
import requests  # 导入请求模块
import re  # 导入文本匹配模块

没有这些模块的话,请先在cmd中下载

pip install requests
#re是python自带,因此无需下载

二、代码解析(逻辑分析)

用浏览器打开快手短剧第5集(本代码使用edge浏览器)

2.1 定义请求头请求数据

为什么要定义请求头,因为从网站的设置初衷,它是不想服务于我们的爬虫程序的,网站正常只想服务于客户的访问服务,那么我们要将我们的爬虫程序伪装成为正常的服务。

(在不定义请求头的情况下无法获取网页数据,只能获取到html)

此时我们需要定义一些数据来伪装,通常我们只需要设置 cookie 、referee、user-agent就够了(如果有些特殊的网站可能需要我们有其他的参数)

#定义请求头
headers = {
    #用户身份信息
    'user-agent': '填写标头中的user-agent',
    #用户标识
    'cookie': '填写标头中的cookie',
    #引荐页
    'referer': '填写标头中的referer'}

根据以下步骤找到所需要的数据,将 cookie 、referer 、user-agent 的数据分别粘贴在代码里面

  1. 打开检查页面

    image-20250311225910205

  2. 刷新网页获取该网页所有数据

    image-20250311230259965

  3. 找到视频url所在地

    image-20250311230908611

  4. 点击标头,请求头(headers)的检查元素界面 找到url,向下滑动找到cookie 、referer 、user-agent ,将所有数据写入代码

    image-20250311231034434

2.2 建立循环遍历所有视频连结

定义参数表(在负载里),通过参数表提供所有剧集视频url

  1. 点击负载,复制内容粘贴到代码里(注意:参数名要用英文引号【''】表示) image-20250311231941940
    #定义参数表
    data = {
        #操作动作
        'operationName': "剧集查询",
        #查询
        'query':"查询条件",
        #查询变量
        'variables':
            {'tubeId': "频道id",  # 频道id
             'episodeNumber': 0,  # 集数【第一集】
             'page': "播放器",	#页面
             'channelId': 0}
    }
    
  2. 将集数变量【episodeNumber】定义为num,建立循环,不断获取视频url
    num = 0	##多个视频url读取所需要的页面自变量
    while True: #死循环
        # 定义参数 在负载里面
        # 参数表:通过参数表找到每个剧集视频不同变量,并建立循环
        #定义参数表
        data = {
        #操作动作
        'operationName': "剧集查询",
        #查询
        'query':"查询条件",
        #查询变量
        'variables':
            {'tubeId': "频道id",  # 频道id
             'episodeNumber': 0,  # 集数【第一集】
             'page': "播放器",	#页面
             'channelId': 0}
        }
        # 请求目标网址
        res = requests.post(url1, json=data, headers=headers)
    
        # print(res.status_code) #输出响应码 200成功 403拒绝 404查无网址 500服务器错误
        # print(res.text)     #打印请求返回的所有数据
    
        # 读出视频url的数据
        try:
            #筛选出返回数据中视频url,并用url2表示
            url2 = re.findall(',"photoUrl":"(.*?)","photoH26', res.text)[0]
            print(url2)
            #res = requests.get(url)  # 获取网址请求结果
            #open('短剧名第4集.mp4', 'wb').write(res.content)  # 将获取到响应内容写入文件中
            num += 1 #下一次循环条件
        except:
            print('已显示所有剧集url')
            break #停止循环
    
    

2.3 在循环中下载视频

开始循环
    try:
        url2 =视频url
        print(url2)

        num += 1 #剧集数
        res = requests.get(url2)  # 获取网址请求结果

        # open('短剧名-第4集.mp4', 'wb').write(res.content)  # 将获取到视频写入文件中
        numstr = str(num) #将num转化为str
        filename = '短剧名—第' + numstr + '集.mp4'  # 设定每个文件名
        open(filename, 'wb').write(res.content)
    except:
        print('所有剧集已下载完成')
        break #停止循环
        循环结束/继续条件筛选

请求返回数据中,视频数据都存储在 res→ content 中

三、运行代码输出

运行【下饭短剧批量采集.py】下载所有短剧,并以【短剧名—第N集.mp4】形式存储在当前文件夹中

四、参考资料

  1. Mind-Explorer. 利用python循环创建多个文件[EB/OL]. [2017-09-27]. https://blog.csdn.net/lifanqq/article/details/78117662.