GET请求在Postman正常运行,Python 3.9返回429错误求助
解决Python请求Expedia返回429的问题
429状态码说明你的请求被目标网站的反爬机制拦截了,核心原因是Python请求和Postman/C#的请求存在请求特征差异,被识别为非浏览器请求。
你的Python代码存在的几个问题:
- 手动添加了小写的
host头:requests库会自动根据URL生成标准的Host头(首字母大写),手动指定格式不符的头反而容易触发反爬规则。 - 缺少浏览器标准请求头:Postman和真实浏览器会自动携带
Accept、Accept-Language等关键头信息,你的Python请求只有User-Agent,请求特征过于单一。 - GET请求误用
data参数:data是为POST请求设计的参数,GET请求即使传空值,也属于不符合规范的请求特征。
修改后的可行代码:
import requests url = "https://www.expedia.com/" # 模拟真实Chrome浏览器的完整请求头 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9', 'Accept-Language': 'en-US,en;q=0.9', 'Accept-Encoding': 'gzip, deflate, br', 'Connection': 'keep-alive', 'Upgrade-Insecure-Requests': '1' } # GET请求无需data参数,直接发送 response = requests.get(url, headers=headers) print(response.status_code)
额外注意事项:
- 避免短时间内重复请求:即使修改请求头,频繁访问依然会触发429,建议添加合理的延迟(比如
import time; time.sleep(2))。 - 可尝试使用
requests.Session():会话会自动维护cookies,更贴近浏览器的访问模式,进一步降低被拦截概率。
内容的提问来源于stack exchange,提问作者Ashish Venkat Barad
相关产品推荐
相关产品推荐

