这段代码爬取出来的结果是“C:\Users\HUAWEI\miniconda3\python.exe D:\python-learning\+id弹幕爬取.py Traceback (most recent call last): File "D:\python-learning\+id弹幕爬取.py", line 51, in <module> segments = get_segments(cid) ^^^^^^^^^^^^^^^^^ File "D:\python-learning\+id弹幕爬取.py", line 11, in get_segments response = requests.get(url, headers=headers) ^^^^^^^^ NameError: name 'requests' is not defined”帮我分析一下原因,并将代码进行改进
时间: 2025-07-04 17:10:24 浏览: 15
你遇到的错误是:
```
NameError: name 'requests' is not defined
```
这个错误的意思是:在你的代码中使用了 `requests` 模块,但是在当前作用域中找不到它的定义。也就是说,你在某些函数或模块中使用了 `requests.get()` 但是没有在该函数所在的文件顶部导入它。
---
## ❗问题原因
根据你提供的错误信息来看,你的代码中:
```python
response = requests.get(url, headers=headers)
```
这行代码所在的 `get_segments()` 函数里调用了 `requests` 模块,但此时 Python 并不知道 `requests` 是什么,因为你在该脚本中 **没有正确导入** 它。
---
## ✅ 解决方案
你需要确保在整个脚本的最开始添加如下导入语句:
```python
import requests
```
这样整个脚本中的所有函数都可以访问到 `requests` 模块。
---
## ✅ 改进后的完整代码(已修复 NameError)
下面是修复后的完整代码,请注意我已经加上了必要的 `import` 和保持原有逻辑不变:
```python
import requests # 必须加上这一行!
import re
from datetime import datetime
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36",
}
# 获取弹幕分片信息
def get_segments(cid):
url = f"https://api.bilibili.com/x/web-interface/view/danmaku/segs?oid={cid}&type=1"
response = requests.get(url, headers=headers)
if response.status_code != 200:
raise Exception(f"Failed to fetch segments: {response.status_code}")
return [i + 1 for i in range(len(response.json()['data']))]
# 获取单个分片的弹幕数据
def fetch_danmu(cid, segment_index=None):
url = f"https://api.bilibili.com/x/v1/dm/list.so?oid={cid}"
if segment_index is not None:
url += f"&segment_index={segment_index}"
response = requests.get(url, headers=headers)
if response.status_code != 200:
raise Exception(f"Failed to fetch danmu from segment {segment_index}: {response.status_code}")
html_doc = response.content.decode('utf-8')
return html_doc
# 解析弹幕内容和时间
def parse_danmu(html_doc):
pattern = re.compile(r'<d p="(.*?)">(.*?)</d>')
matches = pattern.findall(html_doc)
danmu_list = []
for match in matches:
p_attributes = match[0].split(',')
time_in_video = float(p_attributes[0])
content = match[1]
minutes = int(time_in_video // 60)
seconds = int(time_in_video % 60)
milliseconds = int((time_in_video % 1) * 100)
formatted_time = f"{minutes:02d}:{seconds:02d}.{milliseconds:02d}"
danmu_list.append({"content": content, "formatted_time": formatted_time})
return danmu_list
# 主程序
if __name__ == "__main__":
cid = "202980503" # 替换为实际CID
all_danmu = []
# 获取所有分片索引
try:
segments = get_segments(cid)
except Exception as e:
print("获取分片失败:", e)
exit()
for seg in segments:
print(f"正在抓取第 {seg} 个弹幕分片...")
html_doc = fetch_danmu(cid, seg)
danmu_list = parse_danmu(html_doc)
all_danmu.extend(danmu_list)
# 输出所有弹幕
for danmu in all_danmu:
print(f"弹幕内容: {danmu['content']}, 视频内时间点: {danmu['formatted_time']}")
```
---
## 🔍 补充建议
- 确保你的环境中安装了 `requests` 库:
```bash
pip install requests
```
- 如果你仍然报错,请检查是否将 `import requests` 错误地写到了某个函数内部或者被注释掉了。
- 可以加入异常处理机制,比如网络请求失败重试、超时设置等,提高爬虫稳定性。
---
##
阅读全文