wechat articles crawler
1.0.0
录制的视频:点击前往
查看历史消息
的功能,点击去打开这个网页,不停下滚,可以查到全部发布文章。在这一步,基于anyproxy,修改了这个网页html,注入一段让页面不停往下滚动的js脚本,当滚到底部,就获取了全部文章列表。 本质上是中间人攻击。如图所示:
获取文章列表演示:
一篇一篇打开文章链接:
第一步,一定要安装成功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。但是没有阅读数和点赞数,这需要打开具体的文章链接,才能看得到。
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);
原理很简单,基于真机的爬虫,中间人攻击,注入javascript脚本,让浏览器模拟人的操作过程。
// 删除微信网页的安全策略
delete header['Content-Security-Policy'];
delete header['Content-Security-Policy-Report-Only'];
header['Expires'] = 0;
header['Cache-Control'] = 'no-cache, no-store, must-revalidate';