一次成功的爬虫畅想

大家都知道,互联网是一个信息互联的世界,人们获取信息很方便快捷。由于这个特性,给人们的工作和生活带来了巨大的变化。

故互联网最重要的是“信息”,所以绝大多数的互联网公司都是在信息的交换和处理上下功夫,Google/Baidu把信息进行检索,能更快捷获取到人们想要得到的信息;FB/腾讯微信把信息通信做到极致简单,无论在天涯海角都若比邻;淘宝能在家里就获取到商品信息,消除了物理距离购物的限制。

还有些公司是直接获取公共信息上赚钱,比如天眼查,企查查,小白兔等,这类公司的商业逻辑就是获取(多数是爬虫)到公共信息(企业工商信息/商标信息/专利信息/法律官司信息),通过APP或者web的方式体现,使人们查询自己想要的信息更加方便。

随着爬虫的流行,大部分公司的网站开始了信息安全的重视,于是一场爬虫与反爬虫的斗争开始拉开序幕。“你有张良计,我有过墙梯”,一方面,一些政府机构/企业花重金开始打造一个不被爬虫机器人爬取的网站,另一方面,对于技术孜孜不倦的程序员又不甘示弱,把找到对方的破绽最为最大的成就。

我最近在工作中需要爬取一些信息(当然是公共信息,不涉及到违法),爬取成功有些小收获,在此总结一下:

面对的问题和困难:1.web上有部分信息,手机app上有全部信息。在web上的信息通过chrome或者firefox有专门的调试工具,很快的就能分析出API接口,但手机上复杂一些,需要设置代理,通过专门工具进行抓包分析(我用的mac找到一个非常好用的抓包软件charles)。

2.调用的API接口,有一个参数进行了加密,如果传入的参数不对,后台校验不过就会返回“在月球上”的错误(如果这个问题解决不了,就无法完成整网的爬取)。根据分析,加密函数既然是在终端上加密的,那一定会保存在终端里面。APP是没法查看源文件了,但浏览器一定是能找到这个加密函数的(应该是保存在某个js代码里面),但是这个网站的js是经过一些处理的,可读性不高,只有通过打断点分析最有可能出现的js加密代码块是在哪个位置。功夫不负有心人,在如下代码中找到加密的算法,“q”就是调用api的其中一个参数。是对当前时间戳+“9527”+时间戳的前六位数的字符串生成的一个MD5字符串.

var p = Date.now().toString()

  , q = md5(p + "9527" + p.substr(0, 6));

成功破解了此参数,就相当于爬虫功能成功了一半。

3.为什么破解了参数只能说成功了一半呢,因为这个网站的web端的api接口和app端的api接口以及加密算法不是一样的;而web端只能获取到部分信息,对于最关键的信息,在web端没有看到接口。有时爬取是靠一些运气成分的,我把app端的api接口名称拷贝到web端上,构造相应的参数,加密参数使用web端的,居然成功了(说明后台程序有此接口,而且web接口名称和app的接口名称是一样的)。如果web端的此api接口没有找到,那就只有半自动化来实现了。

解决了以上难题,很快就把代码写出来再调试,设置时间延迟,花了一天的功夫,此网站的所有信息都爬取出来,存储在MongoDB中。

在此,有种KO对手的成就感油然而生,此文没有粘贴api信息和代码信息(需要保证别人的隐私),可能会给大家读此文会造成理解上的困难。回过头来看,其实爬取成功并不是自己很厉害,如果对方再加上一点点防御手段(比如web的api接口名称和app的api接口名称不做成一样的),想成功自动化爬取信息就非常困难了。

所以回过头来看,爬虫与反爬虫就是矛和盾的关系。如果不做成一个爬虫高手,如何可能做成一个安全专家??

爬虫的知识还有很多,还有很多挑战(比如商标局的信息)。我后面还会不定期输出爬虫知识。对于此文有更细节想要了解的朋友,可以加我微信交流:liuhaibo102685

你可能感兴趣的:(一次成功的爬虫畅想)