github项目地址
录制的视频:点击前往
- AnyProxy是一个阿里开源的HTTP代理服务器,类似fiddler和charles,但是提供了二次开发能力,可以编写js代码改变http/https请求和响应
- 为了爬取一个微信公众号的全部文章,首先就是获取全部文章,然后一篇一篇去打开获取文章标题,作者,阅读数,点赞数(这两个只能在微信浏览器获取)
- 每个微信公众号都提供的功能,点击去打开这个网页,不停下滚,可以查到全部发布文章。在这一步,基于anyproxy,修改了这个网页html,注入一段让页面不停往下滚动的js脚本,当滚到底部,就获取了全部文章列表。 本质上是中间人攻击。
-
至此,获得了一个公众号的全部文章,包括文章标题,作者,url。但是没有阅读数和点赞数,这需要打开具体的文章链接,才能看得到。
- 我们还没获得阅读数和点赞数,接下来就是一步一步让微信浏览器不停地打开具体文章,触发微信浏览器获取阅读数和点赞数。这里使用了socket.io,让文章页面连接自定义的服务器,服务器主动通知浏览器下一个点开的文章链接,这样双向通讯,一个循环就能获取具体文章的阅读数和点赞。
阅读数和点赞可以在浏览器端,不停检查dom元素是否渲染出来然后收集发往服务器,也可以直接anyproxy检查出来(这里我采用前一种)。
- 禁止网页的Content-Security-Policy。CSP 的实质就是白名单制度,开发者明确告诉客户端,哪些外部资源可以加载和执行,等同于提供白名单。如果不禁用,注入的javascript将无法执行。这里的做法,简单粗暴的删除http响应的任何和csp有关的头部。
- 禁止微信浏览器缓存页面内容,同样要修改响应头的和缓存相关的内容。