公众号数据采集从0到1实战:用WechatSogou搭建你的内容情报站

公众号数据采集从0到1实战:用WechatSogou搭建你的内容情报站

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

公众号数据采集听起来门槛不低,但选对工具后真的就是"几行代码的事"。WechatSogou 是一个基于搜狗微信搜索的开源爬虫接口,能把公众号信息查询、文章检索、历史记录抓取这些脏活累活,统统打包成简洁的 Python 方法,特别适合想快速上手公众号数据抓取工具的新手。下面我就带你从零开始,一步步搭起自己的公众号数据采集流水线。

先讲一个发生在凌晨的崩溃现场

我有个做新媒体运营的朋友小林,负责监控十几个竞品公众号。她的日常是这样的:每天早上打开订阅号列表,挨个点进历史消息,把昨晚新发的文章标题、发布时间、阅读量复制到 Excel 里,再手动标上"蹭了哪个热点""用了什么标题套路"。到了周五,还要把这些零散记录拼成一份竞品周报。

听起来不算难,但干过的人都知道有多折磨:文章漏看是家常便饭——竞品可能深夜十一点发稿;格式乱成一锅粥——有的复制下来带表情符号,有的带小广告;最要命的是数据没法沉淀——上周看到的文章,这周再想找就找不到了。

这其实就是"公众号数据采集"要解决的问题:与其每天手工翻几十个号,不如写一个脚本,让代码替你去搜、去抓、去存。而 WechatSogou 这个项目,就是帮你把这件事做成的"现成轮子"。

接下来的内容,我会按一条完整的闯关路线带你走一遍:先搭环境,再跑通第一个采集任务,然后把数据落库,最后让脚本自己定时跑起来。全程口语化,代码只贴关键片段,跟着做就行。

第一步:先把环境搭起来,确认 WechatSogou 能用

磨刀不误砍柴工。在动手写采集代码之前,先把运行环境准备好。

WechatSogou 是标准的 PyPI 包,安装一条命令搞定:

pip install wechatsogou --upgrade

它底层依赖 requestslxmlPillowbs4 这些库做网络请求和页面解析,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_dbsave_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 —— 负责拼接各种搜狗搜索 URL
  • wechatsogou/structuring.py —— 负责把抓回来的 HTML 解析成结构化数据
  • wechatsogou/const.py —— 集中定义时间范围、文章类型、热门分类等常量
  • wechatsogou/identify_image.py —— 验证码识别与解锁逻辑
  • wechatsogou/tools.pyfilecache.py —— 小工具和本地缓存

官方的使用说明和更新记录分别放在 docs/README.rstdocs/HISTORY.rst,遇到接口用法不确定的时候去翻一下比猜快得多。项目还带了一套测试用例在 test/ 目录下,其中 test_api.py 覆盖了各个接口的典型调用方式,是绝佳的"活文档"。

如果你想做二次扩展,几个可入手的点:自定义验证码识别回调、给文章图片写托管回调(hosting_callback)、把 structuring.py 的解析结果接进自己的数据管道。这个项目本身就是为了方便别人扩展而设计的,改起来很顺手。

结尾:现在就动手

回过头看看这一路,其实就四件事:装好环境、跑通采集、数据落库、定时运行。做完这四步,你已经从"手动翻公众号的苦力"变成了"自动化数据采集流水线的掌控者",公众号信息、文章内容、热门话题、搜索联想词,全都成了可以随时调用的数据资产。

下一步很简单:打开终端,pip install wechatsogou,先把你最关注的那几个公众号抓一遍试试。从小目标开始——比如先建一份"行业公众号清单",再存一次"最近一周的文章"。跑通第一个任务带来的成就感,比看一百篇教程都管用。

最后多一句嘴:采集能力再强,也要遵守平台规则和法律法规,控制好频率、尊重数据来源。把工具用在正经地方,公众号数据采集这条路才能走得长久。

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

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

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

抵扣说明:

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

余额充值