一、爬虫与反爬虫
? ? 1. 爬虫:使用任何技术手段,批量获取网站信息的一种方式。关键在于批量。 ? ? 2. 反爬虫:使用任何技术手段,阻止别人批量获取自己网站信息的一种方式。关键也在于批 量。 ? ? 3. 误伤:在反爬虫的过程中,错误的将普通用户识别为爬虫。误伤率高的反爬虫策略,效果 再好也不能用。 ? ? 4. 拦截:成功地阻止爬虫访问。这里会有拦截率的概念。通常来说,拦截率越高的反爬虫策 略,误伤的可能性就越高。因此需要做个权衡。 ? ? 5. 资源:机器成本与人力成本的总和。
二、爬虫的攻与防
攻:Day 1 小莫想要某站上所有的电影,写了标准的爬虫(基于HttpClient 库),不断地遍历某 站的电影列表页面,根据Html 分析电影名字存进自己的数据库。 守:Day 1 这个站点的运维小黎发现某个时间段请求量陡增, 分析日志发现都是 IP(xxx.xxx.xxx.xxx) 这个用户,并且user-agent 还是Python-urllib/3.6 ,基于这两点判断非人类 后直接在服务器上封杀。 攻:Day 2 小莫电影只爬了一半,于是也针对性的变换了下策略:1. user-agent 模仿百度 ("Baiduspider..."),2IP 每爬半个小时就换一个IP 代理。 守:Day 2 小黎也发现了对应的变化,于是在服务器上设置了一个频率限制,每分钟超过120 次请求的再屏蔽IP。同时考虑到百度家的爬虫有可能会被误伤,想想市场部门每月几十万的投 放,于是写了个脚本,通过hostname 检查下这个ip 是不是真的百度家的,对这些ip 设置一个白 名单。 攻:Day 3 小莫发现了新的限制后,想着我也不急着要这些数据,留给服务器慢慢爬吧,于是 修改了代码,随机1-3 秒爬一次,爬10 次休息10 秒,每天只在8-12,18-20 点爬,隔几天还休 息一下。 守:Day 3 小黎看着新的日志头都大了,再设定规则不小心会误伤真实用户,于是准备换了一 个思路,当3 个小时的总请求超过50 次的时候弹出一个验证码弹框,没有准确正确输入的话就
把IP 记录进黑名单。 攻:Day 4 小莫看到验证码有些傻脸了,不过也不是没有办法,先去学习了图像识别(关键词 PIL,tesseract),再对验证码进行了二值化,分词,模式训练之后,总之最后识别了小黎的验证码 (关于验证码,验证码的识别,验证码的反识别也是一个恢弘壮丽的斗争史...),之后爬虫又跑了 起来。 守:Day 4 小黎是个不折不挠的好同学,看到验证码被攻破后,和开发同学商量了变化下开发 模式,数据并不再直接渲染,而是由前端同学异步获取,并且通过JavaScript 的加密库生成动态 的token,同时加密库再进行混淆(比较重要的步骤的确有网站这样做,参见淘宝和微博的登陆 流程)。 攻:Day 5 Day 5 混淆过的加密库就没有办法了么?当然不是,可以慢慢调试,找到加密原理, 不过小莫不准备用这么耗时耗力的方法,他放弃了基于HttpClient 的爬虫,选择了内置浏览器引 擎的爬虫(关键词:PhantomJS,Selenium),在浏览器引擎运行页面,直接获取了正确的结果,又 一次拿到了对方的数据。 守:Day 5 小黎:.....
三、常见的反爬与反反爬
守: 通过User-Agent 来控制访问: ? ? ? 从用户请求的Headers 反爬虫是最常见的反爬虫策略。由于正常用户访问网站时是通过浏 览器访问的,所以目标网站通常会在收到请求时校验Headers 中的User-Agent 字段,如果 不是携带正常的User-Agent 信息的请求便无法通过请求。
(笔记)User Agent 中文名为用户代理,简称UA,它是一个特殊字符串头,使得服务器能够识 别客户使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、 浏览器插件等。 破:应对措施:如果遇到了这类反爬虫机制,可以直接在自己写的爬虫中添加Headers,将 浏览器的User-Agent 复制到爬虫的Headers 中
守: 基于行为检测(限制IP) ? ? ? 还有一些网站会通过用户的行为来检测网站的访问者是否是爬虫,例如同一IP 短时间内多 次访问同一页面,或者同一账户短时间内多次进行相同操作。大多数网站都是前一种情况, 对于这种情况有两种策略: 破:应对措施: ? ? ? 1. 可以专门写一个在网上抓取可用代理ip 的脚本,然后将抓取到的代理ip 维护到代理 池中供爬虫使用,当然,实际上抓取的ip 不论是免费的还是付费的,通常的使用效果 都极为一般,如果需要抓取高价值数据的话也可以考虑购买宽带adsl 拨号的VPS,如 果ip 被目标网站被封掉,重新拨号即可。 ? ? ? 2. 降低请求频率。例如每个一个时间段请求一次或者请求若干次之后sleep 一段时间。由 于网站获取到的ip 是一个区域网的ip,该ip 被区域内的所有人共享,因此这个间隔 时间并不需要特别长, 对于第二种情况,可以在每次请求后随机间隔几秒再进行下一 次请求。对于有逻辑漏洞的网站,可以通过请求几次,退出登录,重新登录,继续请 求来绕过同一账号短时间内不能多次进行相同请求的限制,如果能有多个账户,切换 使用,效果更佳。
守: 通过账号权限反爬(ookie 限制) ? ? ? 部分网站需要登录才能继续操作,这部分网站虽然并不是为了反爬虫才要求登录操作,但 确实起到了反爬虫,的作用, 可是网页上有一部分内容如: 新浪微博是需要用户登录才能查
看更多内容。限制每个每天下载300 张. 破:应对措施: ? ? ? 因此可以通过注册账号,访问时带cookie, 模拟登录的方法进行规避。
守: 验证码限制 ? ? ? 这是一个相当古老但却不失有效性的反爬虫策略。更早的时候,这种验证码可以通过OCR 技术进行简单的图像识别破解,但是现在来说,验证码的干扰线,噪点已经多到肉眼都无 法轻易识别的地步。所以目前而言,由于OCR 技术发展不力,验证码技术反而成为了许多 网站最有效的手段之一。 破:应对措施: ? ? ? 1. 神经网络训练NLP(图像识别) ? ? ? 2. 人工识别 ? ? ? 3. 打码平台 ? ? ? 4. 第三方OCR 库
守: 动态页面的反爬虫(通过变换网页结构反爬) ? ? ? ?一些社交网站常常会更换网页结构,而爬虫大部分情况下都需要通过网页结构来解析需要 的数据,所以这种做法也能起到反爬虫的作用。在网页结构变换后,爬虫往往无法在原本 的网页位置找到原本需要的内容. 破:应对措施: ? ? ? 1. 只爬取一次时,在其网站结构调整之前,将需要的数据全部爬取下来;使用脚本对网 站结构进行监测,结构变化时,发出告警并及时停止爬虫。 ? ? ? 2. 逆向分析,抓包 ? ? ? 3. selenium 库
|