分类: 工具(Tool)

微信公众号爬虫

微信公众号爬虫

** 最近在翻看整理之前的工作代码和文档,发现2017年做的微信公众号爬虫的两张流程图,来聊聊曾经使用过的微信公众号爬虫方案吧。**

当时为了实现能够准实时的抓取微信公众号文章,先后实现了7、8种方案。每个方案都在使用一段时间之后,由于微信更新了反爬策略,使得对应的方案被废弃或者需要更新。

需求

这个东西的需求其实很简单

  • 获取指定公众号的文章列表(包括历史文章)
  • 需要获得文章的永久链接
  • 有新文章更新的话,抓取延迟在30分钟之内

问题

面临的问题主要有这么几个:

  • 微信的反爬是基于账号来做的,服务端那边有实时统计也有阶段性统计,一旦发现有爬取迹象,微信会直接封锁账号
  • 微信的服务端通信是加密的,不仅仅是 https,大部分重要的请求和返回的数据本身也是加密过的。好在公众号文章列表和内容都是 json 和 html 非加密格式的。
  • 起初抓取到的公众号链接都是永久链接,但是从2017年下半年某个时间开始,能够抓取到的公众号链接就只有临时链接了,临时链接有效时间大概是几个小时。过期之后,普通浏览器包括微信 Web 版本打开都会提示页面过期,只能通过微信原生客户端内置的浏览器打开。

方案

曾经采用过的方案大概包括

  • 利用搜狗的微信搜索或者文章列表和更新信息,利用搜狗的漏洞建立 cookie 池应对反爬
  • 利用中间人的方式,拦截微信客户端请求结果,抓取文章列表和文章链接
  • 利用微信 Android 客户端调起微信内部UI打开公众号详情页获得文章列表(通过逆向工程获得的公众号详情页调起方式)
  • 利用微信 Android 客户端调起微信内部浏览器打开文章临时链接,再利用中间人的方式获得永久链接
  • 从第三方抓取

我找到的这两张图应该是倒数第2和第3个方案,为了保证每个部件的灵活性导致整个调度流程很复杂(毕竟微信三天两头都在更新反爬策略)。最终的实现大概能够达到的效果是,跟踪10000多个公众号的更新,每天抓取大约3w 篇文章,更新延迟大概在10-30分钟左右。

不过放上来的两个方案现在只能是当做回忆,基本不可用了。所以,想做这个东西的同学就不必浪费时间尝试了。

这两个流程图真是看看都头大,这里面使用了 redis、flask api、mitm、微信 Android 客户端等各种。

方案1

方案2

再次强调一下,这两个方案现在由于包括微信反爬策略的调整等某些原因基本属于不可用的状态了。最新的可用方案就不放上来了,用的人越多被封锁的越快。

心得

现在的工作基本不碰爬虫了,讲那段时间研究微信公众号爬虫的一点点心得吧。不一定对,仅供参考。

微信的数据交互有两种方式,一种是 https 请求,一种是 wss 连接。微信的 web 版只用 https 请求方式(所以功能有限),原生微信客户端两种方式都用。

前者 https 请求可以通过中间人的方式拿到一部分请求的响应数据,但是大部分的请求和响应结果都是加密过的。

后者 wss 连接是在微信一启动的时候就会建立,这个wss 连接的数据交有一套协议,其中大概会交换加密密钥(猜测),这个加密密钥应该不是在客户端而是通过 wss 由服务端下发的,需要加密的 https 请求会使用 wss 那里拿到的加密密钥进行加密解密。

不过 wss 的通信协议程已经有人逆向出来了,现在很多微信机器人的高级功能都是通过这个方式实现的(简单的机器人可以直接用微信的 web api,但是复杂的就不行了),卖的不便宜哦。