curl请求正常但Python requests触发IP封禁的问题排查
解决requests请求kleinanzeigen.de被封IP的问题
问题根源
kleinanzeigen.de的反爬系统能区分curl和requests的请求特征——requests默认的请求头、连接行为和curl不一样,直接用转换后的代码会被判定为非可信请求,而curl的请求特征刚好在网站的信任列表里,所以不会被封。
修复方法
- 1. 1:1复刻curl的所有请求头
把你用的curl命令里的所有请求头原封不动抄到requests的headers里,重点是User-Agent(别用requests默认的python-requests/xxx,直接用curl的,比如curl/8.5.0)、Accept、Accept-Language、Referer这些字段,一个都不能少。 - 2. 对齐curl的会话和连接设置
用requests.Session()来维持会话,和curl的会话行为保持一致;同时检查allow_redirects的设置是否和curl相同,必要时添加Connection: keep-alive这类头。 - 3. 带上curl的Cookie
执行curl命令时,把返回的Cookie内容提取出来,放到requests的cookies参数里,确保请求携带的Cookie和curl完全一致。 - 4. 核对请求细节
确认requests的请求方式(GET/POST)、URL参数、表单数据和curl完全匹配,别漏参数也别改格式。
示例代码
import requests # 从你的curl命令里复制所有请求头 headers = { 'User-Agent': 'curl/8.5.0', 'Accept': '*/*', 'Accept-Language': 'de-DE,de;q=0.9,en-US;q=0.8,en;q=0.7', # 把curl里的其他请求头都加上 } # 从curl响应里复制Cookie键值对 cookies = { 'sessionId': 'xxx', 'consent': 'xxx', # 其他Cookie内容 } url = 'https://www.kleinanzeigen.de/s-iphone-13/k0' # 使用Session维持会话 session = requests.Session() response = session.get(url, headers=headers, cookies=cookies) # 验证响应 print(response.status_code) print(response.text[:500])
额外提醒
- 别用requests频繁刷请求,保持和curl一样的请求间隔,避免触发频率限制。
- 如果还是被封,试试换个代理IP,但要确保代理的稳定性,别用烂大街的免费代理。
内容的提问来源于stack exchange,提问作者otto
相关产品推荐
相关产品推荐

