共计 2559 个字符,预计需要花费 7 分钟才能阅读完成。
极简爬虫攻防战纪要
爬虫是构建搜索引擎的基础, 负责抓取网页信息并对网页识别、分类及过滤。我们熟识的电商、搜索、新闻及各大门户网站都有强大的爬虫集群在每天高负荷运转: 京东 v.s. 淘宝 v.s. 拼多多相互之间 "友好地" 价格监控, 头条 v.s. 网易 v.s. 腾讯相互之间 "和谐地" 新闻消息聚合借鉴, Google / 百度 / 搜狗纷纷尽职地做网页信息的搜索优化以及各大研究机构卖力地进行数据集构建。<br /> 然而, 各大网站是不太会对非搜索引擎的爬虫网开一面、任其予取予求的,毕竟无论什么时候,内容的价值都是显而易见的,所以就有了下面的爬虫方与反爬方的混战大戏~<br /> 各个巨头之间的爬虫与反爬虫的攻防战斗没有一刻放松, 反爬网站要想制定反爬策略, 就要根据爬虫的特性针对性选择方案, 那么爬虫有什么特点? 脚本 + 自动化。因此反爬方的毁灭性大招无非两个:
- 非脚本访问 => 浏览器真实性检测
- 非自动化访问 => 访问用户真实性检测
惨烈的战斗即将打响! 非战斗人员迅速撤离!
Round One: Are you Really a Browser?
浏览器由于其运行环境及运行原理, 会自带一些特有的属性: 存在 Headers 用于协议 negotiation、可执行 JavaScript 代码片段。那么反爬方的第一个堡垒就基于浏览器的真实性检测开始构建。<br /> 战役伊始, 反爬虫方率先祭出 User-Agent, Content-Type, Application/*,iAccept-Encoding, Accept-Language, X-Forwarded-For, Referer 等 headers 电网, 第一批与正常浏览器 headers 不同的爬虫纷纷触发, 瞬间毙命。然而, 爬虫方也不是吃素的! 他们用了一招漂亮的瞒天过海, 迅速通过伪造 headers 的方式突破防线! <br /> 反爬方丝毫不慌, 在 html 中添加了一段 JavaScript 脚本地雷, 己方浏览器由于提前知道了地雷的位置,可以安全绕过, 不会影响正常的网页显示, 爬虫方却不明就里, 纷纷中招, 非死即伤,直到大杀器 Node.js 出现,可以直接执行 JavaScript,爬虫方终于奋起反击,再下一城!![image.png](https://intranetproxy.alipay.com/skylark/lark/0/2019/png/88875/1565271756288-b128de6c-0efa-42bb-9b56-8fdc09caaf77.png#align=left&display=inline&height=178&name=image.png&originHeight=178&originWidth=984&size=194086&status=done&width=984)<br /> 反爬方一计不成又生一计, 采用了迷宫式防御 — 单页应用 — 的方式重铸了堡垒,爬虫方费尽了心机却由于单页应用巧妙的构筑方式而解析不到任何数据,一时间被绕得晕头转向,束手无策,单页应用统治了战场!反爬方开始了单方面的屠杀,爬虫方的士气一蹶不振…...** 千军坐镇,百将舍身,十年磨剑,一鸣惊人!** 终于,这场战役的终结者出现了,他就是,Headless Chrome 技术!新技术一出现,爬虫方的武器库焕然一新:Selenium,Puppeteer, PhantomJS, CasperJS 等重装攻城杀器不断建功,反爬方一溃千里。爬虫方终于锁定了第一场战役的胜局!
Round Two:Are you Really a Human?
由于断崖式技术 Headless Chrome 的出现,反爬方在浏览器识别战役上望风披靡。然而胜败乃兵家常事,东方不亮西方亮。在数据保卫战生死存亡的关头, 反爬方偶然发现了一个现象,浏览器虽然很难识别,但是人性是贪婪的!人类能做到很多脚本做不到的事!甚至人类的行为也是有固定的规律的!就这样,反爬方卧薪尝胆了许久,终于再次踏上了战场!这一役的制高点,是一个灵魂兼哲学的双层拷问:** 你到底是不是人?!**<br /> 第一层防线直指爬虫方的要害 — 贪欲(访问频率)!每秒钟请求 10 次这种高频访问,怎么可能发生在一个人类的身上,斩!爬虫方不得不大幅降低了攻击频率,反爬方终于缓了一口气。<br /> 第二层防线指向爬虫方的痛处 — 懒惰(固定 IP)!最近的几百次请求,都是同一个 IP 发出来的,世间哪有这么无聊的人?斩!爬虫方为此不得不付出巨大的代价来购买代理 ip,即使是这样,反爬方依然可以通过封禁公网 IP 的方式来紧掉大量的代理地址。经过反爬方的精心运作,逐渐有效削弱了敌方的攻势。<br /> 战役再次升级,反爬方请出了大国重器:验证码!大国重器上线不久即大获成功,爬虫方立刻损失惨重,仿佛一夜之间,所有的攻城器械都告无效,攻坚战陷入了僵局……直到爬虫方积年的技术积累取得的 OCR 重剑技术破土而出,才逐渐扭转颓势,但是依然不能压制攻下的城池内地下党的反扑, 尤其是爬虫方主力 Google 的反水技术:<br />![image.png](https://intranetproxy.alipay.com/skylark/lark/0/2019/png/88875/1565271766680-40f3be34-fcb7-4122-b998-bbc725706240.png#align=left&display=inline&height=110&name=image.png&originHeight=110&originWidth=424&size=14653&status=done&width=424)<br /> 甫一投战,反爬方立即大获全胜!<br /> 最后,反爬方乘胜追击,祭出了终极防御:模式识别。爬虫毕竟不是人类,在请求的时候只能机械地设置目标资源的请求 id 和请求参数,这就导致请求参数和请求顺序必定是一致的。利用这一规律,反爬方通过设置阈值的方式对请求进行统计和识别,终于彻底杜绝了爬虫伪装成人类的进攻!第二场战役,反爬方胜利!
两场战役下来, 双方互有胜负, 激烈的战斗仍在继续。恭祝双方战出友谊, 战出激情!
— 一个曾经亲历过爬虫与反爬虫之战的老兵为您现场报导, 感谢您的收看, 再见!
正文完
发表至: javascript
2019-08-21