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,求助以下问题:
- 400错误是否由null相关参数导致?
- 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
相关产品推荐
相关产品推荐

