年纪轻轻,不学高数怎么行?

redballoon
2022-10-12 / 0 评论 / 21 阅读 / 正在检测是否收录...
温馨提示:
本文最后更新于2022年11月14日,已超过85天没有更新,若内容或图片失效,请留言反馈。

介绍

该程序是目标是获取 宋浩的高等数学的全部课程内容 由于视频数据较多,这里获取只有5集。有兴趣可以全部下载下来,但可能很耗时。

R-C.jpg

开发环境:

Python 3.8
Pycharm 2020

模块的使用:

import requests
import re
import json
import os.path
import time  # --> 爬多条数据时建议设置
import subprocess

数据来源分析

  1. 打开开发者工具,分析视频数据地址, 可以通过搜索 “cid”(122452656)的数据定位到视频的链接地址
  2. 分析请求页面请求头,设置请求头信息,请求页面获取响应
  3. 通过re提取出刚刚定位到的json数据的全部内容
  4. 请求从json数据里取出的视频音频链接
  5. 保存为二级制数据
  6. 处理合并视频和音频,并保存指定文件夹中

代码实现过程:

# -*- coding:utf-8 -*-
# @Author:🎈RedBalloon
# @Time:2022/10/10-22:13
# @File:video_spider.py
import requests
import re
import json
import os.path
import time
import subprocess


def get_page(peg_url):
    headers = {
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36',
        #  防盗链 针对403的解决,就是告诉浏览器是从哪里来
        'referer': 'https://www.bilibili.com'
    }
    response = requests.get(url=peg_url, headers=headers)
    return response


#  3 数据解析
def get_video_info(html_data):
    title = re.findall(r'"title":"(.*?)"', html_data)[0]
    video_info_html = re.findall(r'<script>window.__playinfo__=(.*?)</script>', html_data)[0]
    json_info_data = json.loads(video_info_html)
    audio_url = json_info_data['data']['dash']['audio'][0]['baseUrl']
    video_url = json_info_data['data']['dash']['video'][0]['baseUrl']
    # 视频和音频的链接
    video_info = [audio_url, video_url]
    return video_info


def get_detail(html_data, n):
    video_detail = re.findall(r'<script>window.__INITIAL_STATE__=(.*?);\(function\(\)\{var s;\(s=doc', html_data, re.S)[0]
    json_detail_data = json.loads(video_detail)
    # print(json_detail_data)
    page_detail = json_detail_data['videoData']['pages'][n-1]['page']
    name_detail = json_detail_data['videoData']['pages'][n-1]['part']
    name_detail = name_detail.replace(' ', '')
    new_title = title = re.sub(r'[\/:*?"<>|]', '', name_detail)
    # print(new_title)
    detail_list = [page_detail, name_detail]
    return detail_list


def save(num, title,  audio_url, video_url):
    audio_content = get_page(audio_url).content
    video_content = get_page(video_url).content

    folder_path = f'高等数学\\'
    if not os.path.exists(folder_path):
        os.makedirs(folder_path)

    with open(folder_path + title + '.mp3', mode='wb')as f:
        f.write(audio_content)
    with open(folder_path + title + '.mp4', mode='wb')as f:
        f.write(video_content)
    merge_video(title)


def merge_video(video_name):
    # 合并后的位置是自己新建,运行前保证已存在
    command = f'ffmpeg -i 高等数学\\{video_name}.mp4 -i 高等数学\\{video_name}.mp3 -c:v copy -c:a aac -strict experimental 合并后的位置\\{video_name}output.mp4'
    subprocess.run(command, shell=True)
    os.remove(f'高等数学\\{video_name}.mp4')
    os.remove(f'高等数学\\{video_name}.mp3')
    print(f'{video_name}合成完毕-----------')


if __name__ == '__main__':
    for i in range(1, 6):
        url = f'https://www.bilibili.com/video/BV1Eb411u7Fw?p={i}'
        html = get_page(url)
        mp3_url, mp4_url = get_video_info(html.text)
        page, name = get_detail(html.text, i)
        # i 是 get_detail里用来获取数据的索引
        save(page, name, mp3_url, mp4_url)

运行结果:

视频项目地址:

下载的视频是正常播放的,这里截取一小段演示

0

评论 (0)

取消