在Apify上最热门的Google Trends抓取工具评分只有三颗多星,评论区里几乎全是同样的抱怨——它能跑一阵子,然后所有请求立刻开始返回429。这可不是个没人修的bug,而是抓取Trends真正的硬骨头,多数工具根本处理不了。我自己就重构了三遍才让它不再扑街。
别指望官方API。Google Trends压根没公开接口,内部那个只提供一次性令牌,并且按IP毫不留情地限流。接下来我把整个请求流程、Google暗中拒绝服务机器人会话的环节,以及真正能扛住的自动重试机制全部拆出来。
一套“令牌握手”的完整舞步
Trends没有一个“给我某个关键词数据”的直接端点。你必须先走一次握手。第一步:explore。你告诉它你要什么,它会返回一组widget,每个widget携带一个一次性token和你需要重放的请求载荷:
GET https://trends.google.com/trends/api/explore?hl=en-US&tz=0&req={...}
这里的req是一个JSON对象,描述你的对比项——可以是一个关键词,也可以是多个比较词,每个词附带地理和时间窗口:
{"comparisonItem":[{"keyword":"bitcoin","geo":"US","time":"today 12-m"}],"category":0,"property":""}
把它做一次URL编码塞进req=里,请求就发出去了。返回的响应前面会带上一串)]}'——这是Google的抗XSSI守卫,堵在每一个Trends API回应前面,避免响应体被直接当成脚本标签执行。记得剔掉第一个{之前的所有内容,否则JSON解析器第一步就报错。
接下来,你想拿哪个板块的数据,就用该widget的token去调对应的数据端点:
- multiline:返回“随时间变化的搜索兴趣”
- comparedgeo:返回“按区域划分的兴趣”
- relatedsearches:返回相关查询和相关主题
它们前面统统带着同样的)]}'前缀。这里有一个值得留意的细节:token会对请求做部分签名。你可以改动widget请求里的某些字段——比如提高resolution来获得更细的地理粒度——仍然能通过校验。但一旦碰了不该碰的字段,像userConfig.userType,就会直接401。所以别想着改个字符串就能把自己伪装成登录用户,我试过,就是401。
Google不给机器人看的那些板块
相关主题每次都会空着回来。不是偶尔,是所有匿名爬虫,永远如此。你的explore响应里会被打上userType: USER_TYPE_SCRAPER,针对这个用户类型,Google会在实体类的相关主题板块返回一个空rankedList,而相关查询却照样正常工作。一个已登录浏览器拿到的却是USER_TYPE_LEGIT_USER和完整的载荷。同意Cookie那套完全没用。我花了真的非常尴尬的大量时间,一度以为是自己把解析器弄坏了,直到把浏览器会话和爬虫会话进行 diff,看到了这个userType翻转才恍然大悟。
所以我把最确定的一句话放在这里:匿名会话下的相关主题是服务端硬控,没有真正的登录手段,我觉得根本绕不过去。
那解决方案就变得清晰了:如果你能接受拿不到相关主题,那就专心搞定token握手和重试闸门。把这个流程里的每一条错误路径都兜住,才是让Trends抓取不再动不动全线429的关键。别试图用现成的Actor黑盒一把梭,你得自己管住每个token的生命周期,并在限流信号出现时主动放慢脚步,而不是指望对方突然变温柔。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.