#研发解决方案#分布式抓取管理平台-魔镜

郑昀 2016/3
关键词:爬虫、Crawler、分布式、竞情分析、自动分片、

本文档适用人员:研发和数据员工
提纲:
  1. 一个点解决不了,那就引入成百上千点
  2. master-slave管理模式
  3. 分布式爬虫任务的管理
  4. 小结

 
一,一个点解决不了,那就引入成百上千点
我们需要竞对在各个城市的各种经营数据,比如竞对门店的地址电话,用户活跃度,门店星级,商品数,折扣领取次数等,这数据通常在网页上,甚至有些数据只有破解手机客户端的通讯才能拿到,我在《移动客户端数据抓取·外部工具篇》和《移动客户端数据抓取·代码注入篇》里描述过(注1:如附录A和B所示)。
为了避免被竞对的Rate Limitor屏蔽,我们提出将抓取客户端分散在各地,它们到(云端的)中心节点注册,领取抓取任务,下载抓取脚本,上报抓取日志,中心节点可以对这些客户端调度和管理,即常见的 master/slave 模式。
感谢佰清、川川、中周等对魔镜项目的贡献。
 
二,master/slave管理模式
当时我们认为,唯有做到如下特性,这个魔镜系统才是一个能自动运行、最小人工干预的分布式抓取系统,才能被其他人所接手维护:
  • 集群中可以并发有多个抓取任务,都是不同需求方提出的;
    • 任务可以自动分片,比如按城市分片,按页面分片等;
  • 集群中,负责抓取网页和解析网页的节点是自动发现的;
  • 集群可以调度作业,一个节点挂了可以将任务漂移给其他节点执行,任务不会丢失;
  • 任务可以暂停,还可以重新抓取;
  • 各个节点上的日志能上报收集,并在控制台统一展示;
 
三,分布式爬虫任务的管理
3.1.任务-子任务
首先,我们定义抓取任务的层级关系为:
任务->子任务。
 
任务依据什么自动拆解出子任务呢?
目前是城市。
 
第一步,我创建任务,从下拉列表中指定抓取脚本,指定抓取城市,如下图所示:
(图1 创建任务)
目前已经有6个抓取脚本:
 
 
(图2 抓取脚本下拉列表)
你也可以自己上传脚本,如下图所示:
(图3 自行上传抓取脚本)
 
3.2.slave清单
在前面提到的任务创建页面上,城市数按切片数平摊,就能衍生出一大堆子任务。
客户端(Slave)启动之后,自己注册到 Master 上来领取这些子任务。
通过 Slave 列表页,我们可以看到当前有多少个客户端注册上来了:
 
(图4 Slave列表)
 
3.3.任务运行
点击任务管理->任务列表,可以看到当前有多少个抓取任务:
(图5 任务列表页)
 
任务的操作项有:
  • 查看(任务详情)
  • 编辑
  • 查看子任务
  • 日志
  • 删除
  • 暂停
 
点击查看子任务的操作项,我们进入子任务详情页,从下图可以看到有多少个机器领取并执行抓取任务:
(图6 子任务列表页)
 
子任务的操作项有:
  • 重新抓取:也就是再次发布这个子任务,由节点认领并执行。因为有可能这个子任务的执行状态是(因为网络问题,或对方站点屏蔽而)执行失败,我们需要让它从新运行。
  • 日志
 
我们做管理后台,一般都要求能直接在控制台里看日志,这样能快速排查问题。下面我们看一下任务以及子任务的日志:
 
(图7 任务的日志页)
 
四,小结
过去几年里,我要求我们开发交付的系统必须是商用系统,它至少要做到:
  • 自成体系,自证靠谱;
  • 可视化的控制台;
  • 监控报警完善;
  • 随时可以交出去;
我们正在升级改造的魔镜、魔盒、CloudEngine、Summoner、Janus、数屏等组件服务都应该向这个方向靠拢,开发者要以此为指导思想要求自己。
 
-EOF-
以前写的研发解决方案:
 
附录A:
移动客户端数据抓取·外部工具篇
2016-03-27 郑昀 老兵笔记
一,如何抓取App(iOS/Android)与服务器端的数据包(若已加密,请解密)
  1. 让App运行在手机上:
    1. 办法一:
      1. 手机正常连接WiFi,设置(手机上的)HTTP代理为(你的)个人电脑上的Fiddler2(电脑的IP,以及Fiddler的默认端口8888)
      2. 通过Fiddler2可以抓到HTTP/HTTPS的数据包
      3. 通过WireShark可以抓到HTTP/HTTPS/TCP的数据包
    1. 办法二:
      1. 个人电脑上通过Connectify Hotspot或者猎豹免费WiFi软件创建一个热点
      2. 手机连接这个热点
      3. 通过WireShark可以抓到HTTP/HTTPS/TCP的数据包
  1. 让App运行在个人电脑上的BlueStacks模拟器里:
    1. 办法三:
    • 通过WireShark可以抓到HTTP/HTTPS/TCP的数据包
 
所需软件清单:
BlueStacks模拟器:http://www.bluestacks.cn/
Fiddle2:http://www.telerik.com/fiddler
WireShark:https://www.wireshark.org/download.html
 
 
二,如果App(iOS/Android)与服务器端的通讯是SSL加密,如何破?
解题思路是:
  1. 旁路侦听,是无法对SSL会话解密的(毕竟不是人人都能做GFW);
  2. 只有中间人(代理服务器角色)才能偷梁换柱,成功解密,拿到响应原文;
  • 参考http://blog.csdn.net/yzzst/article/details/46739581
 
其中一种解题方法是:
利用Fiddler2:
注意:如上面方法一所述,Fiddler作为HTTP代理,只能捕获HTTP/HTTPS的包;如果App与远端通过HTTPS协商之后,选择开启一个TCP端口做加密传输,那么Fiddler就无济于事了。
  1. 手机设置HTTP代理,走同一AP下的电脑桌面上的 Fiddler(或MAC 上的Charles)代理联网;
  2. Fiddler Option需要对HTTPS做特殊设置,参考下面文献1;
  3. 手机需要信任从Fiddler 导出来的根证书;
  4. 手机上启动App,做点击操作,查看截获到的HTTPS内容解密原文;
参考文献:
1,2014,CSDN,Fiddler抓取Android真机上的HTTPS包
2,2015,CSDN,聊聊HTTPS与Android安全(二)
3,2015,github,猫哥网络编程系列:HTTP PEM 万能调试法
4,2013,Android利用Fiddler进行网络数据抓包
 
三,如果App通过HTTP/HTTPS协商后与远端建立TCP通道加密传输,如何破?
WireShark可以抓到这些TCP包,但是由于WireShark是旁路侦听,所以它不能像Fiddler一样偷梁换柱。
 
如果说服务器端是咱们自己的应用程序,那么老版本的WireShark允许配置RSA Keys来解密:
 
新版本的WireShark允许使用Pre-Master-Key,在某些场景下可以直接解密:
 
但显然也没那么容易。
 
-待续-
 
附录B:
移动客户端数据抓取·代码注入篇
2016-03-27 郑昀 老兵笔记
听了老陈的讲座后,我大致总结一下:
 
网络抓包分析,WireShark是最强工具,Fiddler2是最易用工具(但只针对HTTP/HTTPS)。譬如说,
  1. 某团App是明文HTTP包,所以Crawler+Json串分析即可;
  2. 某评App走的HTTP,但做了序列化,Response Body里是二进制,只能用它自己的方法反序列化拿到原文。
  3. 某宝App走SSL,只能用它自己的方法拿到原文了。
 
所以最终的思路还是代码注入。
第一步,务必能看懂 Smali 语言(比汇编语言高级那么一点点)。能看懂,才能根据蛛丝马迹找到要注入的函数入口。
 
 
用JEB工具能看APK的Smali和Java代码,可操作性也很好,适合快速定位关键代码。
 
第二步,用Apkdb将目标dex文件反编译为smali文件,然后增加写日志的类,在关键smali代码处增加日志输出;用Apkdb将smali文件夹“回编译”为dex文件。
 
第三步,把新dex加入apk文件里(就是一个压缩包)。
 
第四步,用apkdb对apk文件签名。或者用“幸运破解器”禁掉Android签名验证:
 
 
第五步,将apk文件覆盖源文件。在模拟器里运行该应用。查看磁盘日志,分析行为。
 
小结:
Android代码注入,获取特定场景下的远端响应原文,这是一个需要耐心和细心的工作,要花大量时间反复调试。
 
-EOF-

不妨订阅我的微信订阅号『老兵笔记』:

posted @ 2017-03-04 22:12  旁观者  阅读(1759)  评论(1编辑  收藏  举报