使用Twitter GraphQL API爬取数据出现重复结果的问题排查
确认cursor提取路径的准确性
Twitter GraphQL响应中,分页cursor一般嵌套在data.search_timeline.timeline.instructions下的addEntries.entries列表里,需定位到entryId包含cursor-bottom的条目,提取其content.value值。检查你代码中解析JSON的路径是否正确,避免因路径错误提取到固定默认值或无效值。验证cursor是否被正确更新到请求参数
首次请求的variables通常不含cursor字段,第一次请求成功后,必须将提取到的新cursor赋值给variables["cursor"],确保下一次请求使用更新后的参数。示例代码:# 初始请求参数 variables = {"rawQuery": "你的搜索关键词", "count": 20} # 首次请求后提取cursor resp_json = response.json() # 遍历entries找cursor-bottom项 for entry in resp_json["data"]["search_timeline"]["timeline"]["instructions"][0]["addEntries"]["entries"]: if "cursor-bottom" in entry["entryId"]: new_cursor = entry["content"]["value"] break # 更新variables variables["cursor"] = new_cursor # 下一次请求使用更新后的variables排查是否在循环中复用了初始的
variables字典,或者更新cursor时未修改实际用于请求的变量。检查请求参数的编码方式
务必使用requests.get的params参数传递variables和features,让requests自动处理URL编码,避免手动拼接URL导致cursor中的特殊字符未转义,服务器无法识别分页参数而返回重复数据:import json import requests url = "https://twitter.com/i/api/graphql/xxx/SearchTimeline" headers = {"Authorization": "Bearer YOUR_TOKEN", ...} features = {"your_features": ...} params = { "variables": json.dumps(variables), "features": json.dumps(features) } response = requests.get(url, params=params, headers=headers)排查响应中的错误信息
每次请求后解析响应JSON,检查是否存在errors字段。若cursor无效、权限不足或接口限制,服务器可能不返回HTTP错误,而是直接返回第一页数据。示例检查代码:resp_json = response.json() if "errors" in resp_json: print("请求异常:", resp_json["errors"]) break确认循环逻辑的执行顺序
确保循环遵循「发起请求→提取cursor→更新variables→下一次请求」的顺序,避免出现先更新cursor(使用旧值)再请求的错误逻辑,导致每次都用相同的cursor获取重复数据。
内容的提问来源于stack exchange,提问作者Annisa Lianda

