网络爬虫,解放你被电脑禁锢的双手

提起网络爬虫,首先会想到的是搜索引擎每天自动在互联网世界中到处游弋,抓取最新的网络资源,供网民们消费。这种复杂的系统可能理解起来有点费劲。
随着信息化深入生产生活的方方面面,给人们带来效率便捷的同时,也有种被机器左右的感觉。但这不是机器的原因,而是系统的设计者太依赖于机器,过犹不及了。也有另外一种解释,机器还不够智能。因此,就有一些原来手工的工作被搬到了电脑上,每天或者隔断时间需要去电脑上点一点,或者看看数据,或者导出些资料。刚开始大家都很有新鲜感,但是过后人们又觉得每天干得都是重复的工作,能不能让机器代替来做,自己可以做更有意义的事。这种情况下,爬虫可以登场了,它所做的工作就是模拟人操作一个系统。 网络爬虫,解放你被电脑禁锢的双手
很典型的,有如下场景:登陆某个管理系统,打开某个菜单,输入查询条件,查询结果,导出结果,导入另外的系统中。
我们如何来实现呢?要解决如下几个问题:

  1. 登录功能有图片验证码,短信验证码等,如何识别
  2. 系统如果没有不操作,隔段时间得重新登录,如何避免反复登录
  3. 如何规避系统的反爬虫检测
  4. 如果系统异常了,能否正常抓取
  5. 如何爬取业务内容
    **针对问题1,**我们有如下对策,如果登录条件只有用户名/密码,那么我们只要用HttpClient调用登录接口即可。但是现在安全策略越来越高,人们加了各种验证码。针对图片验证码,我们可以采用Tesseract来识别单行的字母或数字或文字。但是需要训练它以提高识别的准确率。如果暂时不想接入AI的领域,它自带的智商可以识别70%左右的图片验证码,可以反复识别,直到识别成功。针对短信验证码,需要用户辅助操作。在验证码发出后,往往有几分钟的有效性,可以在这期间人工采集到短信验证码,以获取系统准入。类似于12306的那种图片,已经超出了机器目前的智商,我们还是知难而退吧。下回可以写写图像识别的事。
    网络爬虫,解放你被电脑禁锢的双手
    **针对问题2,**在获取到用户的有效用户名/密码/验证码后,一般来说我们就具备登录系统的能力了。接下来我们需要做一件很重要的事。如果是人操作系统,登录成功后,系统会给用户返回登录凭证:cookie,其中包括域,路径,有效期,名称,以及其他一些属性信息比如sessionId等。为了避免反复登录,我们需要将cookie保存下来,可以将其序列化到redis中,用的时候再反序列化回来。并且模仿人操作,每隔几分钟去请求某一个系统内的功能,让系统认为你一直在操作系统,这样session就一直不会失效了。也就不用反复登录了。
    **针对问题3,**有的系统为了防止爬虫,制定了各种不人道的规则,比如短时间内尝试多次登陆,多次获取验证码,限制客户端类型user-agent,限制header中必需带某种指定参数等。这些得具体情况具体应对了,没有统一的方案。
    **针对问题4,**如果赶上系统升级了,但是很快系统就起来了,那么可以保持session的有效性。但是如果后台存储了用户的session,并手工清理的session,那我们就只能乖乖的重新登陆系统了。所以爬虫有很多不确定性,只能部分解放人们的双手。
    针对问题5,登陆系统后,cookie也保存下来了,要获取某些业务数据,其实就是请求某个具体的接口,但是要带上cookie,只要从redis中反序列回来即可。
    至此,爬虫已经可以自动帮你干活了,一个激灵,工作自己干完了!