爬虫与汽车之家的Css:Content-反爬与反反爬的奇技淫巧

大家好,我又要食言了,总盯着去哪儿挺没意思的,今天咱们先聊另外一个老朋友-汽车之家。

先上广告,土豪朋友不想写代码的,可以直接使用我们的汽车之家论坛爬虫:

汽车之家论坛采集爬虫-神箭手云

给新朋友的之前的文章列表:

爬虫被封IP了怎么办-反爬与反反爬的奇技淫巧

爬虫中的验证码识别-反爬与反反爬的奇技淫巧

爬虫中Cookie的伪造(非登录)-反爬与反反爬的奇技淫巧

爬虫与诡异的字体-反爬与反反爬的奇技淫巧

话说感觉这个系列的我起名字越来越不走心了。越写越像哈利波特的起名套路了-爬虫与混血王子。(嗯,一点都不违和)我这个爱扯犊子的性格真是很难收敛啊。

话说Css自从越来越强大之后,被很多反爬工程师看上了。上篇文章介绍的字体就需要用到Css中的font-face和font-family。这节我们通过汽车之家来看看Css在反爬中另外一个妙用-content。

本来网页上显示的字无非两种,一种就是文本,一种就是显示在图片上的。所以之前有一种常规的反爬,就是把字当做图片替换来显示,目前百度还经常喜欢这么处理,比如百度知道,百度指数(参考天坑),当然不少的电话号码和邮箱这类重要信息,依然也再沿用这个方案。

然后随着css的content兼容性越来越好之后,就又有了一个性能更好的反爬,就是用css的content来代替原来文本中的文字,辅以合适的随机生成的方法,确实也不错。算是一个性能和反爬折中的方案吧,比如我们今天要提到的 汽车之家论坛 就是采用这样一个反爬方案。

一.为什么Css:Content能反爬。

事实上任何能让原来html中文本隐藏混淆加密又不影响正常用户显示的方式都可以来做反爬,比如我们上一篇文章提到的字体方式混淆,比如我们后面要提到的JS加密。而这篇文章主要是采用Css的content属性来隐藏。

我们简单的看下content属性使用,大家可以尝试复制这段写入一个网页的Css中

div:before {
   content: "神箭手";
}

我们会发现每一个div的开头都加入的神箭手的文字,而且这些文字还是无法复制的。再加上并不像生成图片那样会严重拖慢服务器性能,所以算是一个挺折中的方案。

爬虫与诡异的字体-反爬与反反爬的奇技淫巧

本来吧,这节课准备写我自己期待很久的Javascript对抗的,但是发现上节课讲了偏技术的Cookie感觉反响一般,所以还是准备再插几节闲聊猎奇型的反爬技巧,再到最终的Javascript吧,放最后一篇文章写,不然我害怕写完那篇,就写不动了。

好了,同样前几篇文章链接:

爬虫被封IP了怎么办-反爬与反反爬的奇技淫巧

爬虫中的验证码识别-反爬与反反爬的奇技淫巧

爬虫中Cookie的伪造(非登录)-反爬与反反爬的奇技淫巧

从今天这篇文章开始,主要给大家过一些小众的反爬策略以及其中的利弊,所以一般来说都会有一个特定的示例,比如今天的反爬策略就来自反爬界大神之一的去哪儿(当然也是爬虫界的)手机版。

我们先来用chrome的手机模式开一下去哪儿的机票:

看着叫一个干净整洁,完全没毛病。但是!当我们掀开被子看源码的时候 震惊了:

不知道大家能不能看清图,我码字注解一下,显示的价格是560,而源码中的价格则是540!

我们这篇文章就来看看去哪儿手机版是怎么做到的(当然偷偷剧透下,下篇文章咱们主角还是去哪儿)

其实同学们只要智商在线,看到标题就知道,这是用字体实现,我们看右侧的css面板也可以看到,这个dom元素的字体是单独设置的。也就是去哪儿通过修改字体,让4显示成了6。

1.为什么字体可以反爬

感觉从这篇文章开始这个套路快进行不下去了。为什么字体可以反爬? 首先这个迷惑性太大,很多马虎的工程师以为可以了,直接就爬下来,当然就是被老板骂的体无完肤了,对反反爬工程师的精神可以造成1万点伤害。同时呢,去哪儿这个字体是动态生成的字体,也就是说你也不知道下一次刷出来的4到底是几显示出来的。这个道行就比较高了。

2.怎么做好字体反爬?

这种反爬策略用在数字上确实天衣无缝,非常优雅。唯一值得提的就是一点,如何动态生成字体和页面来做好对应关系。其实这是一个工程性的问题,大部分编程语言都含有生成字体的库,如果对网站整体性能比较自信的话,完全可以每次请求都动态生成,当然这样确实会比较慢,比较推荐是通过定时任务,去更新一个字体池。每次有请求过来,从字体池中随机拿一个字体,换一个随机的名字(可以通过url rewrite来实现),并和现在的数字做一次映射,调整页面显示后整体输出,就可以在尽量不影响性能的情况下搞死反反爬。

当然使用字体也是有局限的,其中最大的问题莫过于@font-face的兼容性问题,所以去哪儿只在移动端采用这个反爬策略,可能也有兼容性的考虑吧,相比之下,去哪儿的pc端的反爬写法则丑陋很多。

爬虫中Cookie的伪造(非登录)-反爬与反反爬的奇技淫巧

两篇文章下肚,各位看官感觉如何。避免新同学不知道之前的文章:

爬虫被封IP了怎么办-反爬与反反爬的奇技淫巧

爬虫中的验证码识别-反爬与反反爬的奇技淫巧

前两篇文章算是讲了最常规的两种反爬,本篇文章理论上应该说说登录,因为基本上这三个反爬套路结束之后,其他都是小众了。不过登录这个东西真的没太多可讲的,因为严格来说登录并不是反爬,只是一种保护手段,后面有时间简单说说吧。

今天咱们要聊的这位主角跟登录倒也有点关系。先来简单摘抄一段Cookie的描述:

Cookie,有时也用其复数形式Cookies,指某些网站为了辨别用户身份、进行 session 跟踪而储存在用户本地终端上的数据(通常经过加密)。定义于 RFC2109 和 2965 中的都已废弃,最新取代的规范是 RFC6265

那简单来说Cookie就是一个浏览器上的缓存或者叫小数据库也行,在没有LocalStorage之前,我们前端工程师就只能用这破玩意当数据库使。

那现在问题来了,这玩意对反爬到底有什么帮助呢。

好了,我的经典套路又要来了,先假装介绍反爬技巧:

一.为什么Cookie能够做反爬?

这个问题远比前两篇文章里的要难回答,因为IP和验证码都是实打实的原因导致人家是反爬的上上手。但是Cookie则不然,Cookie上的反爬则更多的是纯粹人与人之间的对抗,Cookie由于是存储在客户端上导致其伪造成本极低,那为什么还有那么多的网页采用Cookie来做反爬呢?(当然很多爬虫菜鸟工程师可能都判断不出来是用Cookie在做反爬),是因为目前Javascript混淆的手段也是花样百出,任你是Javascript的高手高手高高手,我也能用恶心的招数(比如把所有代码拆成ASCII码数组,再动态拼合后eval)来怼得你不想吃饭。这也成就了Cookie反爬成为除IP和验证码这两类可见的反爬手段之后最重要的一种补充。当然具体Javascript对抗相关的内容我们下一篇文章再讲。

二.怎么做好Cookie反爬?

首先咱们得知道,常见的Cookie设置方式有两种,一种在后端设置,通过Response的Header传输到前端浏览器中,如下图:

另一种则更加隐蔽,通过前端调用document.cookie来设置,对于反爬效果来说,第二种显然比第一种效果来的好的多,起码能让反反爬工程师少陪老婆一个星期,是不是想起来都觉得很过瘾呢。当然直接调用document.cookie来设置基本是没什么效果的,一定要配合上Javascript的混淆才能熬出一锅反爬的好汤来。至于怎么混淆,我们也留到下一篇文章再讲。

三.写爬虫时发现Cookie很复杂该怎么分析?

我们公司有专门做爬虫的同事一见到复杂的Cookie就想哭,Cookie确实属于反反爬中相当难缠的对手,应该说跟Request中有一个摸不着头脑的参数值可以并驾齐驱。那我们遇到这种Cookie应该如何沉着应对呢?下面我就给大家把解题思路讲一讲,考试必考啊。

首先一定准备好Chrome,老师其他工具用的少,就不展开了。

1. 先删掉Cookie看正不正常的

第一步也是最重要的一步,千万记得先把Cookie都删掉请求一次,如果没问题,万事大吉。这里注意对于Cookie来说一定要把环境处理好,因此测试之前一定记得点开『打开新的隐身窗口』的选项。每次测试完了,打开控制界面,清空Cookie再做下一次测试。

爬虫中的验证码识别-反爬与反反爬的奇技淫巧

上一课带大家聊了聊反爬与反反爬最基础的对抗-代理ip,别看这个简单,真正处理好了代理ip基本上解决大半的爬虫问题,包括本节的验证码。很多网站弹出验证码也是因为发现ip重复过多,比如搜狗微信搜索,如果在合理的时间切换ip,就可以完美的躲避掉搜狗微信中的验证码(注意只有搜狗微信中的验证码可以,微信中的是不可以的,其中区别可以通过浏览器中的域名来区分)。

上一篇文章写完之后,爬虫天坑的文章意外收获了不少赞,这里拜谢大家支持,同时如果天坑系列破百赞的话,我会继续更新那个系列。

要完了赞,扯完了废话,我们赶紧进入这一篇文章的正题-验证码识别。

先让我来摘抄一段验证码的介绍:

验证码(CAPTCHA)是“Completely Automated Public Turing test to tell Computers and Humans Apart”(全自动区分计算机和人类的图灵测试)的缩写,是一种区分用户是计算机还是人的公共全自动程序。

话说直到今天我才知道CAPTCHA原来是这么直白的英文缩写,外国人对单词的缩写狂热真是一点不比国人差啊。(突然想到刚进公司那会摸不着头脑的TGIF)

那好了,延续上篇文章的套路,我们先来看看反爬:

一.为什么验证码可以反爬?

简单来说,是人类有着一种天赋,可以很轻松的从一段图片中识别出文字和数字,而机器却不能。但是由于这些年机器学习的飞速进展。这项技能上人类和机器之间的差距越来越小,导致为了区分人和机器,人类工程师已经快达到变态的地步,终于诞生了宇宙无敌12306验证码:

当然这些年同样随着机器学习技术的飞速进展,验证码也开始出现了新的形式,比如极验验证为代表的轨迹模式,这类的优缺点我们后面再聊。

二.如何使用验证码实现反爬?

使用验证码相信是所有web工程师的基本功,百度谷歌上一搜一大堆,还有自动生成代码的。对于普通图文类的验证码,无非就是先生成随机串,再生成图片,将随机串存入session,等待用户提交后进行比对。或者也可以集成极验验证这类第三方验证服务,这里就不再赘述了。

使用验证码都会使用,那我们这里着重讲一讲到底该如何选择,这些常用验证码形式利弊各有哪些:

1.数字字母验证码:这类验证码优点是生成简单,大部分语言都自带图形库,在加入一点扭曲和噪点,基本可以解决掉初级爬虫工程师和暴力破解的脚本小子。缺点当然也显而易见,对于cnn代码只用写10行的今天,这些验证码只要有足够的标注数据,破解起来简直是轻而易举。我们在微信验证码识别中大约使用了10万张标注好的图片进行训练就可以完成类似人的准确度,具体可以参考我们的应用-微信文章爬虫[按公众号或关键字]-神箭手云

爬虫被封IP了怎么办-反爬与反反爬的奇技淫巧

大家好,好久不见了,之前写了一篇爬虫天坑系列的文章,本想继续写下去,没想到可能篇幅太长,废话太多,导致很多朋友感觉帮助不大。因此组织上决定,从这篇文章开始,让我写一些更接地气的文章。


其实很多人都觉得爬虫没什么深奥的技术,但是又觉得想真正写好爬虫却似乎很难。原因就在于爬虫本身的功能简单,而真正难的都在反反爬技术当中。那从今天开始我们一起来聊一聊反爬和反反爬们使用的那些奇技淫巧。

说到反爬,最简单的方法莫过于封IP了,简单有效,还很难破解。这就像门卫大爷问你叫什么,你说你叫周杰伦,下次你再来,你还说你叫周杰伦,那大爷肯定问:“怎么又是你!滚”(这个例子举的有点暴露年龄)。


1.为啥封ip有效?

其实一次网页请求,还有大量的信息,比如UserAgent,比如Cookie。那为啥封ip最有效?是因为其他的信息都可以伪造,但是http请求中却无法直接伪造ip的,了解网络协议的同学们应该知道,http协议基于tcp,而tcp协议存在握手机制的,这样你就绝对无法用假的ip来连接了。就像你要写信给一个小姐姐,然后希望小姐姐回信,但是你却写了一个假的发信地址,那你就是注孤生了。(当然,你可以写一个小哥哥的地址,让小哥哥把收到的信再交给你,这样的话,你能不能收到信,就取决于小哥哥的人品了,当然回到代码里,就是代理服务器的稳定性。)


2.怎么封ip?

我们先来看看老牌论坛程序Discuz的反爬功能-防采集:


非常简单粗暴,一个ip只允许访问多少次,这里默认是200次。也就是说当一个ip访问超过200次就会记入黑名单,限制访问。实现方式也很简单,对于大部分语言来说,获取ip地址都是很简单的,获取到ip之后,将ip作为主键存入数据库中(当然discuz会将ip转换成int来做一些优化,减小主键占用的空间)。最后再加一个字段来记录访问次数就可以了。

当然当我们每天ip数量很多的时候,我们可以考虑存入非关系型数据库中,毕竟我们只需要key-value形式的数据,用关系型数据库反倒浪费了。


3.救命啊,我的爬虫封ip了怎么办?

说完了反爬,我们来说反反爬。爬虫被封ip简直就是所有爬虫工程师必须要迈过去的一道坎,而作为这个行业混迹多年的老司机,对于ip怎么来的问题,那是相当的熟悉。下面一一给大家梳理一下利弊:

    1、自己想办法伪造:赶紧打消这个念头,浪费时间,当年我们给中国移动做爬虫系统,作为运营商,人家都不自己造ip。

    2、从万能的淘宝上买:跟很多人一样,我当年第一次需要ip的时候,也是第一时间求助万能的淘宝。但后来才了解,淘宝上的ip大多都是从专业代理ip厂商买过来,然后进行二次销售,很多过期的,稳定性和可用率可以说是相当的差,如果是做爬虫的基本可以放弃,如果是干其他什么我完全不了解的事情,勉强可以尝试,毕竟比较便宜。

    3、代理IP服务商:现在比较好的几家是:全网代理,tk代理,快代理(不包含一些量小质高,非批量的代理ip服务商)。每家的优点不一样,全网的代理相对质量较高,tk代理数量多,而快代理则有自建的私密代理,但数量不多。这类厂商大部分的代理是通过自己写的ip扫描程序从网上扫来的,质量比淘宝的能好点,用作爬虫的话,需要自己先做一次过滤,大概每天过滤出来的可用的ip大约在1000左右,如果每天爬的网页不多,可以尝试,价格不是特别便宜。另外像是微信爬虫这种,扫描来的ip基本就是废,因为早就被别人用的时候就被封了。

    4、神箭手云爬虫:作为神箭手创始人之一,我对自己的产品从来都是不吹不黑的,神箭手的代理ip怎么说呢,可以说是宇宙之内找不到第二家的存在。我们首先买了三家主流代理ip服务商的所有ip,然后给大家免费用(你没有看错,就是免费用),但是为了爬一些鹅厂,狼厂这类大厂的网页,我们又自建了几百台代理服务器,每天产生40万的私密代理ip(注意是40万是实际ip,不是什么ip池)。价格却便宜到没朋友,给大家对比一下我们和快代理的价格对比:快代理3600元/每月,每天5000ip,神箭手299元/每月,每天40万ip。当然我们也有限制:只有在我们平台上的爬虫才能接入我们的ip。