All Projects → wuyanwuyan → Wechat Articles Crawler

wuyanwuyan / Wechat Articles Crawler

微信公众号文章爬取,基于anyproxy,包含阅读数点赞数

Programming Languages

javascript
184084 projects - #8 most used programming language

Projects that are alternatives of or similar to Wechat Articles Crawler

Wechatbotengine
基于微信网页版 HTTP 协议的机器人引擎(含一些机器人)。WeChat bot engine based on WeChat HTTP protocol of WeChat Web Edition, several bots included.
Stars: ✭ 145 (-8.23%)
Mutual labels:  wechat
Wechat Proxy
微信代理服务。提供简单易用的 HTTP 接口,简化微信公众号后台开发。
Stars: ✭ 151 (-4.43%)
Mutual labels:  wechat
Wechat Request
🚀⚡️基于Promise实现微信小程序http请求,轻便,小巧,api友好,功能丰富
Stars: ✭ 156 (-1.27%)
Mutual labels:  wechat
Mpeditor
微信markdown编辑器
Stars: ✭ 146 (-7.59%)
Mutual labels:  wechat
Wechat Api
🗯 wechat-api by java7.
Stars: ✭ 1,813 (+1047.47%)
Mutual labels:  wechat
Hardcoder
Hardcoder is a solution which allows Android APP and Android System to communicate with each other directly, solving the problem that Android APP could only use system standard API rather than the hardware resource of system.
Stars: ✭ 1,930 (+1121.52%)
Mutual labels:  wechat
Miniprogram Foodmap
微信小程序 · 美食地图模板
Stars: ✭ 143 (-9.49%)
Mutual labels:  wechat
Omi
Front End Cross-Frameworks Framework - 前端跨框架跨平台框架
Stars: ✭ 12,153 (+7591.77%)
Mutual labels:  wechat
Magento Chatbot
Magento Chatbot Integration with Telegram, Messenger, Whatsapp, WeChat, Skype and wit.ai.
Stars: ✭ 149 (-5.7%)
Mutual labels:  wechat
Wechatpc
PC微信hook源码,PC微信注入,逆向编程,可以制作微信机器人玩玩,仅供学习,请不要用于商业、违法途径,本人不对此源码造成的违法负责!
Stars: ✭ 154 (-2.53%)
Mutual labels:  wechat
Wechat Playground
🐳 WeChat Playground - 开源微信调试工具
Stars: ✭ 147 (-6.96%)
Mutual labels:  wechat
Wechat autojump game
用Golang实现微信跳一跳游戏自动玩
Stars: ✭ 148 (-6.33%)
Mutual labels:  wechat
Egg Mp
EggJS插件:微信公众平台基本服务
Stars: ✭ 153 (-3.16%)
Mutual labels:  wechat
Imageviewer
A simple and customizable Android full-screen image viewer 一个简单且可自定义的Android全屏图像浏览器
Stars: ✭ 1,889 (+1095.57%)
Mutual labels:  wechat
Cleanupwechatzombiefans
auto.js脚本,Android自动化,清理微信僵尸粉
Stars: ✭ 155 (-1.9%)
Mutual labels:  wechat
Electronic Qq
[FREEZED]the electionic-QQ based on smart-qq & electronic-wechat written in Nodejs
Stars: ✭ 144 (-8.86%)
Mutual labels:  wechat
Gopay
golang语言实现的支付模块,支持支付宝app,支付宝网页版,微信app,微信公众号支付
Stars: ✭ 151 (-4.43%)
Mutual labels:  wechat
Crmeb wechatminiprogram
CRMEBv2.6以客户管理为中心+电商营销系统,微信小程序商城,带分销、秒杀、积分、优惠券等功能
Stars: ✭ 158 (+0%)
Mutual labels:  wechat
We Cropper
微信小程序图片裁剪工具
Stars: ✭ 1,972 (+1148.1%)
Mutual labels:  wechat
Caswechat
caswechat 微信全接口SDK封装
Stars: ✭ 155 (-1.9%)
Mutual labels:  wechat

基于anyproxy的微信公众号文章爬取,包含阅读数点赞数

录制的视频:点击前往

Watch the video

基本原理

  1. AnyProxy是一个阿里开源的HTTP代理服务器,类似fiddler和charles,但是提供了二次开发能力,可以编写js代码改变http/https请求和响应
  2. 为了爬取一个微信公众号的全部文章,首先就是获取全部文章,然后一篇一篇去打开获取文章标题,作者,阅读数,点赞数(阅读点赞数只能在微信app内置浏览器获取)
  3. 每个微信公众号都提供查看历史消息的功能,点击去打开这个网页,不停下滚,可以查到全部发布文章。在这一步,基于anyproxy,修改了这个网页html,注入一段让页面不停往下滚动的js脚本,当滚到底部,就获取了全部文章列表。 本质上是中间人攻击。
  4. 获取完全部文章的内容(包括url,标题,发布时间等等)后,下一步就是循环通知微信浏览器一个一个去打开这些文章网页。每个文章网页也注入js脚本,功能是不停的检查页面的点赞数和阅读数,检测到,就往某服务器发,后台每成功收到一个文章的点赞数和阅读数,就通知微信浏览器打开下一个url。这里我使用了socketio,实现微信浏览器和自建的koa服务器之间的通讯。

如图所示:

获取文章列表演示:

一篇一篇打开文章链接:

如何运行

第一步,一定要安装成功anyproxy,这一步请详细阅读anyproxy的官方教程,写的很详细,要保证能成功代理https,能查看到https的body内容。

yarn install
yarn start

会自动打开一个result.html,实时查看爬取文章的内容 点击一个微信公众号,点击查看历史消息,之后历史页面会不停的滚动到底,滚动完毕,就开始一篇一篇打开文章,爬取内容。 实时结果显示

具体过程

1.第一步,要获取一个公众号的全部历史文章。在已经设置好anyproxy代理的真机上,查看历史消息,这时微信会打开历史文章网页。 获取一个html文档: var msgList就是我们需要的历史文章数据,简单正则匹配出来,替代非法字符,JSON.parse转成我们需要的格式。 基于anyproxy,我们给这个html文档注入一段脚本,目的是让这个网页不停的往下自己滚动,触发浏览器去获得更多的文章。

var scrollKey = setInterval(function () {
    window.scrollTo(0,document.body.scrollHeight);
},1000);

当网页滚到底,再次获取文章,这个时候,同样的是get请求,但是返回了Content-Type为application/json的格式,这里同样的方法,正则匹配找出并格式化成我们需要的格式

同时当can_msg_continue为0时,表示已经拉到底,获取了全部文章。

至此,获得了一个公众号的全部文章,包括文章标题,作者,url。但是没有阅读数和点赞数,这需要打开具体的文章链接,才能看得到。

  1. 我们还没获得阅读数和点赞数,接下来就是一步一步让微信浏览器不停地打开具体文章,触发微信浏览器获取阅读数和点赞数。这里使用了socket.io,让文章页面连接自定义的服务器,服务器主动通知浏览器下一个点开的文章链接,这样双向通讯,一个循环就能获取具体文章的阅读数和点赞。
socket.on('url', function (data) {
    window.location = data.url;
});

阅读数和点赞可以在浏览器端,不停检查dom元素是否渲染出来然后收集发往服务器,也可以直接anyproxy检查出来(这里我采用前一种)。

key = setInterval(function () {
        var readNum = $('#readNum3').text().trim();

        if (!readNum) return;
        var likeNum = $('#likeNum3').text().trim();
        var postUser = $('#post-user').text().trim();
        var postDate = $('#post-date').text().trim() || $('#publish_time').text().trim();
        var activityName = $('#activity-name').text().trim();
        var js_share_source = $('#js_share_source').attr('href');
        socket.emit('crawler', {
            readNum: readNum,
            likeNum: likeNum,
            postUser: postUser,
            postDate: postDate,
            activityName: activityName,
            js_share_source: js_share_source
        });
    }, 1000);

post响应中的阅读数和点赞数

实践过程的注意点

原理很简单,基于真机的爬虫,中间人攻击,注入javascript脚本,让浏览器模拟人的操作过程。

  1. 禁止网页的Content-Security-Policy。CSP 的实质就是白名单制度,开发者明确告诉客户端,哪些外部资源可以加载和执行,等同于提供白名单。如果不禁用,注入的javascript将无法执行。这里的做法,简单粗暴的删除http响应的任何和csp有关的头部。
 // 删除微信网页的安全策略
delete header['Content-Security-Policy'];
delete header['Content-Security-Policy-Report-Only'];

删除和scp有关的header.jpg

  1. 禁止微信浏览器缓存页面内容,同样要修改响应头的和缓存相关的内容。
 header['Expires'] = 0;
 header['Cache-Control'] = 'no-cache, no-store, must-revalidate';
Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].