反爬学习笔记:从傻笨粗简到奇技淫巧
2020-8-30 15:53:20 Author: mp.weixin.qq.com(查看原文) 阅读量:1 收藏

最近和反爬team接触很多,认识了许多很可爱的小伙伴,仔细观察了很久他们的工作内容,感觉为自己打开了一扇新世界的大门,特地记录一下自己的学习心得。

以前对爬虫的认知就是利用程序对一个或多个网站的页面进行浏览之后攫取所需的数据,更多的是体现了自动化的数据采集方式,摆脱人工信息收集的方式。然而,随着对抗的不断升级,万本归元,众包爬虫又重新回到了人拉肩扛的方式:由数据采集负责人创建页面抓取任务,各个实施人员认领,对目标网站的指定页面进行截图,并将截图上传至指定服务器,后端通过OCR抽取想要的数据。

所以,总结下来,目前爬虫已经不再指的是某一个具体的程序,而指的是互联网上数据的批量抓取的行为,可以是自动化的,也可以是半自动化的,还可以是纯人工。

任何事物都有两面性,爬虫也不例外,也有符合内期望的爬虫和不符合期望的爬虫。

  • 符合期望的爬虫

一个网站发布了内容之后,自然是希望能被越多的人看见越好。当内容被搜索引擎收录以后,会极大增加内容被网民检索到的可能性,所以,一些乖巧的搜索引擎爬虫自然是属于这一类的爬虫,比如Google爬虫、百度爬虫等。这些搜索引擎爬虫都有明显的特征,在HTTP HEADER的UA字段中体现搜索引擎的名字,公开使用的IP段等。

谷歌User-Agent:
谷歌UA :“Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)”
谷歌图片:“Googlebot-Image/1.0”
谷歌移动:“AdsBot-Google-Mobile (+http://www.google.com/mobile/adsbot.html) Mozilla (iPhone; U; CPU iPhone OS 3 0 like Mac OS X) AppleWebKit (KHTML, like Gecko) Mobile Safari”

微软bingUser-Agent:
微软UA:“Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)”

搜搜User-Agent:
搜索:“Sosospider+(+http://help.soso.com/webspider.htm)”
搜搜图片:“Sosoimagespider+(+http://help.soso.com/soso-image-spider.htm)”

  • 不符合期望的爬虫

一言以蔽之,凡是干扰了业务正常运行的爬虫都是不符合期望的爬虫。

1、恶意流量型爬虫。一些学生做爬虫实验、一些数据公司抓数据、一些抽风的搜索引擎爬虫等,由于并发请求控制不当,都会带来流量暴涨,服务端看到的就像是遭受了HTTP GET FLOOD一样,严重的时候会干扰正常用户的访问与使用。

2、商业竞争型爬虫。由竞争对手开发和维护,非常有针对性,用来抓取市场竞争所需要的数据,以电商网站为例,一个商品在该网站的类目、单品价格、评分和销量等运营数据都是竞争对手关心的信息,通过这些可以计算出很多经营信息,以达到知己知彼的效果,并及时调整自己的经营策略。

所以,作为一个线上运营业务的商业公司,在爬虫对抗方面需要尽可能的屏蔽「不符合期望的爬虫」带来的负面影响。

既然不符合期望的爬虫对业务存在巨大的隐患,那就是一定要防御的。当防御方面对一堆混杂着正常请求与爬虫请求的流量时,通常有两种策略:

1、爬虫识别并处置。即采用技术手段识别爬虫请求,然后根据业务目的采取处置动作;

2、Web前端防御。不区分请求类型,但对返回的关键参数做处理,达到不影响浏览器渲染但爬虫不可读的效果。

在反爬实践中,这两个策略都是同时使用,以达到反爬效果最大化。

3.1 策略1:爬虫识别并处置

这个策略包含了两个动作,分别是识别与处置。我们分开讨论。

3.1.1 爬虫识别

基于个人观察和资料收集整理,发现爬虫识别有如下4种常用方法。

1、 基于HTTP HEADER特征的爬虫识别

简单的爬虫程序在HTTP HEADER中会带有异于正常用户的明显特征,总结如下:

1)UA的特征。正常的浏览器请求是这样的。

而我们用Golang的net/http package构造的http请求默认的UA却是这样的,特征非常明显,很容易识别。

2)Referer特征。一个大型网站,一定有很多页面不是直接展示在主页上的,需要用户执行查询操作或超链接点击操作,比如订单提交页、侧边栏红包页等。一旦发生了浏览页面的转移,HTTP HEADER中便会在Referer字段中自动记录这次请求的来源,即:对B页面的请求是从A页面来的。比如对某一个新闻的访问,就是从163主页来的。但爬虫在遍历URL的时候会直接尝试访问目标地址,进而不会携带Referer字段。

3)Cookie特征。我们可以将重要的信息设置为仅允许用户登录后才能访问,凡是访问某些数据接口而不带登录态的请求,可以都进行屏蔽,进而过滤低阶爬虫的骚扰。

4)X-Forwarded-For特征。根据RFC7239的描述,X-Forwarded-For字段是用来标识代理后真实源IP地址的,当爬虫的原始IP被防御方封禁后使用代理继续爬取任务时,防御方可通过该字段识别出爬虫的真身,并将其请求拒绝。

2、基于URL请求参数的爬虫识别

构造一个和真实请求一模一样的HTTP HEADER可以算是爬虫工程师的基本功,于是,防御方便在URL中动起了手脚,增加校验字段,增强爬虫识别准确度,增大数据爬取难度。

1)前端签名验签SDK。在前端部署签名SDK,客户端每发起一个请求时都会调用签名SDK计算出该URL的哈希,并将该哈希值附在URL内传递至服务端做校验,如果哈希校验不通过或不包含该哈希值,则服务端会返回报错。

如:https://www.xx.com/a/b/c/goods?id=123-890-abc-def&signature=08f8e04b65e775bab8b57e34f44398a7

2) ID复杂化。用复杂的ID替代简单的数字ID,让爬虫找不到规律,例如:http://www.dianping.com/shop/l1MNeHgCskgs6qiN,防御方可记录频繁返回404的请求IP,多半就是爬虫了。

3、基于行为特征的爬虫识别

在更高阶的反爬对抗中,签名验签SDK会被破解,复杂化的ID也不能阻挡对方情报刺探的脚步,防御方从HTTP HEADER特征和URL特征中已经无法分辨出爬虫了,这时候,需要转换思路,从爬虫行为本身着手进行识别。

爬虫是为了批量获取信息,而正常用户只会获取其需要的信息,那么,两者在行为上就会呈现出非常明显的统计特征,防御方可以通过这个方法识别出异常IP或用户。

1)通过统计请求IP或账号单位时间内总请求数量进行爬虫识别

2)通过计算同一IP或账号请求之间的间隔进行爬虫识别

3)通过统计请求IP或账号每天请求次数设置阈值进行爬虫识别

4、蜜罐识别

在爬虫获取链接进行请求的过程中,爬虫会根据正则,xpath,css等方式进行后续链接的提取,此时服务器端可以设置一个陷阱URL,会被提取规则获取,但是正常用户无法获取,这样就能有效的区分爬虫和正常用户。

3.1.2 爬虫的处置

和爬虫的识别一样,爬虫的处置也有不同的方法,并不只是单纯的拒绝访问。以下列举了自己观察和学习到的一些方法。

1、请求丢弃。

顾名思义,发现爬虫之后,在Web服务器上直接将该HTTP请求丢弃。

2、数据混淆。

当发现爬虫请求之后,服务端在返回参数时做区别对待,返回一个错误的值给爬虫。例如,正常用户浏览的100元一件的毛衣,服务端向爬虫返回的价格是200元,污染数据采集者的数据库,使所得非所见,增大其后续人工数据比对的工作量。

3、验证滑块或验证码。

当服务端发现疑似爬虫请求但又不是很肯定时,校验服务可以弹出一个滑块或验证码界面,意味着只有真人才能通过这个校验,而程序则不可以,以此区分爬虫请求,并隔绝爬虫的进一步访问。

4、阻塞任务队列

当服务端发现爬虫后,便立刻生成大量垃圾url或包含超大文件的URL,从而阻塞任务队列,降低爬虫的实际工作效率。

3.2 策略2:Web前端防御

爬虫的目标就是要获取重要的数据,如果我们让爬虫抓到的数据不能被正常的显示而又不影响用户正常浏览,理论上那就不需要再费心费力的去区分流量中是否包含爬虫请求了,岂不是美滋滋。

我整理了如下四种Web前端防御手法,可以大大抬高爬虫门槛。

1、图文混排。

即在一句话里部分文字由图片所替代,爬虫在数据抓取的时候只能获得破碎的内容,但不影响用户使用App或浏览器的正常使用。

另外,还可以在图片中加入水印,干扰OCR读取。

2、字体加密

防御方对一段信息里部分文字进行加密处理,最后爬虫依然只能获得破碎的内容。

这种加密机制的原理是:

在 CSS3 之前,Web 开发者必须使用用户计算机上已有的字体。但是在 CSS3 时代,开发者可以使用@font-face 为网页指定字体,对用户计算机字体的依赖。开发者可将心仪的字体文件放在 Web
服务器上,并在 CSS 样式中使用它。用户使用浏览器访问 Web 应用时,对应的字体会被浏览器下载到用户的计算机上。

在学习浏览器和页面渲染的相关知识时,我们了解到 CSS 的作用是修饰 HTML ,所以在页面渲染的时候不会改变 HTML 文档内容。由于字体的加载和映射工作是由 CSS 完成的,所以即使我们借助 Splash、Selenium 和 Puppeteer 工具也无法获得对应的文字内容。字体反爬虫正是利用了这个特点,将自定义字体应用到网页中重要的数据上,使得爬虫程序无法获得正确的数据。

也就是说浏览器会从服务端下载并加载一个自定义的WOFF(Web Open Font Format)字体文件,然后对css中规定使用该字体的文字进行页面展示。

3、CSS偏移

CSS 偏移反爬虫指的是利用 CSS 样式将乱序的文字排版为人类正常阅读顺序的行为。这个概念不是很好理解,我们可以通过对比两段文字来加深对这个概念的理解。

  • HTML 文本中的文字:我的学号是 1308205,我在北京大学读书。

  • 浏览器显示的文字:我的学号是 1380205,我在北京大学读书。

爬虫提取到的学号是 1308205,但用户在浏览器中看到的却是 1380205。如果不细心观察,爬虫工程师很容易被爬取结果糊弄。这种混淆方法和图片伪装一样,是不会影响用户阅读的。

3.3 更多直接的爬虫对抗策略

反爬还可以有其他的角度开展,比如建立黑名单库,包含IP、账号、手机号、设备指纹等,对命中的黑名单的请求采取策略。

关于反爬的更多内容,还可参考:

其实,无论是国家之间的战争,还是企业之间的暗战,最后拼的都是资源。掌握了更广泛资源,拥有更多业务纵深的一方,往往都能笑到最后。

反爬工作更多反映出来的其实是人与人之间的对决,更是公司之间的角力。

占有战略优势的一方,还可以从其他维度打击竞争对手的数据采集工作,释放反爬工作的技术压力。

例如:

  • 商业“无间道”;

  • 挖角核心人员;

  • 数据采集案件诉讼;

  • 收并购竞争对手;

  • ... ...

总而言之,只要还有商业竞争,爬虫和反爬就会要长期斗争下去。

全文完~

笔芯❤️

Ref:

https://leyisan.github.io/2018/08/02/%E7%88%AC%E8%99%AB%E4%B8%8E%E5%8F%8D%E7%88%AC%E8%99%AB/

https://tstrs.me/1450.html

https://cuiqingcai.com/author/zenrust

https://www.zhihu.com/question/19645541

https://blog.csdn.net/u014203453/article/details/77598997

https://juejin.im/post/5d906663518825165926332d

【韭菜永不黄】是阿飞的小号,表示阿飞一直都是后浪。


文章来源: https://mp.weixin.qq.com/s?__biz=MjM5Mjc0MDU1MQ==&mid=2452313784&idx=1&sn=8384a5cd6cc956a6d606813c7581ef98&chksm=b17e53108609da06cef5867812d90a1d300458ef66e6f090db3f43b49602aef69e29f7e0d736&scene=58&subscene=0#rd
如有侵权请联系:admin#unsafe.sh