爬虫无法爬取视频显示index out of range

img

img

操作环境Win11 pycharm 2022.3.2
代码:https://share.weiyun.com/WcAQhZxO

该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,你的代码中的问题及原因,还有最后修改完的完整代码如下:
根据您提供的代码和错误信息,出现 Index out of range 错误的原因可能是您在使用正则表达式提取视频标题时出现问题。具体来说,代码中的以下语句可能存在问题:

videoTitle = re.findall( '', webHtml)[0]

这里的正则表达式没有提供具体的匹配规则,因此可能无法正确地提取视频标题。导致 re.findall 返回一个空列表,这样就无法通过索引 [0] 来获取列表的第一个元素,从而出现了 IndexError。

为了解决这个问题,您需要提供一个正确的正则表达式来匹配视频标题。可以尝试查看网页源代码,找到包含视频标题的 HTML 元素,并使用正则表达式提取其中的文本。例如,如果视频标题在一个 <h1> 元素中,可以使用以下正则表达式来提取标题:

videoTitle = re.findall(r'<h1.*?>(.*?)</h1>', webHtml)[0]

这里的正则表达式使用了非贪婪模式,匹配了包含视频标题的 <h1> 元素,并提取其中的文本内容。

另外,您的代码中下载视频和音频文件的语句也存在问题。具体来说,您使用了与原始网址相同的 myUrl 来下载视频和音频文件,这样下载的实际上是网页内容,而不是视频或音频文件。您需要使用提取出来的视频和音频地址来下载对应的文件。具体来说,可以修改以下语句:

videoFile = requests.get(url=videoAddr, headers=myHeaders).content
audioFile = requests.get(url=audioAddr, headers=myHeaders).content

这里的 videoAddraudioAddr 分别是提取出来的视频和音频地址。

最终修改后的代码如下所示:

import requests
import re
import json

myUrl = 'https://www.bilibili.com/video/BV1wu411W7e1/?spm_id_from=333.1007.tianma.1-1-1.click'

myHeaders = {
    'Cookie': 'buvid3=BF337D16-7C51-2037-32B1-EA3EC632616F15042infoc; i-wanna-go-back=-1; b_ut=7; '
              '_uuid=A529102FA-2A8A-31F6-AC9D-B55513CB4F7503204infoc; FEED_LIVE_VERSION=V8; home_feed_column=5; '
              'browser_resolution=1707-888; b_nut=1684914404; CURRENT_FNVAL=4048; rpdid=|(k|JJumY|lk0J\'uY)RmuY|lm; '
              'header_theme_version=CLOSE; fingerprint=b848c2851f9cb38d01bc048592054ed4; buvid_fp_plain=undefined; '
              'PVID=1; b_lsid=9CDF61D1_1888B0996CB; bsource=search_baidu; buvid_fp=b848c2851f9cb38d01bc048592054ed4; '
              'sid=5cajgi1l; buvid4=3A224FA1-FBDD-46BE-8701-42F56DA429C717589-023052415-f12qdg2b0m4AirwIXqCbJw%3D%3D',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
                  'Chrome/113.0.0.0 Safari/537.36'
}

webHtml = requests.get(url=myUrl, headers=myHeaders).text

# 找出视频标题
videoTitle = re.findall(r'<h1.*?>(.*?)</h1>', webHtml)[0]

myJson = re.findall('.*?', webHtml)[0]
myDict = json.loads(myJson)
videoAddr = myDict['data']['dash']['video'][0]['baseUrl']
audioAddr = myDict['data']['dash']['audio'][0]['baseUrl']

myHeaders['origin'] = 'https://www.bilibili.com'
myHeaders['referer'] ='https://www.bilibili.com/video/' + myDict['data']['bvid']

videoFile = requests.get(url=videoAddr, headers=myHeaders).content
audioFile = requests.get(url=audioAddr, headers=myHeaders).content

with open(videoTitle + '.mp4', 'wb') as f:
    f.write(videoFile)

with open(videoTitle + '.mp3', 'wb') as f:
    f.write(audioFile)

在这个修改后的代码中,我使用了提取出来的视频 BV 号来构造正确的 referer 头部,同时使用 with 语句来打开文件并写入数据,这是更加安全和简洁的方式。


如果以上回答对您有所帮助,点击一下采纳该答案~谢谢