公众号数据采集从0到1实战:用WechatSogou搭建你的内容情报站
【免费下载链接】WechatSogou 基于搜狗微信搜索的微信公众号爬虫接口 项目地址: https://gitcode.com/gh_mirrors/we/WechatSogou
公众号数据采集听起来门槛不低,但选对工具后真的就是"几行代码的事"。WechatSogou 是一个基于搜狗微信搜索的开源爬虫接口,能把公众号信息查询、文章检索、历史记录抓取这些脏活累活,统统打包成简洁的 Python 方法,特别适合想快速上手公众号数据抓取工具的新手。下面我就带你从零开始,一步步搭起自己的公众号数据采集流水线。
先讲一个发生在凌晨的崩溃现场
我有个做新媒体运营的朋友小林,负责监控十几个竞品公众号。她的日常是这样的:每天早上打开订阅号列表,挨个点进历史消息,把昨晚新发的文章标题、发布时间、阅读量复制到 Excel 里,再手动标上"蹭了哪个热点""用了什么标题套路"。到了周五,还要把这些零散记录拼成一份竞品周报。
听起来不算难,但干过的人都知道有多折磨:文章漏看是家常便饭——竞品可能深夜十一点发稿;格式乱成一锅粥——有的复制下来带表情符号,有的带小广告;最要命的是数据没法沉淀——上周看到的文章,这周再想找就找不到了。
这其实就是"公众号数据采集"要解决的问题:与其每天手工翻几十个号,不如写一个脚本,让代码替你去搜、去抓、去存。而 WechatSogou 这个项目,就是帮你把这件事做成的"现成轮子"。
接下来的内容,我会按一条完整的闯关路线带你走一遍:先搭环境,再跑通第一个采集任务,然后把数据落库,最后让脚本自己定时跑起来。全程口语化,代码只贴关键片段,跟着做就行。
第一步:先把环境搭起来,确认 WechatSogou 能用
磨刀不误砍柴工。在动手写采集代码之前,先把运行环境准备好。
WechatSogou 是标准的 PyPI 包,安装一条命令搞定:
pip install wechatsogou --upgrade
它底层依赖 requests、lxml、Pillow、bs4 这些库做网络请求和页面解析,pip 会自动帮你装好,不用手动折腾。项目本身对 Python 版本很宽容,Python 2.7 和 Python 3.5+ 都支持;如果你机器上有多个 Python 版本,建议先建一个虚拟环境再安装,省得互相污染。
装完之后怎么确认它真的能用?跑一个最轻量的接口试试。get_sugg 是用来获取搜索联想词的,请求最简单、基本不会触发验证码,非常适合当"开机自检":
import wechatsogou
api = wechatsogou.WechatSogouAPI()
print(api.get_sugg('垃圾分类'))
如果你看到控制台吐出来一串"垃圾分类""垃圾分类小程序""垃圾分类手抄报"之类的联想词,恭喜,说明整条链路已经打通了。
顺便认识一下 API 对象可以配置的参数:
# 验证码输错重试次数,默认 1
api = wechatsogou.WechatSogouAPI(captcha_break_time=3)
# 配置代理(列表里至少要有一个可用的 HTTPS 代理)
api = wechatsogou.WechatSogouAPI(proxies={"http": "127.0.0.1:8888", "https": "127.0.0.1:8888"})
# 设置请求超时
api = wechatsogou.WechatSogouAPI(timeout=0.1)
所有 requests 库支持的参数,这里基本都能透传进去,这点在你后面处理网络问题时非常有用。
第二步:跑通第一个采集任务,建一个"公众号名片库"
环境没问题了,下面进入正题:把"采集公众号信息"这件事跑起来。
假设你是一个做行业研究的同学,想先把"数据分析"领域值得关注的公众号全部搜集起来,存成一份清单。这件事拆开就是两步:先搜索找到它们,再逐个拿详情。
搜公众号用 search_gzh,按关键词返回公众号列表,每页 10 条,可以用 page 参数翻页。下面是当时实测的界面效果:
拿到列表之后,如果你想把某个号的信息查得更细,比如认证主体、近一个月群发数、阅读量,就用 get_gzh_info 直接输入微信号或名称:
get_gzh_info 返回的字段相当完整,包括:wechat_name(名称)、wechat_id(微信号)、introduction(简介)、authentication(认证主体)、post_perm(近一月群发数)、view_perm(近一月阅读量)、qrcode(二维码链接)以及 profile_url(最近 10 条群发页链接)。这些字段就是一个公众号的"名片"。
把搜索和详情串成一个完整任务,代码大概长这样:
import wechatsogou
api = wechatsogou.WechatSogouAPI()
keywords = ['数据分析', '数据可视化', '商业分析']
vault = {}
for word in keywords:
for gzh in api.search_gzh(word):
wid = gzh['wechat_id']
if wid and wid not in vault: # 按微信号去重
vault[wid] = gzh
print('收录:{}({})'.format(gzh['wechat_name'], wid))
print('共收录 {} 个公众号'.format(len(vault)))
跑完这一趟,你就拥有了一份属于自己的"公众号名片库",后续不管是做竞品分析还是找合作账号,都能直接从这份清单里查。
第三步:把文章抓下来,让数据真正"落库"
只有名片还不够,我们最终要的是内容。这一步的目标很明确:把公众号的文章抓下来,并且存进本地文件或数据库,形成自己的内容库。
抓历史文章用 get_gzh_article_by_history,输入公众号的名称或微信号,它会把公众号的基本信息和最近 10 条群发消息一起返回,每条消息包含标题、摘要、发布时间、封面图、文章链接、作者、是否原创等字段:
一个很常见的需求是把这些文章保存下来。最简单的方式就是落成 JSON 文件:
import json
import wechatsogou
api = wechatsogou.WechatSogouAPI()
history = api.get_gzh_article_by_history('南航青年志愿者')
articles = [{
'title': item['title'],
'datetime': item['datetime'],
'abstract': item['abstract'],
'url': item['content_url'],
'cover': item['cover'],
} for item in history['article']]
with open('articles.json', 'w', encoding='utf-8') as fp:
json.dump(articles, fp, ensure_ascii=False, indent=2)
print('已保存 {} 篇文章'.format(len(articles)))
数据量上去之后,建议从 JSON 换成 SQLite 或 MySQL,建一张 article 表存标题、链接、时间、来源,再建一张 gzh 表存公众号资料,用微信号做外键关联。这就是一个最小可用的内容库雏形。
另外有个重要提醒:从搜索和历史接口拿到的文章链接都是临时链接,会过期。所以如果你需要保存正文,最好抓到链接后立刻用 get_article_content 把正文内容取出来:
detail = api.get_article_content(articles[0]['url'])
print(detail['content_html'][:200]) # 文章正文 HTML
这个接口还能顺手处理正文里的 QQ 音乐、语音消息,也支持把微信图片托管到自己的对象存储,后续扩展空间很大。
如果你不想局限于某一个公众号,还想在全网微信文章里搜某个主题,就用 search_article:
它支持按时间范围和内容类型筛选。比如"只看最近一周、带图的原创文章",可以这么写:
from wechatsogou import WechatSogouConst
result = api.search_article(
'人工智能',
timesn=WechatSogouConst.search_article_time.week,
article_type=WechatSogouConst.search_article_type.image
)
时间范围有 anytime / day / week / month / year / specific 几档,内容类型有 all / rich / video / image 几种,组合起来足够覆盖绝大多数检索场景。
第四步:解放双手,让采集脚本自己跑起来
手动跑脚本和手动翻公众号相比,已经省力很多了,但还差最后一步:让它定时自己跑。
思路很简单——把"采集一次"封装成一个函数,然后让它在固定的时间点重复执行。在 Linux 服务器上可以直接用 crontab,本地开发也可以用 APScheduler,或者干脆用一个最朴素的死循环加休眠:
import time
import random
def daily_pickup():
"""每日采集:抓最新文章 -> 追加进内容库 -> 打印摘要"""
history = api.get_gzh_article_by_history('南航青年志愿者')
new_items = [a for a in history['article'] if not exists_in_db(a['title'])]
save_to_db(new_items)
print('今日新增 {} 篇'.format(len(new_items)))
while True:
daily_pickup()
time.sleep(random.uniform(1800, 3600)) # 每半小时到一小时跑一次
上面的 exists_in_db 和 save_to_db 就对应你第三步建好的存储逻辑,这里只做示意。
这里有两件事一定要上心:
- 控制请求频率。搜狗对请求频率有限制,跑批任务时建议每个请求之间至少间隔 3~5 秒,或者像我上面那样加随机延时,模拟人类操作节奏,避免 IP 被封。
- 做增量去重。每次采集都判断标题或链接是否已存在,避免内容库越攒越脏。
把这套定时任务挂起来之后,你就正式从"每天手动翻号的人"升级成了"每天自动收数据的人",小林的周报噩梦到此终结。
进阶玩法一:追热点怎么写选题?热门榜单告诉你
数据采集中有一个很实用的玩法:盯热门。做内容的人最头疼的就是"今天写什么",而微信热门文章榜单就是现成的选题雷达。
get_gzh_article_by_hot 可以按分类拉取搜狗微信首页的热门文章,返回每条热文的标题、摘要、发布时间、封面图和来源公众号:
分类非常多,都定义在 WechatSogouConst.hot_index 里,比如 technology(科技)、finance(财经)、food(美食)、military(军事)、game(游戏)、pet(萌宠)等等。举个实际用法:
from wechatsogou import WechatSogouAPI, WechatSogouConst
api = WechatSogouAPI()
for item in api.get_gzh_article_by_hot(WechatSogouConst.hot_index.technology):
print(item['article']['title'], '——', item['gzh']['wechat_name'])
你可以每天早上定时拉一遍各分类的热门,把标题和来源攒进一张"选题观察表",一周下来哪些话题在升温、哪些领域在降温,一目了然。选题不再是拍脑袋,而是有数据支撑的。
进阶玩法二:关键词联想,内容选题的灵感补给站
写文章最怕没灵感,起标题最怕没方向。这时候 get_sugg 可以当你的灵感补给站:输入一个词,它把搜狗微信搜索的联想词全部吐给你:
import wechatsogou
api = wechatsogou.WechatSogouAPI()
for word in api.get_sugg('考研'):
print(word)
输出会是一长串"考研""考研时间""考研英语""考研数学"之类的相关词。这些联想词本身就是用户真实在搜的东西,拿来发散选题、规划公众号菜单、甚至做栏目命名都特别好用。你也可以把它接进关键词库的自动化流程:每个主题词定期拉一次联想词,扩充你的选题池。
避坑手册:这些坑我替你踩过了
新手用 WechatSogou,翻车基本都翻在下面几个地方,提前打个预防针。
问:为什么只能拿到 10 篇文章? 答:这是搜狗微信接口的硬限制,它只展示公众号最近 10 条群发消息,不是代码的问题。想要更完整的文章档案,只能靠"长期定时采集 + 本地累积",这也是我前面反复强调落库的原因——数据是攒出来的。
问:文章链接怎么总是失效? 答:因为接口给的是临时链接,微信会定期把它们作废。应对办法是抓到链接后尽快调用 get_article_content 把正文和图片保存下来,别把链接当成永久资源。
问:跑着跑着突然要输验证码? 答:很正常,搜狗和微信都会用验证码防爬。WechatSogou 内置了打码入口 identify_image_callback_by_hand,遇到验证码会把图片弹出来让你手动输入;量大的话也可以自己写一个回调函数,接第三方打码服务,把识别结果返回给框架。请求频率降下来,遇到验证码的次数也会明显变少。
问:Python 2 的老项目还能用吗? 答:能。项目同时兼容 Python 2.7 和 Python 3.5+,老环境也能跑。不过新项目建议直接用 Python 3,示例代码里的 print 用法你注意按版本调整即可。
问:请求发多了会被封吗? 答:会。控制频率是第一原则,其次是必要时配置 proxies 走代理换 IP。记住一句话:我们是采集数据,不是攻击服务器,温柔一点才能采得久。
深入探索:读懂源码,才能玩得更远
用熟了之后,如果想进一步定制,翻翻源码比看任何文档都管用。这个项目的目录结构很清晰:
wechatsogou/api.py—— 对外 API 主入口,所有采集方法的定义都在这里wechatsogou/request.py—— 负责拼接各种搜狗搜索 URLwechatsogou/structuring.py—— 负责把抓回来的 HTML 解析成结构化数据wechatsogou/const.py—— 集中定义时间范围、文章类型、热门分类等常量wechatsogou/identify_image.py—— 验证码识别与解锁逻辑wechatsogou/tools.py、filecache.py—— 小工具和本地缓存
官方的使用说明和更新记录分别放在 docs/README.rst 和 docs/HISTORY.rst,遇到接口用法不确定的时候去翻一下比猜快得多。项目还带了一套测试用例在 test/ 目录下,其中 test_api.py 覆盖了各个接口的典型调用方式,是绝佳的"活文档"。
如果你想做二次扩展,几个可入手的点:自定义验证码识别回调、给文章图片写托管回调(hosting_callback)、把 structuring.py 的解析结果接进自己的数据管道。这个项目本身就是为了方便别人扩展而设计的,改起来很顺手。
结尾:现在就动手
回过头看看这一路,其实就四件事:装好环境、跑通采集、数据落库、定时运行。做完这四步,你已经从"手动翻公众号的苦力"变成了"自动化数据采集流水线的掌控者",公众号信息、文章内容、热门话题、搜索联想词,全都成了可以随时调用的数据资产。
下一步很简单:打开终端,pip install wechatsogou,先把你最关注的那几个公众号抓一遍试试。从小目标开始——比如先建一份"行业公众号清单",再存一次"最近一周的文章"。跑通第一个任务带来的成就感,比看一百篇教程都管用。
最后多一句嘴:采集能力再强,也要遵守平台规则和法律法规,控制好频率、尊重数据来源。把工具用在正经地方,公众号数据采集这条路才能走得长久。
【免费下载链接】WechatSogou 基于搜狗微信搜索的微信公众号爬虫接口 项目地址: https://gitcode.com/gh_mirrors/we/WechatSogou
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考









