python 爬虫 某站

import json
import os
import subprocess
import requests
import re


def get_response(url):
    headers = {
        'referer': 'http://www.bilibili.com/',
        'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:98.0) Gecko/20100101 Firefox/98.0'
    }
    return requests.get(url=url, headers=headers)


def get_video_info(url):
    url_resp = get_response(url)
    video_title = re.findall('<h1 title="(.*?)"', url_resp.text)[0]
    html_data = re.findall('<script>window.__playinfo__=(.*?)</script>', url_resp.text)[0]
    json_data = json.loads(html_data)
    # pprint.pprint(json_data)
    audio_url = json_data['data']['dash']['audio'][0]['baseUrl']
    video_url = json_data['data']['dash']['video'][0]['baseUrl']
    return [video_title, video_url, audio_url]


def mergeVideoAudio(video_name, num, no):
    abs_pth = os.path.abspath(__file__) + '/..'
    # print('开始合并video 和 audio', video_name)
    video_name = video_name.replace(' ', '')
    # print(video_name)
    output_name = f'{no}_' + ' '.join(num.split(' ')[:-1])
    cmd = 'ffmpeg -i ' + '\"output/' + f'{num}.mp4\" ' + ' -i ' + '\"output/' + f'{num}.mp3\"' + ' -acodec copy -vcodec copy ' + "\"output/" + f'{output_name}\"' + '.mp4'
    subprocess.call(cmd, shell=True)
    os.remove(f'./output/{num}.mp3')
    os.remove(f'./output/{num}.mp4')
    # print(f'{num}视频合成完成', video_name)


def save(info_list, num, no):
    audio_content = get_response(info_list[2]).content
    video_content = get_response(info_list[1]).content
    title = info_list[0]
    num = num.replace('/', '_')
    if not os.path.exists('./output'):
        os.makedirs('./output')
    with open('./output/' + str(num) + '.mp3', 'wb') as f:
        f.write(audio_content)
    with open('./output/' + str(num) + '.mp4', 'wb') as f:
        f.write(video_content)
    print(f'video_{num}爬取成功!')
    mergeVideoAudio('./output/' + str(num), num, no)


def get_list(url):
    resp = get_response(url)
    content = json.loads(resp.text)
    tmp = content['data']['archives']
    bvid_list = []
    title_list = []
    for v in tmp:
        bvid_list.append(v['bvid'])
        title_list.append(v['title'])
    return bvid_list, title_list


if __name__ == '__main__':
    bvid_list, title_list = get_list(
        'https://api.bilibili.com/x/polymer/space/seasons_archives_list?mid=202224425&season_id=6895&sort_reverse=false&page_num=1&page_size=30')
    # print(title_list)
    # exit(0)
    for n in range(6, 7):
        bvi = bvid_list[n]
        title = title_list[n]
        url = f'https://www.bilibili.com/video/{bvi}/?spm_id_from=333.788&vd_source=270c4500eb11ca999c55b6d79d7ae5f8'
        video_info = get_video_info(url)
        save(info_list=video_info, num=title, no=n)
        print(f'{n} is finished')
    # BV1fY4y137yh
    # BV1R34y1L7sY

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BoneInscri

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值