×

搜狗微信检索公众号文章列表:结果降噪与异常状态识别实战

Ace Ace 发表于2026-11-04 16:55:45 浏览4 评论0

抢沙发发表评论

前言

搜狗微信搜索没有对外开放标准化的数据服务,只能通过网页检索入口获取公众号文章,网上多数示例只做简单页面解析,忽略推广内容、跳转验证、临时过期链接等现实问题。本文不追求无限制批量抓取,重点构建一套具备异常识别、广告过滤、链接有效性标记、分页边界判断的封装逻辑,适用于舆情素材收集、行业文章快照归档场景。代码会区分正常返回、验证码拦截、页面跳转、无结果等多种状态,方便上层业务做错误分支处理。

环境准备

Python3.8+,依赖 requests、beautifulsoup4;需要手动从浏览器复制有效 Cookie(SNUID、SUV)填入请求头,缺少会话凭证极易触发访问校验。未登录场景最多只能获取 10 页结果。

点击获取key和secret

import requests
import time
from urllib.parse import quote
from bs4 import BeautifulSoup

class SogouWeixinArticleFetch:
    def __init__(self, cookie_str):
        self.session = requests.Session()
        self.headers = {
            "User‑Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36",
            "Referer": "https://weixin.sogou.com/",
            "Cookie": cookie_str
        }
        self.session.headers.update(self.headers)

    def fetch_single_page(self, keyword, page):
        params = {
            "type": 2,
            "query": quote(keyword),
            "page": page
        }
        url = "https://weixin.sogou.com/weixin"
        try:
            resp = self.session.get(url, params=params, timeout=12, allow_redirects=False)
            #识别验证码跳转
            if resp.status_code ==302:
                return {"status":"verify","msg":"触发访问校验,需要更新Cookie","data":[]}
            soup = BeautifulSoup(resp.text,"html.parser")
            result_items = []
            ul_node = soup.find("ul",class_="news-list")
            if not ul_node:
                return {"status":"empty","msg":"当前页无匹配内容","data":[]}
            for li in ul_node.find_all("li"):
                #过滤推广广告条目
                if li.find(class_="promotion‑icon"):
                    continue
                title_a = li.find("a",target="_blank")
                account_name = li.find(class_="account").get_text(strip=True) if li.find(class_="account") else ""
                publish_time = li.find(class_="s2").get_text(strip=True) if li.find(class_="s2") else ""
                summary = li.find(class_="txt‑info").get_text(strip=True) if li.find(class_="txt‑info") else ""
                article_link = title_a.get("href") if title_a else None
                result_items.append({
                    "article_title":title_a.get_text(strip=True) if title_a else "",
                    "official_account":account_name,
                    "publish":publish_time,
                    "brief":summary,
                    "sogou_href":article_link
                })
            return {"status":"ok","data":result_items}
        except Exception as e:
            return {"status":"error","msg":str(e),"data":[]}

    def multi_page_scan(self, keyword, max_page=5):
        output = []
        for p in range(1,max_page+1):
            page_ret = self.fetch_single_page(keyword, p)
            if page_ret["status"] in ("verify","empty"):
                break
            if page_ret["status"] == "ok":
                output.extend(page_ret["data"])
            time.sleep(2.2)
        return output

if __name__ == "__main__":
    #替换为浏览器复制出来完整cookie字符串
    cookie_text = "SNUID=xxx;SUV=xxx;"
    client = SogouWeixinArticleFetch(cookie_text)
    article_list = client.multi_page_scan(keyword="数字化转型",max_page=2)
    for item in article_list:
        print(item)

核心实现思路

和普通直接解析页面脚本不同,代码把返回结果分为 4 种状态:正常、验证码校验、无数据、网络异常。一旦检测 302 跳转,立刻终止分页循环,不再继续无效请求。同时识别页面内推广标识过滤广告内容,避免舆情分析混入营销素材。会话对象复用 Cookie,减少频繁新建连接带来的风险。搜狗返回的链接属于中转短链,存在时效限制,业务上需要标记,不可当作永久地址存储。

落地避坑要点

  1. Cookie 具备时效性,SNUID 失效就会触发验证,需要定期从浏览器重新获取,没有通用自动化绕过方案CSDN博...;

  2. 未登录访问最多获取 10 页,设置 max_page 不要超过该上限;

  3. 请求间隔建议大于 2 秒,短时间高频访问会直接拦截 IP;

  4. 部分文章已经被公众号删除,虽然列表还能展示标题,但中转链接访问会 404,业务入库后需要做可用性巡检;

  5. 遵守网站访问协议,本示例仅用于技术学习,禁止用于大规模高频采集。

总结

这套方案重点解决网页检索入口的各种异常分支处理,把校验、空数据、广告过滤逻辑内置封装,输出干净的文章元数据,适合小规模行业素材收集。如果要长期运行,建议增加日志记录各个状态码,监控 Cookie 失效时机及时更新凭证。

群贤毕至

访客