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

Python用urlretrieve访问datausa.io遇403错误,求原因及解决办法

解析datausa.io页面时遇到403 Forbidden错误的解决方案

我来帮你拆解这个问题,一步步解决:

错误原因解析

你遇到的HTTP Error 403: Forbidden是因为服务器直接拒绝了你的请求。核心原因是:你用urllib发起请求时,没有携带浏览器标识(User-Agent),网站的反爬机制识别出这是自动化程序(而非正常用户的浏览器请求),所以直接拦截了。

另外补充一点:你URL里的#intro是页面内锚点,服务器端并不会处理这个部分,去掉它也完全不影响获取页面内容。

更可靠的页面访问方法

推荐用requests库来发起请求,它比原生urllib更简洁,也更容易自定义请求头。步骤如下:

  1. 先安装requests库(如果还没装的话):
pip install requests
  1. 使用以下代码模拟浏览器请求:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:14:45