吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2830|回复: 25
收起左侧

[Python 转载] 刚学python爬虫的菜鸟,输入b站目标视频链接可以下载,存在很多不足,往大佬们指导

[复制链接]
XiaoZouYu 发表于 2022-4-25 10:13
import requests
from lxml import etree
import re
from moviepy.editor import *
import os

if __name__ == '__main__':

    url_ = input("请输入播放页面的url:")

    headers_ = {
        "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36",
        "referer": "https://space.bilibili.com/517327498/dynamic?spm_id_from=444.41.list.card_avatar.click"
    }

    response_ = requests.get(url_,headers=headers_)

    str_data = response_.text  # 视频主页的html代码,类型是字符串

    # 使用xpath语法解析html代码,得到想要的url
    html_obj = etree.HTML(str_data)

    # 获取视频的名称
    res_ = html_obj.xpath("//title/text()")[0]
    title_ = re.findall(r"(.*?)_哔哩哔哩_bilibili",res_)[0]
    # 影响视频合成的特殊字符处理
    title_ = title_.replace(" ","")
    title_ = title_.replace("&","")
    title_ = title_.replace("/","")

    # 使用xpath语法获取数据,取到的数据为列表,索引[0]取值去除里面的字符串,即包含视频音频的url文件
    url_list_str = html_obj.xpath("//script[contains(text(),'window.__playinfo__')]/text()")[0]

    video_url = re.findall(r'"video":\[{"id":\d+,"baseUrl":"(.*?)"',url_list_str)[0]
    audio_url = re.findall(r'"audio":\[{"id":\d+,"baseUrl":"(.*?)"',url_list_str)[0]

    # 设置拥有一个动态变化跳转referer和headers
    headers_ = {
        "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36",
        "referer": url_
    }

    response_video = requests.get(video_url,headers=headers_,stream=True)
    bytes_video = response_video.content
    response_audio = requests.get(audio_url,headers=headers_,stream=True)
    bytes_audio = response_audio.content

    # 获取文件的大小  单位为kb
    video_size = int(int(response_video.headers['content-length'])/1024)
    audio_size = int(int(response_audio.headers['content-length'])/1024)

    with open(f"{title_}!.mp4", "wb") as f:
        f.write(bytes_video)
        print(f"纯视频文件下载完毕,大小为:{video_size}KB,{int(video_size/1024)}MB")
    with open(f"{title_}!.mp3", "wb") as f:
        f.write(bytes_audio)
        print(f"纯音频文件下载完毕,大小为:{audio_size}KB,{int(audio_size / 1024)}MB")

    ffmpeg_tools.ffmpeg_merge_video_audio(f'{title_}!.mp4', f'{title_}!.mp3', f'{title_}.mp4')
    print("视频合成成功!")
    # 显示合成文件的大小
    res_ = int(os.stat(f'{title_}.mp4').st_size/1024)
    print(f"{title_}视频文件下载完毕,大小为:{res_}KB,{int(res_ / 1024)}MB")

    os.remove(f"{title_}!.mp4")
    os.remove(f"{title_}!.mp3")

免费评分

参与人数 2吾爱币 +2 热心值 +1 收起 理由
承蒙上苍眷顾 + 1 谢谢@Thanks!
Iwanttoknow1 + 1 + 1 谢谢@Thanks!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

爱折腾 发表于 2022-4-25 12:33
本帖最后由 爱折腾 于 2022-4-25 12:36 编辑
import requests
from lxml import etree
import re
from moviepy.editor import *
import os

if __name__ == '__main__':

    url_ = input("请输入播放页面的url:")

    headers_ = {
        "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36",
        "referer": "https://space.bilibili.com/517327498/dynamic?spm_id_from=444.41.list.card_avatar.click"
    }

    response_ = requests.get(url_,headers=headers_)

    str_data = response_.text  # 视频主页的html代码,类型是字符串

    # 使用xpath语法解析html代码,得到想要的url
    html_obj = etree.HTML(str_data)

    # 获取视频的名称
    res_ = html_obj.xpath("//title/text()")[0]
    title_ = re.findall(r"(.*?)_哔哩哔哩_bilibili",res_)[0]
    # 影响视频合成的特殊字符处理
    title_ = title_.replace(" ","")
    title_ = title_.replace("&","")
    title_ = title_.replace("/","")

    # 使用xpath语法获取数据,取到的数据为列表,索引[0]取值去除里面的字符串,即包含视频音频的url文件
    url_list_str = html_obj.xpath("//script[contains(text(),'window.__playinfo__')]/text()")[0]

    video_url = re.findall(r'"video":\[{"id":\d+,"baseUrl":"(.*?)"',url_list_str)[0]
    audio_url = re.findall(r'"audio":\[{"id":\d+,"baseUrl":"(.*?)"',url_list_str)[0]

    # 设置拥有一个动态变化跳转referer和headers
    headers_ = {
        "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36",
        "referer": url_
    }

    response_video = requests.get(video_url,headers=headers_,stream=True)
    bytes_video = response_video.content
    response_audio = requests.get(audio_url,headers=headers_,stream=True)
    bytes_audio = response_audio.content

    # 获取文件的大小  单位为kb
    video_size = int(int(response_video.headers['content-length'])/1024)
    audio_size = int(int(response_audio.headers['content-length'])/1024)

    with open(f"{title_}!.mp4", "wb") as f:
        f.write(bytes_video)
        print(f"纯视频文件下载完毕,大小为:{video_size}KB,{int(video_size/1024)}MB")
    with open(f"{title_}!.mp3", "wb") as f:
        f.write(bytes_audio)
        print(f"纯音频文件下载完毕,大小为:{audio_size}KB,{int(audio_size / 1024)}MB")

    ffmpeg_tools.ffmpeg_merge_video_audio(f'{title_}!.mp4', f'{title_}!.mp3', f'{title_}.mp4')
    print("视频合成成功!")
    # 显示合成文件的大小
    res_ = int(os.stat(f'{title_}.mp4').st_size/1024)
    print(f"{title_}视频文件下载完毕,大小为:{res_}KB,{int(res_ / 1024)}MB")

    os.remove(f"{title_}!.mp4")
    os.remove(f"{title_}!.mp3")
Hmily 发表于 2022-4-25 10:52
用代码框处理一下代码吧,会好看很多。

免费评分

参与人数 1吾爱币 +3 热心值 +1 收起 理由
pwp + 3 + 1 沙发惊现黑米

查看全部评分

学着用 发表于 2022-4-25 11:15
fjlong163 发表于 2022-4-25 11:17
学习了,谢谢
lnshijia 发表于 2022-4-25 11:36
会员是否可以呢
头像被屏蔽
eeeeda 发表于 2022-4-25 11:51
提示: 作者被禁止或删除 内容自动屏蔽
sskuye 发表于 2022-4-25 11:57
能抓VIP的内容?
Lxinghun 发表于 2022-4-25 12:01
请问有哪个教程可以推荐一下吗
atxz 发表于 2022-4-25 13:09
感谢分享,我来试试,
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 06:40

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表