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

Quora动态内容爬取POST请求返回400错误的排查求助

Quora动态内容爬取问题排查

问题背景

尝试爬取Quora搜索链接https://www.quora.com/search?q=microwave&type=question的问题列表,因动态加载效率低,改用模拟页面滚动时触发的POST请求替代Selenium。抓包得到的原始请求payload如下:

{"queryName":"SearchResultsListQuery","variables":{"query":"microwave","disableSpellCheck":null,"resultType":"question","author":null,"time":"all_times","first":10,"after":"19","tribeId":null},"extensions":{"hash":"f88cad2308823dc82766c0025ca34be70ea3e60d850a756187645d7483ba2c3b"}}

运行以下代码后返回<Response [400]>:

import requests

url = 'https://www.quora.com/graphql/gql_para_POST?q=SearchResultsListQuery'
data = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36 Edg/108.0.1462.76", "queryName":"SearchResultsListQuery","variables":{"query":"microwave","disableSpellCheck":"null","resultType":"question","author":"null","time":"all_times","first":10,"after":"19","tribeId":"null"},"extensions":{"hash":"f88cad2308823dc82766c0025ca34be70ea3e60d850a756187645d7483ba2c3b"}}
r = requests.post(url, data = data)
print(r)

已尝试将null参数替换为'null'、None、空字符串或删除对应键,均无效,怀疑hash值错误但无法获取有效hash,求助以下问题:

  1. 400错误是否由null相关参数导致?
  2. POST请求中的hash是否为常见机制,如何获取正确的hash值?

问题解答

1. 400错误是否由null相关参数导致?

大概率不是。你的代码存在几个更关键的错误:

  • 请求格式错误:Quora的GraphQL接口要求接收JSON格式的请求体,但你用了data参数,requests会自动将其编码为form-data格式,完全不符合接口要求,应该改用json参数传递数据。
  • User-Agent位置错误:你把User-Agent放到了请求体里,它属于请求头(headers)的一部分,不是payload的内容。
  • null参数处理错误:原始payload里的null是JSON的空值,对应Python里的None,你写成'null'是字符串类型,不符合接口的参数格式要求。

先修正这些问题,代码调整为:

import requests

url = 'https://www.quora.com/graphql/gql_para_POST?q=SearchResultsListQuery'
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36 Edg/108.0.1462.76"
}
data = {
    "queryName": "SearchResultsListQuery",
    "variables": {
        "query": "microwave",
        "disableSpellCheck": None,
        "resultType": "question",
        "author": None,
        "time": "all_times",
        "first": 10,
        "after": "19",
        "tribeId": None
    },
    "extensions": {
        "hash": "f88cad2308823dc82766c0025ca34be70ea3e60d850a756187645d7483ba2c3b"
    }
}
r = requests.post(url, headers=headers, json=data)
print(r)

如果仍返回400,再重点排查hash值的问题。

2. POST请求中的hash是否为常见机制,如何获取正确的hash值?

这个hash是Quora针对GraphQL查询的签名验证机制,属于反爬手段的一种,不算通用但不少大厂的GraphQL接口会采用类似逻辑。

获取正确hash的可行方法:

  • 实时抓包复制:每次访问目标页面时,在浏览器开发者工具的Network面板中找到对应的GraphQL请求,直接复制请求体里的extensions.hash值。注意该hash可能和查询内容、用户会话绑定,一段时间后会失效,需要重新抓取。
  • 逆向JS生成逻辑:Quora的前端代码会动态生成这个hash,你可以分析页面加载的打包JS文件,找到hash的生成规则(通常是对查询名称、变量等内容做SHA-256这类哈希计算)。不过逆向难度较高,需要具备一定的JS逆向基础。
  • 复用浏览器会话:抓包时带上浏览器的Cookie,保持和浏览器相同的会话状态,因为hash可能和会话中的某些参数关联,复用Cookie后复制的hash值有效性会更高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 11:20:53