前言
反爬虫,是指对扫描器中的网络爬虫环节进行反制,通过一些反制策略来阻碍或干扰爬虫的正常爬行,从而间接地起到防御目的。下面是一些常见的反爬虫策略的收录。
入门版
封IP
由于服务器有防火墙(如果防火墙在TCP/UDP层或者它们以下的层做限制是无法绕过的,必须调整真实的物理IP)或者站点程序有相关限流设置,单位时间内请求过多时,会禁止可疑IP的访问。
爬虫对抗方案:
使用sleep等待随机时间,但是这种方式会拉长爬虫周期
建立IP代理池机制,通过大量代理IP去访问,但是可能校对【账户-UA-IP】等信息,有可能触发session失效被要求重新登录
封User-Agent
User-Agent的角色就是客户端的身份标识。很多的爬虫请求头就是默认的一些很明显的爬虫头python-requests/2.18.4,诸如此类,当发现携带有这类headers的数据包,直接拒绝访问。
爬虫对抗方案:
设置个User-Agent列表,从列表里随机抽出一个User-Agent,封装到http请求里
强烈建议爬虫程序降低访问频率(模拟用户行为),建设站点账号列表(使爬虫任务能够打散分化),因为目标站点可能校对【账户-UA-IP】等信息,有可能触发session失效被要求重新登录
其他header参数
除了User-Agent之外,可利用的header参数还有Host和Referer。这种验证请求头信息中特定header的方式既可以有效地屏蔽一些古老的爬虫程序、网络请求。
爬虫对抗方案:
若是脚本类的爬虫程序,需要对应地修改header参数
建议使用无头浏览器(selenium+webdriver)方案
封Cookie
Cookie反爬虫指的是服务器通过校验请求头中的Cookie值来区分正常用户和爬虫程序的手段,服务器对每一个访问网页的人都会给其一个Cookie,有的扫描爬虫单纯为了爬取链接,并不会对Cookie进行处理和响应。
网站端会根据访问频率,如当某个Cookie访问超过某一个阀值时,就对其进行(临时)封禁,也可能把Cookie和JavaScript结合起来(如加签、验签)实现反爬虫
爬虫对抗方案:
建议使用无头浏览器(selenium+webdriver)方案
强烈建议爬虫程序降低访问频率(模拟用户行为),建设站点账号列表(使爬虫任务能够打散分化)
javascript渲染
由 JavaScript 改变 HTML DOM 导致页面内容发生变化的现象称为动态渲染。该方案下,由于浏览器会自动渲染 script 标签中的js代码将信息展现在浏览器当中,而一般的爬虫程序是不具备执行js代码的能力,所以无法将js事件产生的信息读取出来。
这是把双刃剑,能有效打击脚本类的爬虫程序,但是会影响搜索公司的收录(百度、必应之类)。
爬虫对抗方案:
使用无头浏览器(selenium+webdriver)方案,也就是浏览器解析JavaScript的方式,能够做到动态渲染
ajax异步传输
访问网页的时候服务器将网页框架返回给客户端,在与客户端交互的过程中通过异步ajax技术传输数据包到客户端,呈现在网页上,爬虫直接抓取的话信息为空。该方案仅能打击初阶的爬虫程序。
爬虫对抗方案:
使用无头浏览器(selenium+webdriver)方案,也就是浏览器解析JavaScript的方式
csrf防护
是常见的预防“跨站请求伪造攻击”、“钓鱼网站”的方案,该方案也能打击一般的爬虫脚本、爬虫程序。
爬虫对抗方案:
使用无头浏览器(selenium+webdriver)方案,该方案能够获取到完全渲染、完全加载后的网页信息,缺点是比爬虫脚本慢
验证码
当某一用户访问次数过多后,就自动让请求跳转到一个验证码页面,只有在输入正确的验证码之后才能继续访问网站。这种通过强化人机校验的方式,能够有很好的反爬效果。
另外,如果发生误拦,对于真实用户而言,验证交互就让人厌烦。
爬虫对抗方案:
强烈建议爬虫程序降低访问频率(模拟用户行为),建设站点账号列表(使爬虫任务能够打散分化)
实现验证码校对步骤,这就涉及到体系化的爬虫平台能力,包括:步骤编排、OCR识别、会话管理
另外,关于验证码发展,可以分为以下几个阶段:
文本验证码 -》行为验证码(滑块、顺序点击、按语义提示点击、高阶语义推理验证码) -》 新型验证码(无感验证码,综合多个参数做校验)
其对应的交互体验也是往轻松简便的方式发展,追求交互友好的同时做到有效打击
进阶版-内容视觉类混淆、内容加解密
通过网站技术保证展示层是正确的,但背后的html源码可能是无序的(例如文本错位、图片覆盖等)。这样一来,爬虫程序无法直接通过xpath获取到正确数据,需要做更多的适配、解析步骤,例如是分析ajax请求过程中的js函数、控件的CSS特征、匹配网页用到的字体等等。
图片伪装
图片伪装指的是将带有文字的图片与正常文字混合在一起,以达到“鱼目混珠”的效果。
这种混淆方式并不会影响用户阅读,但是可以让爬虫程序无法获得“所见”的文字内容。
CSS偏移
这种方法是利用 CSS 样式将乱序的文字排版为人类正常阅读顺序的行为。
如果不细心观察,爬虫工程师很容易被爬取结果糊弄。这种混淆方法和图片伪装一样,并不会影响用户阅读。
例如:
HTML 文本中的文字:我的学号是 1308205,我在北京大学读书。
浏览器显示的文字:我的学号是 1380205,我在北京大学读书。
爬虫提取到的学号是 1308205,但用户在浏览器中看到的却是 1380205。
SVG映射
SVG 是用于描述二维矢量图形的一种图形格式。它基于 XML 描述图形,对图形进行放大或缩小操作都不会影响图形质量。
由于 SVG 中的图形代表的也是一个个文字,所以在使用时必须在后端或前端将真实的文字与对应的 SVG 图形进行映射和替换。
通过用矢量图形代替具体文字,不会影响用户正常阅读,但爬虫程序却无法像读取文字那样获得 SVG 图形中的内容。
爬虫对抗方案:
当已使用目标控件做文本解析时,爬虫程序无法主动发现这类新增的对抗,需要一定的发现机制、反馈机制,如人工check、补偿程序做图像识别和内容比对
过程中可能需要生成截图,解析目标控件信息,这就涉及到体系化的爬虫平台能力,包括:步骤编排、图像识别、OCR识别、会话管理
字体加密
js混淆(js函数加密),需要做js逆向解析来破解
eval加密
这三类展开讲篇幅过长,需要的小伙伴请移步: 【点击这里】
① Python所有方向的学习路线图
,清楚各个方向要学什么东西
② 100多节Python课程视频
,涵盖必备基础、爬虫和数据分析
③ 100多个Python实战案例
,学习不再是只会理论
④ 华为出品独家Python漫画教程
,手机也能学习
⑤ 历年互联网企业Python面试真题
,复习时非常方便