吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 646|回复: 7
收起左侧

[经验求助] 为什么python成功获取到视频下载链接后,保存文件有时只有1KB的内容

[复制链接]
wfxwfx 发表于 2024-6-6 21:22
25吾爱币
本帖最后由 wfxwfx 于 2024-6-6 21:30 编辑

import requests,re,json
import time
from pprint import pprint
url="https://www.bilibili.com/video/BV1Rs421A7Hy/?spm_id_from=333.1007.tianma.2-3-6.click&vd_source=945208d1e240f7b01243e00cda181d24"
url2="https://www.bilibili.com/video/BV1ny411h7WE/?spm_id_from=333.1007.tianma.1-1-1.click"
headers={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36 Edg/125.0.0.0"
         }
resp=requests.get(url=url2,headers=headers).text
title=re.findall('<h1 data-title="(.*?)" title=',resp)[0]
resp=json.loads(re.findall('<script>window.__playinfo__=(.*?)</script>',resp)[0])
link_video=resp["data"]["dash"]["video"][0]["baseUrl"]
link_audio=resp["data"]["dash"]["audio"][0]["baseUrl"]
audio=requests.get(url=link_audio,headers=headers).content
video=requests.get(url=link_video,headers=headers).content
with open(title+".mp4",mode="wb") as f:
    f.write(video)
time.sleep(1)
with open(title+".mp3",mode="wb") as f:
    f.write(audio)
print("完成!!!")
为什么python成功获取到视频下载链接后,保存文件有时只有1KB的内容

最佳答案

查看完整内容

提供一个示例代码 Cookie需要自行获取 [mw_shl_code=python,true]# 导入数据请求模块 import requests # 导入正则表达式模块 import re # 导入json模块 import json # TODO 记得更改你要的url和你自己的cookie url = 'https://www.bilibili.com/video/BV1Rs421A7Hy/' cookie = "buvid3=2844B77E-F527-FB05-1DF5-9FDF834AE3E888277infoc; b_nut=1709986388; i-wanna-go-back=-1; b_ut=7; _uuid=6577D687-BED9-9AE2-106A10- ...

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

LaoShui08 发表于 2024-6-6 21:22
提供一个示例代码 Cookie需要自行获取
[Python] 纯文本查看 复制代码
# 导入数据请求模块
import requests
# 导入正则表达式模块
import re
# 导入json模块
import json
# TODO 记得更改你要的url和你自己的cookie
url = 'https://www.bilibili.com/video/BV1Rs421A7Hy/'
cookie = "buvid3=2844B77E-F527-FB05-1DF5-9FDF834AE3E888277infoc; b_nut=1709986388; i-wanna-go-back=-1; b_ut=7; _uuid=6577D687-BED9-9AE2-106A10-551210627F5AC88087infoc; enable_web_push=DISABLE; buvid4=5ED5B3A0-A998-7D47-3815-9AD9A1B27A4989131-024030912-0Fw3r6dKwZLwPoWOl%2F8HuA%3D%3D; CURRENT_FNVAL=4048; rpdid=|(u|Jmkkuukk0J'u~u|ulR~)~; header_theme_version=CLOSE; fingerprint=c27c0b59dd10dcdc4c14701a58f49669; buvid_fp_plain=undefined; buvid_fp=c27c0b59dd10dcdc4c14701a58f49669; LIVE_BUVID=AUTO6217111182462626; FEED_LIVE_VERSION=V_WATCHLATER_PIP_WINDOW3; bp_video_offset_691902317=925084214145056785; DedeUserID=691902317; DedeUserID__ckMd5=ead312019baad7ed; CURRENT_QUALITY=80; bili_ticket=eyJhbGciOiJIUzI1NiIsImtpZCI6InMwMyIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MTYwNDM3MDgsImlhdCI6MTcxNTc4NDQ0OCwicGx0IjotMX0.Rdjc9F5oiEXSn_GylRWm3s2L-Pn8GYfyQS5IZt_Y3-8; bili_ticket_expires=1716043648; SESSDATA=3d6f944f%2C1731336513%2C491d2%2A51CjD5jp6zedAz4nQallTN_akUjFzg2LzJhdKMiJbI1nnw2bs5sp8Y09F7Jj4PofjUyfsSVlktMkF0aDRLN196dVNTeWh0czllbFZTWDlidWRpcnFnaENSNVVNbGNFMGR5bFBqYkcwalhuVklyUGJLVHJtYXo3TVpaTENqQ21rS0RPbldWTDUzRFp3IIEC; bili_jct=2975523315e5bccfa606ac286df61f36; home_feed_column=4; browser_resolution=1396-639; sid=6gr3y4l0; PVID=4; bp_t_offset_691902317=932475264446758937; b_lsid=5E9C415B_18F86EC150D"
headers = {
        # Referer 防盗链 告诉服务器你请求链接是从哪里跳转过来的
        # "Referer": "https://www.bilibili.com/video/BV1454y187Er/",
        "Referer": url,
        # User-Agent 用户代{过}{滤}理, 表示浏览器/设备基本身份信息
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36",
        "Cookie": cookie
}
# 发送请求
response = requests.get(url=url, headers=headers)
html = response.text
print(html)
# 解析数据: 提取视频标题
title = re.findall('title="(.*?)"', html)[0]
print(title)
# 提取视频信息
info = re.findall('window.__playinfo__=(.*?)</script>', html)[0]
# info -> json字符串转成json字典
json_data = json.loads(info)
# 提取视频链接
video_url = json_data['data']['dash']['video'][0]['baseUrl']
print(video_url)
# 提取音频链接
audio_url = json_data['data']['dash']['audio'][0]['baseUrl']
print(audio_url)
video_content = requests.get(url=video_url, headers=headers).content
# 获取音频内容
audio_content = requests.get(url=audio_url, headers=headers).content
# 保存数据
with open('video\\' + title + '.mp4', mode='wb') as v:
    v.write(video_content)
with open('video\\' + title + '.mp3', mode='wb') as a:
    a.write(audio_content)
freelive 发表于 2024-6-7 15:32
看一下是否有加密和解密,没有正确的获取到完整视频文件。
zake 发表于 2024-6-7 15:49
我用你的代码跑了之后是正常的一个7500k的MP3,一个31130k的MP4
会不会是ip问题,换一个再爬试试
 楼主| wfxwfx 发表于 2024-6-8 14:52
freelive 发表于 2024-6-7 15:32
看一下是否有加密和解密,没有正确的获取到完整视频文件。

正常获得视频文件,就是有时下载的内容不完整,跟没下的一样
qianaonan 发表于 2024-6-8 18:16
问题可能出在以下几个方面:

请求到的视频或音频文件不完整。
网络问题导致下载中断或未完全下载。
写文件时未正确处理响应内容。
为了解决这些问题,我们可以:

检查响应状态码,确保请求成功。
使用 stream=True 参数来处理大文件下载。
以块的形式写入文件内容,以确保下载的完整性。
下面是改进后的代码:
[Python] 纯文本查看 复制代码
import requests
import re
import json
import time

url = "https://www.bilibili.com/video/BV1ny411h7WE/?spm_id_from=333.1007.tianma.1-1-1.click"
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36 Edg/125.0.0.0"
}

# 获取网页响应
resp = requests.get(url=url, headers=headers).text

# 提取视频标题
title = re.findall('<h1 data-title="(.*?)" title=', resp)[0]

# 提取播放信息的JSON数据
playinfo_json = re.findall('<script>window.__playinfo__=(.*?)</script>', resp)[0]
resp = json.loads(playinfo_json)

# 获取视频和音频的URL
link_video = resp["data"]["dash"]["video"][0]["baseUrl"]
link_audio = resp["data"]["dash"]["audio"][0]["baseUrl"]

# 下载并保存内容的函数
def download_content(url, headers, filename):
    with requests.get(url, headers=headers, stream=True) as r:
        r.raise_for_status()  # 检查HTTP请求是否成功
        with open(filename, 'wb') as f:
            for chunk in r.iter_content(chunk_size=8192):
                if chunk:  # 过滤掉保持连接的空块
                    f.write(chunk)

# 下载视频
download_content(link_video, headers, f"{title}.mp4")
time.sleep(1)  # 暂停一秒,确保下载过程不会冲突

# 下载音频
download_content(link_audio, headers, f"{title}.mp3")

print("完成!!!")

关键改动:
stream=True 参数:这样可以逐块读取内容,而不是一次性加载所有内容,适合大文件下载。
按块写入文件:以 8192 字节(8KB)为单位写入文件,有助于处理大文件并避免不完整下载。
错误处理:使用 r.raise_for_status() 来捕捉HTTP错误。
这样做可以提高下载的可靠性,避免保存不完整文件的情况。
LaoShui08 发表于 2024-6-8 19:31
加Referer告诉服务器你请求链接是从哪里跳转过来的,没有这个,就无法成功
LaoShui08 发表于 2024-6-9 18:19
@wfxwfx 楼主请及时查看 若有问题可提出 无误请及时结贴
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

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

GMT+8, 2024-12-16 05:02

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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