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

使用requests获取俄亥俄特许学校目录多页面链接的POST请求JSON错误问题

解决CauseIQ分页POST请求获取学校链接的问题

问题核心

你需要通过POST请求获取CauseIQ站点的后续分页学校数据,但因缺少csrftoken导致JSON解码错误。该站点要求请求携带CSRF令牌以验证合法性,令牌可通过初始GET请求获取。

解决步骤

  1. 初始GET请求拿令牌:访问目标页面时,站点会在页面meta标签或Cookie中返回csrftoken,需先提取。
  2. POST请求携带令牌:把令牌加入请求头的X-CSRFToken字段,同时用Session自动管理Cookie。
  3. 发送带分页参数的POST请求:构造正确的分页参数,发送请求即可拿到包含学校链接的JSON响应。

修正后的代码

import requests
from bs4 import BeautifulSoup

base_url = "https://www.causeiq.com/directory/charter-schools-list/ohio-state/"

headers = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36',
    'referer': base_url,
    'Accept': 'application/json'  # 明确要求返回JSON格式
}

with requests.Session() as s:
    # 1. 发送GET请求,获取csrftoken和站点Cookie
    resp_get = s.get(base_url, headers=headers)
    resp_get.raise_for_status()
    
    # 从页面meta标签提取csrftoken
    soup = BeautifulSoup(resp_get.text, 'html.parser')
    csrf_token = soup.find('meta', attrs={'name': 'csrf-token'})['content']
    
    # 2. 更新请求头,加入CSRF令牌
    s.headers.update({'X-CSRFToken': csrf_token})
    
    # 3. 构造分页参数,pageNumber从1开始(第一页为0)
    post_params = {"filters": [], "pageNumber": "1", "sortHow": "popularity", "sortDir": "desc"}
    
    # 发送POST请求
    resp_post = s.post(base_url, json=post_params, headers=headers)
    resp_post.raise_for_status()
    
    # 解析JSON并提取学校链接
    school_data = resp_post.json()
    school_links = [item.get('url') for item in school_data.get('results', []) if item.get('url')]
    print(school_links)

注意事项

  • 若未安装BeautifulSoup,执行pip install beautifulsoup4完成安装。
  • 若meta标签提取令牌失败,可尝试从Cookie中获取:csrf_token = s.cookies.get('csrftoken')。
  • 分页时递增pageNumber值即可遍历所有页面,注意不要超过站点的最大页数。

内容的提问来源于stack exchange,提问作者robots.txt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 20:20:04