You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python 3中urllib.request.urlopen(url)失效求助:404错误但浏览器可访问

解决urllib访问古腾堡URL报404的问题

我之前也踩过这个坑!问题出在请求头的User-Agent上——古腾堡的服务器会验证请求来源,默认的urllib请求头会被识别为非浏览器请求,直接返回404;而浏览器会自动带上合法的User-Agent,所以能正常访问。

修复方案(urllib版本)

只需要给请求添加一个模拟浏览器的User-Agent头即可,修改后的代码如下:

import urllib.request

url = 'http://www.gutenberg.org/files/2554/2554.txt'
# 模拟Chrome浏览器的请求头,你也可以换成其他浏览器的User-Agent
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}
# 创建带请求头的Request对象
req = urllib.request.Request(url, headers=headers)

# 用with语句自动管理资源,读取并解码为字符串
with urllib.request.urlopen(req) as f:
    ebook_text = f.read().decode('utf-8')

# 验证一下,打印前500个字符
print(ebook_text[:500])

更简洁的替代方案(requests库)

如果你愿意使用第三方库requests,代码会更简洁直观(需要先通过pip install requests安装):

import requests

url = 'http://www.gutenberg.org/files/2554/2554.txt'
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}

response = requests.get(url, headers=headers)
response.encoding = 'utf-8'  # 指定编码为utf-8
ebook_text = response.text

print(ebook_text[:500])

核心原理都是一样的:让服务器认为这是一个正常的浏览器请求,从而允许你获取到电子书内容。

内容的提问来源于stack exchange,提问作者Sarang Manjrekar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:10:40