weixin_sogou SNUID 验证:3 步跑通微信公众号文章爬虫
【免费下载链接】weixin_sogou爬取微信公众号文章项目地址: https://gitcode.com/gh_mirrors/we/weixin_sogou
第一次跑 weixin_sogou,返回的永远是搜狗的反爬验证页,一行文章都拿不到。翻了十几行源码才发现,卡点藏在同一个 cookie 里——SNUID,weixin_sogou 反爬排查的整个流程其实就是 3 步。
问题长什么样 🚨
- 返回的 HTML 里没有任何搜索结果,页面卡在搜狗的"网络异常"验证页上
soup.select("._item")返回空列表,get_account_info直接返回 None- 同一份 cookies 昨天还好好的,今天每个请求都被当成新访客
为什么会卡住
搜狗微信像个先查票再放人的入口。你用正常浏览器访问时,服务器会发一张"票"(SNUID cookie),之后放行你的请求;爬虫不经过前台,拿不到票,服务器一看没票的请求,干脆不回数据,直接甩你到验证页。所以关键不是"破解"验证,而是先把票领到手,塞进请求里。
分步绕过:从 0 到跑通 ✅
步骤一:给请求装一个正常 UA。这一步做什么:在 Session 上设置一个真实浏览器的 User-Agent。为什么:服务器看到脚本 UA,连票都不愿意发给你。
102| s = requests.Session() 103| s.headers.update({"User-Agent": UA})步骤二:先打一次搜索请求,完成"签到"。这一步做什么:先向weixin.sogou.com/weixin?query=123这样的搜索页发一次请求。为什么:这次请求的响应里,服务器会顺手把 SNUID 写出来,这是你领票的唯一入口。
步骤三:从响应体里把 SNUID 抠出来,写回 cookies。这一步做什么:用正则从响应文本里提取 SNUID 写进s.cookies,实在缺票时再补一个基于毫秒时间戳随机生成的 SUV(见 weixin_sogou.py 里update_cookies()的末尾)。为什么:搜狗有时只把票写在页面文本里,不会直接下发 Set-Cookie,必须自己抠。
151| if 'SNUID' not in s.cookies: 152| p = re.compile(r'(?<=SNUID=)\w+') 153| s.cookies['SNUID'] = p.findall(r.text)[0]三步走完后,把这份 cookies 传给后续的get_account_info、parse_list等请求,数据就回来了。
常见踩坑点 ⚠️
问:SNUID 明明拿到了,为什么过一会儿又失效?票有有效期,而且绑定会话,请求越频繁掉得越快。再遇到验证页时,正确动作是重新跑一遍update_cookies()重新签到领新票,别指望旧 cookie 还能用。
问:cookies 没问题,但请求还是被拦,怎么排查?先检查 UA 和请求方式是否匹配——UA 装成浏览器、请求行为却不像浏览器,照样会被标记。其次把请求间隔拉开一点,高频访问是加速验证触发的最常见原因。
问:SUV 和 SNUID 有什么区别?SNUID 是服务器发的票,SUV 是爬虫自己算出来的号(毫秒时间戳拼随机数),两者要配套出现,搜狗会一起校验,缺一个都可能被拦。
整套绕过思路说白了就一句:先领票,再进园。如果你也正对着那个空白验证页发愣,打开 weixin_sogou.py 里的update_cookies()函数,对照上面 3 步逐行过一遍,你的爬虫马上就能跑通。
【免费下载链接】weixin_sogou爬取微信公众号文章项目地址: https://gitcode.com/gh_mirrors/we/weixin_sogou
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考