2022爬虫与反爬虫实战经历

自从爬虫诞生以来,爬虫与反爬虫的对抗就在不断发生着。通过以下的实战经验为大家提供一个学习思路。

爬虫部署

小张想拿下某个站上全部的电影,于是就写了一个基于HttpClient库的爬虫,它可以爬遍这个站上所有罗列电影的页面,然后依据Html来分析电影名,就可以为小张存入数据库里。

不过呢,他爬的这个站点的运维小李马上察觉到了问题,就是在一个时间段里有看起来很异常的请求量值,经过对日志的分析,就看到了用户IP(1.1.1.1),更奇怪的是他的useragent还是JavaClient1.6。这些已经能够充分证明不是人类在请求了,那就不得不在Nginx服务器上封杀它了。

反爬虫反击

小张发现了自己用爬虫被封杀这件事,想了一下就换一个方法,一个是useragent伪装成百度Baiduspider,还有一个是不停的换ip,每间隔半小时就换一个。

但是即使是这样,也躲不过小李,小李还是发现了他的方法。

也只能下对策,这次他在Nginx设置了频率限制,一分钟内请求大于120次就会被屏蔽IP。又担心影响到百度的爬虫,为市场部每月几十万的投放考虑,就再写了个脚本,这次是通过hostname来检验ip的真实性,以此形成白名单。

反爬虫验证码

小张又察觉到了新的针对,不过由于小张也不急用数据,就拉长了时间线,随机的在1-3秒就爬一次,爬10次再对应休息10秒,而且在固定的8点到12点以及18点到20点爬,甚至几天之间还会休息。

这下小李看到日志觉得很麻烦了,但又觉得还改规则的话太容易误伤人类用户,又想出对策。三个小时之内,请求总量达到50次那就会弹出一个验证码,除非完全精确的输入了,否则就会被拉入黑名单了。

爬虫训练以及优化

小张终于因为这些验证码困惑了,但还有打磨空间。他第一时间选择了学图像识别(关键词PIL,tesseract),然后二值化这些验证码,然后分词,经过模式训练。识别了小李的验证码,爬虫又可以继续工作了。

但是小李也不愿屈服,也不管验证码被攻陷,去和开发商量了改变开发模式,不再直接渲染数据,改为让前端异步获取,而且通过js的加密库来生成动态的token,其间加密库再进行混沌(取决于是不是重要步骤)

爬虫获胜

但是加密库一旦被混淆就没法再想了嘛?不可能的,只要有耐心,经过调试,总能找到加密原理,这些都不是重点,重点是付出太多精力,小张不打算再用HttpClient的爬虫了,改成使用内置浏览器引擎的爬虫(关键词:PhantomJS,Selenium),最终在浏览器的引擎中js加密脚本得出了正确的结果,也便到手了数据。

虽然本次爬虫与反爬虫的实战对抗结束了,但这不是爬虫与反爬虫的搏斗的结束。