微信公众号文章爬虫抓取实现原理!

前言web

  • 不管是新方案仍是旧方案, 获取公众号文章列表, 获取阅读点赞, 获取评论等接口能够经过抓包来获取微信

  • 以上接口都是须要受权的, 受权参数主要有一下几个架构

    • uin : 用户对于公众号的惟一ID, 原本是一个数字, 传的是base64以后的结果框架

    • key : 与公众号和uin绑定, 过时时间大概是半小时测试

    • pass_ticket: 另一个验证码, 与uin进行绑定ui

    • req_id: 在文章里HTML里, 每次请求会不同, 用来构成获取阅读点赞接口的RequestBody, 一次有效url

    • 获取阅读点赞接口有频率限制, 测试的结果是一个微信号5分钟能够查看30篇文章的阅读点赞代理

旧方案日志

在2015年的时候微信网页版限制仍是没那么严格的, 当时采用的主要思路是使用微信网页版, 而后用requests去模拟登录一下,code

而后不停的去访问相似下面的接口爬取信息:

https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxcheckurl?requrl=encodeURIComponent('http://mp.weixin.qq.com/mp/getmasssendmsg?__biz=MjM5NzQ3ODAwMQ==#wechat_redirect‘)

当时为了能让爬虫多个实例跑, 用了一下 Celery 框架(如今想简直智障, 多个实例跑直接把程序启动N次就好了啊。。摔), 因为是模拟登录, 因此又写了一套复杂的东西去生成二维码, 而后获取登录URL, 具体的模拟登录原理参考这个 wechat-deleted-friends, 另外相关的Celery Task里写的逻辑太复杂了, 一个Task里就带上了 requests断线重连机制, 模拟登录机制, 解析列表, 解析文章等, 另外因为是web版微信有一套蛮复杂的sync机制, 有时候直接掉线须要再次的去手动登录, 非常麻烦。

以后web版微信已经没法的获取Key了(2016年开始), 此方案就废弃了。。

新方案

经leader提醒, 改了一下架构, 其中项目的总体结构以下:

微信公众号爬虫实现

微信爬虫架构图

  • Seeds 是一个producer, 在此处指经过某种方式获取 uin, key, pass_ticket 信息, 思路相似中间人攻击+解析squid日志

  • Consumer C1从Q1队列中取出seeds后爬取某个公众号的文章列表, 解析后将文章Meta信息放入队列Q2

  • Consumer C2获取文章原信息后就能够直接作入库&爬取操做了

  • 以后能够继续加队列而后去实现爬取文章阅读点赞的相关数据了, 因为有频率限制。一个微信号一天只能最多获取8000篇文章的阅读点赞信息

  • 抛弃了Celery和其默认选用的RabbitMQ队列, 这种东西实在过重了。。改用beanstalkd作消息队列

  • 目前的效果是单微信号每日更新4w左右的公众号文章, 若是想继续增长数量能够经过加机器来扩展

Update

生成key的方式是写按键精灵的脚本去不断地生成文章列表URL而后不停的点击, 用squid作代理来获取带Key的URL(squid须要配置一下ssl-bump透明代理)

Over

相关文章
相关标签/搜索