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
相关产品推荐
相关产品推荐

