添加User-Agent后仍遇Python requests 403(1020)错误如何解决?
403状态码+1020错误码的请求失败原因分析
问题描述
我把curl命令转换成Python的requests代码,包含了全部请求头,但请求https://v2.gcchmc.org/book-appointment/时返回403状态码,HTML输出里存在错误码1020。能获取到cookies,但无法得到预期响应。已知用Selenium可以实现需求,想搞清楚问题的产生原因。已确认所有依赖库已安装并检查过版本,问题仍未解决。
代码示例
import requests headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:106.0) Gecko/20100101 Firefox/106.0', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8', 'Accept-Language': 'en-US,en;q=0.5', # 'Accept-Encoding': 'gzip, deflate, br', 'DNT': '1', 'Connection': 'keep-alive', 'Upgrade-Insecure-Requests': '1', 'Sec-Fetch-Dest': 'document', 'Sec-Fetch-Mode': 'navigate', 'Sec-Fetch-Site': 'none', 'Sec-Fetch-User': '?1', } response = requests.get('https://v2.gcchmc.org/book-appointment/', headers=headers) print(response.status_code) print(response.cookies.get_dict()) with open("test.html",'w') as f: f.write(response.text)
原因分析
Cloudflare人机验证拦截(1020错误):错误码1020是Cloudflare的「访问被拒绝」标识,说明目标站点用Cloudflare做安全防护。requests只是模拟了请求头,但没有真实浏览器的运行环境——Cloudflare会通过JavaScript渲染能力、浏览器指纹(比如Canvas/WebGL指纹、浏览器底层属性)等特征判断请求是否来自真实用户,非浏览器发起的请求会直接被拦截。
缺少浏览器级别的交互行为:真实浏览器发起请求时,还有很多隐含行为是requests没有的:
- 可能先发起OPTIONS预请求确认权限
- 会携带Cloudflare验证流程生成的有效Cookie(比如__cf_bm这类Cookie,需要先通过验证才能拿到可用的)
- 页面加载时会自动请求关联的CSS、JS等资源,而requests只是单次请求,没有这些后续交互,容易被识别为爬虫。
请求头的细节问题:虽然你复制了大部分请求头,但浏览器的请求头是有固定顺序的,requests默认的头顺序和浏览器不一致,这也是Cloudflare的识别点之一。另外你注释掉了
Accept-Encoding,真实浏览器会发送这个头,缺失也可能触发拦截规则。
内容的提问来源于stack exchange,提问作者farhan jatt
相关产品推荐
相关产品推荐

