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

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

用 Python 自动抓取公众号文章与账号数据: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基于搜狗微信搜索的微信公众号爬虫接口项目地址: https://gitcode.com/gh_mirrors/we/WechatSogou

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