使用requests获取俄亥俄特许学校目录多页面链接的POST请求JSON错误问题
解决CauseIQ分页POST请求获取学校链接的问题
问题核心
你需要通过POST请求获取CauseIQ站点的后续分页学校数据,但因缺少csrftoken导致JSON解码错误。该站点要求请求携带CSRF令牌以验证合法性,令牌可通过初始GET请求获取。
解决步骤
- 初始GET请求拿令牌:访问目标页面时,站点会在页面meta标签或Cookie中返回
csrftoken,需先提取。 - POST请求携带令牌:把令牌加入请求头的
X-CSRFToken字段,同时用Session自动管理Cookie。 - 发送带分页参数的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
相关产品推荐
相关产品推荐

