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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 12:35:03