如何用Python Requests实现curl -L功能,获取重定向后的Bot检测页面?
用Python Requests获取curl -L触发的Bot检测页面
测试情况
- 执行普通curl命令:
$curl https://[xxx].fr/[xxxx] <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> <html><head> <title>307 Temporary Redirect</title> </head><body> <h1>Temporary Redirect</h1> <p>The document has moved <a href="/redirect?token=lfbzjv3m2yabpbb8tggjjmsgz2">here</a>.</p> </body></html>
返回307临时重定向,这和Python Requests的默认返回结果一致。
- 执行带
-L参数的curl命令(自动跟随重定向且保留请求头):
$curl -L https://[xxx].fr/[xxxx] <html> <head> <title>机器人检测</title> </head> <body> <h1>检测到机器人</h1> </body> </html>
返回显示“机器人检测”的页面(原法语内容已翻译)。
需求
希望通过Python Requests获取到该Bot检测页面,用于生成第三方链接状态报告,无恶意行为。
实现方法
Python Requests默认会跟随重定向,但不会像curl -L那样在重定向过程中完整保留原请求头,这是导致结果不同的核心原因。要模拟curl的行为,可按以下步骤操作:
1. 自定义重定向钩子保留请求头
通过Requests的会话钩子(hook),在重定向时将原请求的头信息同步到重定向请求中:
import requests target_url = "https://[xxx].fr/[xxxx]" # 模拟curl默认的请求头,可根据实际情况调整 curl_headers = { "User-Agent": "curl/7.81.0", "Accept": "*/*" } def preserve_headers_on_redirect(response, *args, **kwargs): # 若响应是重定向,将原请求头更新到下一个请求中 if response.is_redirect: next_request = response.next next_request.headers.update(curl_headers) return response # 创建会话并注册钩子 session = requests.Session() session.hooks["response"].append(preserve_headers_on_redirect) # 发起请求 response = session.get(target_url, headers=curl_headers) # 打印返回页面内容 print(response.text)
2. 关键细节说明
- User-Agent匹配:目标网站可能通过User-Agent识别请求来源,使用curl默认的UA(如
curl/7.81.0)能更精准模拟curl -L的请求特征。 - 完整头信息同步:除了UA,curl默认还会发送
Accept: */*等头,同步这些头能进一步减少请求特征差异。 - 重定向方法处理:307重定向要求重定向时保持原请求方法(这里是GET),Requests默认会处理这一点,无需额外配置。
内容的提问来源于stack exchange,提问作者Konchog
相关产品推荐
相关产品推荐

