Python用urlretrieve访问datausa.io遇403错误,求原因及解决办法
解析datausa.io页面时遇到403 Forbidden错误的解决方案
我来帮你拆解这个问题,一步步解决:
错误原因解析
你遇到的HTTP Error 403: Forbidden是因为服务器直接拒绝了你的请求。核心原因是:你用urllib发起请求时,没有携带浏览器标识(User-Agent),网站的反爬机制识别出这是自动化程序(而非正常用户的浏览器请求),所以直接拦截了。
另外补充一点:你URL里的#intro是页面内锚点,服务器端并不会处理这个部分,去掉它也完全不影响获取页面内容。
更可靠的页面访问方法
推荐用requests库来发起请求,它比原生urllib更简洁,也更容易自定义请求头。步骤如下:
- 先安装requests库(如果还没装的话):
pip install requests
- 使用以下代码模拟浏览器请求:
import requests # 设置模拟浏览器的请求头,这里用Chrome的标识,你也可以换成其他浏览器的 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36' } # 去掉URL里的#intro,服务器不处理锚点 url = 'https://datausa.io/profile/geo/jacksonville-fl/' # 发起请求 response = requests.get(url, headers=headers) # 检查请求是否成功并保存内容 if response.status_code == 200: with open('jacksonville_page.html', 'w', encoding='utf-8') as f: f.write(response.text) print("页面内容已成功保存") else: print(f"请求失败,状态码:{response.status_code}")
如果坚持要用urllib,也可以手动添加请求头:
import urllib.request url = 'https://datausa.io/profile/geo/jacksonville-fl/' headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36' } # 创建携带请求头的请求对象 req = urllib.request.Request(url, headers=headers) # 发起请求并保存内容 with urllib.request.urlopen(req) as response: page_content = response.read().decode('utf-8') with open('jacksonville_page.html', 'w', encoding='utf-8') as f: f.write(page_content) print("页面内容已成功保存")
关于.io域名的疑问
完全不用担心.io域名后缀会影响Python的处理!域名后缀只是网站的标识,和Python发起HTTP请求的逻辑没有任何关系。你遇到的问题纯粹是请求头的问题,和域名类型无关。
内容的提问来源于stack exchange,提问作者Inexorable
相关产品推荐
相关产品推荐

