爬虫与反爬虫
爬虫与反爬虫是个在软件开发行业里一直存在的斗争。爬虫,一般常见的有窃取同行数据、分析行业数据、恶意攻击等,最终都是以牟利为目的。为了防止爬虫,就诞生了反爬虫技术,通过识别非法操作与正常操作来做到拦截爬虫请求。
下面就来分析一下这些常见的爬虫与反爬虫都有哪些手段。
爬虫
API
一般情况下,爬虫都是直接调用网站内请求数据的接口,这是成本最低的方式。通过分析接口请求规则,组装成 HTTP 请求,模拟正常用户操作。
常见的 API 有数据型
和操作型
-
例如通过某之家的接口 https://car.m.autohome.com.cn/ashx/car/GetModelConfigNew3.ashx?seriesId=18 ,通过接口可以获取到市场上车型参数的数据。
-
而某东的登陆接口 https://passport.jd.com/uc/loginService ,操作后保存 session,便可以在后面操作其他电商接口。
通过这些接口的使用,就出现了数据分析工具,黄牛抢购,轰炸机脚本。
模拟浏览器
在一些网站对接口升级防护后,可能原有的方式就失效了,这个时候再尝试分析请求接口就可能徒劳无功。但是,通过模拟正常用户操作的话,那不是又能够越过防护了,这时模拟浏览器手段的爬虫开始流行起来。
这类爬虫手段可以做到像手工操作一样模拟,登陆、验证码、获取网页元素,为了提高效率还可以设置禁止加载图片和 css。
常用的工具有 Python
的
selenium 和
pyppeteer,两者都可以很方便的操作网页元素,前者是市面上相对成熟的爬虫工具,
代理池
上述的爬虫方式都是直接通过本机请求的,如果网站对来访的请求有流量控制策略,那么当请求过于频繁时,将可能被限制访问。
这时可以通过 匿名代理
的手段来隐藏真实 ip,通常是使用 ip 代理池来实现,这个代理池可以是自身维护的也可以是第三方的付费服务,每次请求都从这个 ip 代理池中获取 ip 代理操作,这样网站收集到的请求地址就是代理的 ip。
反爬虫
Header 拦截
在网站的目标访问用户可预知的情况下,可以设置一些 Header、User-Agent、Cookie 来简单拦截非法请求。
但是这种手段十分容易被攻破,只需通过抓取正常请求信息进行解析,再对爬虫请求配置请求头就可以模拟正常用户操作。
验证码
为了防止爬虫的大量请求影响网站可用性,通常会对一些关键接口增加验证码校验,比如字符验证码、问答验证码、滑动验证码、图形验证码。
有些网站只是在接口外增加了验证码的保护,但爬虫不是像正常用户访问浏览器来请求的,而是绕过了验证码直接请求业务接口,所以需要将验证码与接口绑定在一起使用。
数据加密
现在的网站为了防止爬虫,还会对页面数据进行混淆,直接返回 html 代码或使用 css 渲染数据,增加爬虫的成本。
有的网站还会对一些关键接口的进行数据加密或者通信协议加密,需要动态跟踪加密过程来破解。这样使得爬虫分析接口变得几乎不可能,但是却避免不了通过模拟浏览器的操作。
频次拦截
在对爬虫敏感的网站,会对请求数据进行收集分析,通过识别爬虫行为来拦截请求,通常使用 滑动窗口
对归类的请求进行统计。
ip 代理技术就是为了防止请求被拦截的匿名手段。
总结
通常情况下,为了做到高效的反爬虫,会将各个反爬虫手段结合使用,有些还会反向分析爬虫工具针对性拦截。
然而,再完善的防御,还是会有被突破的可能,这一切都是成本的博弈。只有当爬虫行为的 ROI 远远低于预期时,那么反爬虫就是成功的。
这是我的某宝下单脚本,由于该网站对交易请求做了加密,还在 selenium 做了很大功夫的防爬虫,于是便使用了能应对现有防御的 pyppeteer https://github.com/moyada/auto-order 。