公告:

IP84爬虫:
看吧,丝毫不留情面,我们的爬虫已经没法工作了,不过办法总比困难多,只要你去想,所以本文稍微讲一下防ban策略。

常见反爬虫策略

    知己知彼,百战不殆。我们想防止爬虫被 ban就得了解一些常见的反爬虫措施。但要反爬虫还得先识别爬虫,所以首先讲讲如何识别爬虫。
方法1:http日志和流量分析,如果单位时间内某个IP访问频率和流量超过特定阈值就可以界定为爬虫。
方法2:Headers参数检测
上图是浏览器正常访问站点时发送的数据包,可以看到Request Headers里面有一堆参数,目标站点可以检测User-Agent或者Referer参数的值来判断是否为爬虫,顺便提一下Referer参数也可以防盗链。
方法3:在网页源码内放置一个对浏览器不可见的链接,正常用户使用浏览器是看不到该链接的当然也不会去点击,如果检测到该链接被点击,来访IP就会被界定为爬虫。
讲完了爬虫识别方法,下面开始讲反爬虫策略
1.临时或永久封禁来访ip
2.返回验证码
3.异步加载(ajax)
4.爬虫陷阱

常见反反爬虫策略

    针对反爬策略1可以使用高匿代理IP解决;针对反爬策略2,如果不是每次都弹验证码也可以使用高匿代理IP解决,如果感觉高匿代理不稳定或者收集起来不方便使用Tor网络(不懂Tor?动动你的手指百度吧^_^)也可以,如果每次都弹验证码那就得涉及到验证码识别了,简单的验证码可以自己写代码处理,python有不少知名的图像处理(识别)库(如PIL/Pillow、Mahotas、Pymorph、pytesser、tesseract-ocr、openCV等)和算法(比如大名鼎鼎的KNN[K邻近算法]和SVM[支持向量机]),但复杂的验证码例如涉及逻辑判断和计算、字符粘连变形、前置噪音多色干扰、多语种字符混搭的大多也只能靠接入人工打码平台来对抗了;针对反爬策略3,由于采用异步加载方式,网页内容不会一次性全部展示出来,需要将滚动条滑到最底部才能继续浏览下一页内容,此时可以使用selenium+phantomjs解决,phantomjs是一个无头无界面浏览器,使用selenium可以驱动它模拟浏览器的一切操作,但缺点也很明显,爬取效率低;针对反爬策略4,看情况而定吧,如果是比较简单的死循环陷阱,可以对爬虫将要爬取的链接进行判断,不重复爬取相同的页面,scrapy的LinkExtractor设定unique参数为True即可或者直接设定爬虫的最大循环次数。高级的陷阱笔者还没遇到,暂不讨论。此外增加爬取间隔和禁用cookie也能降低爬虫被ban的概率。
实践
    上面说了那么多,实践才是硬道理,以突破IP84反爬策略为例,主要代码参考Scrapy学习笔记(5)-CrawlSpider+sqlalchemy实战,下面只贴出需要修改部分的代码。
  1. 在settings.py同级目录下新建文件useragent.py

时间:8年前 (2017/09/29) / 阅读:959 / 评论:0

反爬虫与反反爬虫策略