import requests
import os
import json
from moviepy.editor import VideoFileClip, AudioFileClip
from bs4 import BeautifulSoup

if __name__ == "__main__":
    url = 'https://movie.douban.com/j/chart/top_list'
    param = {
        'type': '24',
        'interval_id': '100%3A90',
        'action': '',
        'start': '0',
        'limit': '10',
    }

    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.74 Safari/537.36 Edg/99.0.1150.55'
    }
    response = requests.get(url=url, params=param, headers=headers)

    if response.status_code == 200:
        list_data = response.json()

        for movie in list_data:
            title = movie['title']
            rating = movie['rating']
            print('电影名称:' + title)
            print('评分:' + rating)

            # 向这个地址发送请求,得到响应对象
            res = requests.get(movie['url'], headers=headers)
            # 使用 bs4 将页面源码进行解析
            soup = BeautifulSoup(res.text, 'html.parser')
            # 定位页面的标题,当成文件保存名称
            title = soup.h1.string
            # 我们需要的数据在script的标签内,但是没有属性不能过滤
            script_all = soup.find_all('script')
            for script in script_all:
                content = script.text  # 提取script的文本内容
                # 包含判断
                if 'window.__playinfo__=' in content:
                    # 剔除 window.__playinfo__= 这些内容,剩余的内容就是需要转化的数据
                    content_res = content[20:]
                    # 通过json的方法 将类似于字典的字符串数据转化成字典类型
                    data = json.loads(content_res)
                    # 提取视频链接
                    video_url = data['data']['dash']['video'][0]['baseUrl']
                    headers['referer'] = url
                    # 请求这个视频链接
                    video_res = requests.get(video_url, headers=headers)
                    with open('{}.mp4'.format(title), 'wb') as v_file:
                        v_file.write(video_res.content)
                    print('视频文件名:' + title + '.mp4')

                    # 提取音频链接
                    audio_url = data['data']['dash']['audio'][0]['baseUrl']
                    print('音频文件名:' + title + '.mp3')
                    # 请求访问音频链接
                    audio_res = requests.get(audio_url, headers=headers)
                    # 保存音频文件
                    with open('{}.mp3'.format(title), 'wb') as a_file:
                        a_file.write(audio_res.content)

                    # 创建视频编辑对象
                    video_clip = VideoFileClip('{}.mp4'.format(title))
                    # 创建音频编辑对象
                    audio_clip = AudioFileClip('{}.mp3'.format(title))
                    # 视频 需要设置音频
                    merge_result = video_clip.set_audio(audio_clip)
                    # 保存到视频文件
                    merge_result.write_videofile('merge-' + title + '.mp4')
    else:
        print('请求失败,状态码:' + response.status_code)

该代码会从豆瓣电影 TOP 榜单获取前 10 部电影的信息,然后分别下载它们的视频和音频文件,最后将音频合并到视频中生成新的视频文件。

代码解释:

  1. 导入必要的库:

    • requests 用于发送 HTTP 请求
    • os 用于文件操作
    • json 用于解析 JSON 数据
    • moviepy.editor 用于视频和音频操作
    • bs4 用于解析 HTML 页面
  2. 定义请求参数和头信息:

    • url: 豆瓣电影 TOP 榜单的 API 接口地址
    • param: 请求参数,包括类型、时间段、起始位置、数量等
    • headers: 请求头信息,包括 User-Agent
  3. 发送请求并获取数据:

    • 使用 requests.get 发送 GET 请求
    • 使用 response.json 将响应数据解析成 JSON 格式
  4. 循环处理每部电影:

    • 获取电影标题和评分
    • 获取电影页面 URL
    • 使用 BeautifulSoup 解析电影页面
    • 从页面中查找视频和音频链接
    • 下载视频和音频文件
    • 使用 MoviePy 合并视频和音频文件
  5. 处理错误:

    • 如果请求失败,打印错误信息和状态码

运行步骤:

  1. 确保已安装所需的库。可以使用以下命令安装:

pip install requests beautifulsoup4 moviepy ```

  1. 将代码保存为 .py 文件,例如 douban_movie_downloader.py

  2. 运行代码:

python douban_movie_downloader.py ```

代码运行完成后,会在当前目录下生成每个电影的视频和音频文件,以及合并后的视频文件。

注意:

  • 由于豆瓣的 API 接口可能会发生变化,代码可能需要进行调整才能正常运行。
  • 下载视频和音频文件可能会受到网络速度的影响。
  • 请勿将代码用于商业目的或非法活动。

其他建议:

  • 可以添加进度条,方便用户了解下载进度。
  • 可以添加错误处理机制,避免程序意外退出。
  • 可以将代码封装成函数,方便重复使用。

希望这篇文章对您有所帮助!如果您有任何问题,请随时提出。

豆瓣电影TOP榜单视频音频下载 - Python爬虫实战

原文地址: https://www.cveoy.top/t/topic/fQ3C 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录