用 Python 自动抓取公众号文章与账号数据:WechatSogou 完整使用手册

用 Python 自动抓取公众号文章与账号数据:WechatSogou 完整使用手册

【免费下载链接】WechatSogou 基于搜狗微信搜索的微信公众号爬虫接口 【免费下载链接】WechatSogou 项目地址: https://gitcode.com/gh_mirrors/we/WechatSogou

先抛一个可能颠覆你认知的事实:微信官方从来没有开放过公开的公众号内容检索接口。你在市面上看到的各类公众号数据分析平台,数据源头几乎都指向同一条通道——搜狗微信搜索。而 WechatSogou 这个开源项目,做的正是把这条通道包装成一组干净的 Python 接口,让微信公众号数据采集从"手工活"变成"几行代码的事"。

为什么这件事值得关注?想象一个内容运营的普通早晨:为了写竞品分析,你挨个打开十几个公众号,复制标题、记下发布时间、截图封面;再打开搜索页,把关键词相关的文章一条条摘录进表格。一上午过去,表格没填满,眼睛倒是先花了。如果你也经历过这种低效循环,这篇微信公众号数据采集实战手册就是为你准备的——我们会从安装开始,一步步把它跑起来,再落到真实场景里。

为什么你总是缺公众号数据

做内容的、做运营的、做研究的,迟早都会撞上同一堵墙:数据拿不到。

  • 想监控竞品,每天手动翻号、手动记录,漏一条就是信息差;
  • 想建内容聚合站,数据源分散在不同公众号,采集、清洗、归档全靠人肉;
  • 想做行业趋势分析,需要按关键词、按时间批量拉文章,手工完全不可行。

更麻烦的是,手动采集天然带着三个硬伤:格式不统一(有的号发图文、有的发纯文字)、无法批量处理、更无法定时自动更新。手动复制粘贴这条路,本质上是拿时间换数据,永远填不满需求。WechatSogou 解决的正是这套流程:把"搜索、筛选、提取、落地"全部自动化,你要做的只剩调用和存储。

WechatSogou 是什么:一条通往搜狗微信搜索的管道

简单说,WechatSogou 是一个基于搜狗微信搜索的微信公众号爬虫接口,它替你处理了请求构造、页面解析、验证码拦截、链接还原这些脏活累活,对外只暴露几个语义清晰的方法。项目同时兼容 Python 2.7 与 Python 3.5+,安装即用,没有复杂的依赖。

它的源码组织也很有章法,改起来不费力:

  • api.py:所有对外接口,采集入口都在这里;
  • request.py:负责生成搜狗搜索的请求 URL;
  • structuring.py:把返回的 HTML 解析成结构化字典;
  • const.py:定义搜索类型、时间范围、热点分类等常量;
  • identify_image.py:验证码识别与解锁逻辑;
  • exceptions.pyfilecache.pytools.py:异常定义、Cookie 缓存与工具函数。

整体思路是"请求—解析—结构化"三段式,哪怕你没打算改代码,读一遍模块划分也能大致理解数据是怎么流进来的。

环境准备:安装、初始化与第一个请求

安装只需一条命令,建议顺手加上升级参数:

pip install wechatsogou --upgrade

接着初始化 API。除了默认直连,你还可以按需传入代理、超时时间和验证码重试次数,所有 requests 库支持的参数都能透传:

import wechatsogou

# 最简用法:直连
client = wechatsogou.WechatSogouAPI()

# 进阶配置:代理 + 超时 + 验证码输错重试上限
client = wechatsogou.WechatSogouAPI(
    captcha_break_time=3,                    # 验证码识别错误允许重试 3 次
    timeout=5,                               # 单次请求超时 5 秒
    proxies={
        "http": "http://127.0.0.1:8888",
        "https": "http://127.0.0.1:8888",
    },
)

跑通第一个请求试试水。下面这段代码搜索"餐饮加盟"相关的公众号,并打印名称与微信号:

account_list = client.search_gzh("餐饮加盟")

for acc in account_list:
    print(acc["wechat_name"], "|", acc["wechat_id"])

到这里,管道已经通了。接下来我们把核心接口按"采集任务链路"串一遍——从选词、锁号、查档案,到批量拿文章、追热点。

锁定目标:从关键词联想到公众号档案

采集的第一步不是抓数据,而是定目标:你究竟要盯哪些号、搜什么词?

用关键词联想扩充选题。 不确定关键词怎么定?get_sugg 直接返回搜狗联想出的相关词,做内容选题和 SEO 扩展特别好用:

hints = client.get_sugg("基金")
for idx, word in enumerate(hints[:5], 1):
    print(f"{idx}. {word}")

公众号关键词联想建议界面

按关键词批量锁定公众号。 search_gzh 支持分页,每页返回一批公众号,正好用来把某个领域"一网打尽":

for page in range(1, 4):
    for acc in client.search_gzh("美食探店", page=page):
        print(f"{acc['wechat_name']} | 认证:{acc.get('authentication')}")

深挖单个公众号的完整档案。 当我们确定了重点关注对象,用 get_gzh_info 拿到它的头像、二维码、认证信息、简介、最近一月群发数与阅读量,这些字段足够支撑起一个公众号数据库:

info = client.get_gzh_info("运营研究社")

print("名称:", info["wechat_name"])
print("微信号:", info["wechat_id"])
print("认证:", info.get("authentication", "未认证"))
print("简介:", info["introduction"])
print("近一月群发:", info.get("post_perm"), "阅读量:", info.get("view_perm"))

公众号档案详情查询结果界面

拿文章:跨号检索与历史追更

目标定了,接下来就是文章层面。这一层有两个接口,覆盖"按主题搜"和"按账号追"两种场景。

跨公众号检索文章,支持时间与类型过滤。 search_article 除了基础的关键词搜索,还能组合时间范围与内容类型(有图、有视频、图文混合等),精准定位目标内容:

from wechatsogou import WechatSogouConst

# 最近一周内、带图的人工智能相关文章
articles = client.search_article(
    "人工智能",
    timesn=WechatSogouConst.search_article_time.week,
    article_type=WechatSogouConst.search_article_type.image,
)

for hit in articles:
    print(hit["article"]["title"], "——", hit["gzh"]["wechat_name"])

如果 timesn 设为 specific,还可以配合 ftet 两个日期参数指定任意起止区间,做时间窗口内的内容研究非常顺手。

公众号文章搜索结果界面

追踪单个公众号的历史推送。 get_gzh_article_by_history 接受公众号名称或微信号,返回账号基本资料和最近 10 条群发文章的明细,包括标题、摘要、发布时间、封面图、作者、是否原创等:

record = client.get_gzh_article_by_history("刘润")

print("账号:", record["gzh"]["wechat_name"])
print("文章数:", len(record["article"]))

for post in record["article"][:3]:
    print("标题:", post["title"], "| 时间:", post["datetime"])

公众号历史文章列表获取界面

追热点:按分类抓取热门榜单

如果你想做热点追踪或内容聚合,get_gzh_article_by_hot 按分类返回搜狗首页的热门文章。分类常量覆盖科技、财经、美食、旅行、教育、体育、游戏、萌宠等二十多个方向,挑你关心的频道即可:

from wechatsogou import WechatSogouConst

tech_hot = client.get_gzh_article_by_hot(WechatSogouConst.hot_index.technology)
finance_hot = client.get_gzh_article_by_hot(WechatSogouConst.hot_index.finance)

for item in tech_hot[:5]:
    print(item["article"]["title"], "|", item["gzh"]["wechat_name"])

每个结果都带文章标题、摘要、封面图与推送时间戳,直接就能喂给下游做聚合展示或热度统计。

公众号热门文章分类获取界面

三个可直接上手的实战脚本

光会调用接口还不够,我们把前面学的串成三个能直接跑的场景脚本。

场景一:竞品动态日报。 每天抓取竞品公众号的最新推送,生成一份 Markdown 日报:

def build_daily_report(client, accounts, output="daily.md"):
    lines = ["# 竞品动态日报", ""]
    for name in accounts:
        try:
            payload = client.get_gzh_article_by_history(name)
            latest = payload["article"][0]
            lines.append(f"- **{name}**:{latest['title']}({latest['datetime']})")
        except Exception as err:
            lines.append(f"- **{name}**:抓取失败,原因 {err}")
    with open(output, "w", encoding="utf-8") as f:
        f.write("\n".join(lines))

场景二:分类热点聚合。 把多个热门分类的文章收集起来,按分类归档成字典,方便接入聚合平台:

def collect_hot_by_category(client, categories, top_n=5):
    result = {}
    for cat in categories:
        picked = []
        for item in client.get_gzh_article_by_hot(cat)[:top_n]:
            picked.append({
                "title": item["article"]["title"],
                "summary": item["article"]["abstract"][:80],
                "source": item["gzh"]["wechat_name"],
            })
        result[cat] = picked
    return result

场景三:关键词发布趋势分析。 统计不同关键词下文章发布时间的分布,观察话题热度曲线:

from collections import Counter
from datetime import datetime

def analyze_publish_trend(client, keywords):
    trend = {}
    for word in keywords:
        date_counter = Counter()
        for hit in client.search_article(word):
            stamp = hit["article"]["time"]
            day = datetime.fromtimestamp(stamp).strftime("%Y-%m-%d")
            date_counter[day] += 1
        trend[word] = dict(date_counter)
    return trend

工程化加固:限速、重试与缓存

采集脚本跑起来不难,难的是让它长期稳定地跑。搜狗对请求频率有限制,IP 一旦被盯上,等待你的就是验证码和封禁。三个手段必不可少。

随机限速,模拟人工节奏。 每次请求前随机睡上几秒,比固定间隔更不容易触发风控:

import random
import time

def throttled_call(client, method, *args, **kwargs):
    time.sleep(random.uniform(2, 5))
    return getattr(client, method)(*args, **kwargs)

失败重试,对抗网络抖动。 用一个小函数包裹采集动作,失败就等一会儿再来:

def with_retry(fn, tries=3, pause=3):
    for attempt in range(tries):
        try:
            return fn()
        except Exception:
            if attempt == tries - 1:
                raise
            time.sleep(pause)

本地缓存,避免重复请求。 对频繁查询的关键词结果做文件缓存,命中就走本地,既省时间又降低请求压力。缓存键用参数组合生成,TTL 过期后自动失效,实现很轻量,逻辑完全可以自己写。

另外,搜狗返回的文章链接是临时链接,会过期。遇到这种情况,用 get_article_content 及时把正文和图片列表落盘,必要时还能传入 hosting_callback 把图片托管到对象存储,防止内容失效。

避坑指南:五个高频问题一次说清

把新手最常踩的坑集中讲透,能帮你省下大量排查时间。

1. 为什么只能抓到最近 10 篇文章? 这是微信平台的硬限制,搜狗只暴露最近 10 条群发。想要更全的历史,只能定期采集、持久化到自己的数据库里,慢慢累积。

2. 文章链接为什么突然打不开? 微信临时链接有有效期。正确做法是抓到即处理:用 get_article_content 把正文保存下来,而不是把 URL 存起来以后再用。

3. 遇到验证码怎么办? 项目内置了验证码处理机制,默认会调用人工识别回调 identify_image_callback_by_hand,你也可以接入第三方 OCR 服务。captcha_break_time 参数控制识别错误的容忍次数。

4. 到底支持哪个 Python 版本? Python 2.7 和 Python 3.5+ 都支持,如果在新版本上遇到异常,直接到项目提 issue 即可。

5. 请求频率有没有限制? 有。建议每次请求间隔 3~5 秒,别用并发轰炸,这是保护自己 IP 的基本修养。

结尾:给第一个脚本加上定时任务

工具的价值在于持续运行。现在你已经有了环境、接口、实战脚本和避坑清单,最后一步是把脚本挂到定时任务上——无论是操作系统的 cron,还是 Python 里的调度库,让日报每天自动生成、热点自动归档,从此告别每天早上打开几十个公众号手动抄数据的日子。

动手吧:安装 wechatsogou,把你最关心的三五个公众号写进脚本,跑出第一份自动化日报。数据采集这件事,从今天起不再是体力活。

【免费下载链接】WechatSogou 基于搜狗微信搜索的微信公众号爬虫接口 【免费下载链接】WechatSogou 项目地址: https://gitcode.com/gh_mirrors/we/WechatSogou

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值