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

Python Requests POST请求无法获取marathonguides搜索结果的问题

问题分析与解决思路

你的情况大概率是网站新增了反爬验证机制,比如会话校验、CSRF令牌或者必填参数,以下是具体排查和解决步骤:

1. 抓包对比浏览器实际请求

打开浏览器F12的Network面板,手动提交一次搜索,对比你的代码请求和浏览器请求的核心差异:

  • 确认POST目标URL:检查网站是否把搜索接口改成了新端点(比如从search.cfm换成search-process.cfm)
  • 补全表单参数:查看浏览器提交的Form Data,是否有__CFID、__CFTOKEN这类ColdFusion站点常用的隐藏验证参数——这些参数需要从初始搜索页面的HTML里提取后,再随POST请求一起提交
  • 补全请求头:检查浏览器的请求头,比如是否包含Cookie(会话ID)、Accept-Encoding、Accept-Language等字段,这类字段现在可能被网站强制验证

2. 先获取会话Cookie和页面令牌

很多站点现在要求请求必须携带绑定的会话Cookie和页面令牌,你需要先访问一次搜索页面,拿到这些信息再提交搜索:

import requests
from bs4 import BeautifulSoup

# 用Session维持会话,自动保存Cookie
session = requests.Session()
search_page_url = "https://www.marathonguide.com/races/search.cfm"

# 先GET搜索页面,获取会话和页面隐藏参数
response = session.get(search_page_url)
soup = BeautifulSoup(response.text, "html.parser")

# 整理搜索参数,包含必填的隐藏字段
form_data = {
    "MarName": "Boston",
    "state": "0",
    "Country": "0",
    "BeginDate": "",
    "EndDate": "",
    "submit": "Search"
}
# 提取页面中所有隐藏input参数并加入表单
for input_tag in soup.find_all("input", type="hidden"):
    name = input_tag.get("name")
    value = input_tag.get("value")
    if name:
        form_data[name] = value

# 用会话提交POST请求
result_response = session.post(search_page_url, data=form_data)
print(result_response.text)

3. 模拟完整浏览器行为

  • 不要直接跳转到搜索页面提交,先模拟正常浏览流程:比如先访问网站首页,再进入搜索页面,再提交搜索
  • 可以更换最新的浏览器User-Agent,避免被识别为过时的爬虫请求
  • 添加合理的请求间隔,不要短时间内重复提交请求

内容的提问来源于stack exchange,提问作者jdylanwhite

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 15:38:19