反爬虫策略只是为了让爬虫更复杂,而Referer则存

作者: 编程  发布:2019-11-22

目前遇到的反爬主要有以下几种

搜寻了大多数资料,反爬虫策略只是为了让爬虫更复杂,更麻烦,目前貌似没有能一劳永逸的方案。

上一篇写了反爬必杀技,这一篇简单的总结一下常见的反爬机制,了解了这些就能够更好的从细节入手,获得更高的伪装水准


  1. 访问频率
  2. 登录限制
  3. 通过Head封杀
  4. JavaScript脚本动态获取网站数据
  5. 验证码
  6. IP限制
  7. 网站内容反爬

以下的策略只是增加爬虫的难度,增加爬虫成本。

1. Headers

从用户的headers进行反爬是最常见的反爬虫策略。Headers(上一讲中已经提及) 是一种区分浏览器行为和机器行为中最简单的方法,还有一些网站会对 Referer (上级链接)进行检测(机器行为不太可能通过链接跳转实现)从而实现爬虫。

相应的解决措施:通过审查元素或者开发者工具获取相应的headers 然后把相应的headers传输给python的requests,这样就能很好地绕过。

注:Headers 相关知识:

  • host:提供了主机名及端口号

  • Referer 提供给服务器客户端从那个页面链接过来的信息(有些网站会据此来反爬)

  • Origin:Origin字段里只包含是谁发起的请求,并没有其他信息。跟Referer不一样的 是Origin字段并没有包含涉及到用户隐私的URL路径和请求内容,这个尤其重要。

并且Origin字段只存在于POST请求,而Referer则存在于所有类型的请求。

  • User agent: 发送请求的应用程序名(一些网站会根据UA访问的频率间隔时间进行反爬)

  • proxies: 代理,一些网站会根据ip访问的频率次数等选择封ip

  • cookie: 特定的标记信息,一般可以直接复制,对于一些变化的可以选择构造(python中的

一些库也可以实现)

Accept首部为客户端提供了一种将其喜好和能力告知服务器的方式,包括他们想要什么,
可以使用什么,以及最重要的,他们不想要什么。这样服务器就可以根据这些额外信息,对要发送的内容做出更明智的决定。

首部            描述

  • Accept          告诉服务器能够发送哪些媒体类型

  • Accept-Charset      告诉服务器能够发送哪些字符集

  • Accept-Encoding     告诉服务器能够发送哪些编码方式(最常见的是utf-8)

  • Accept-Language     告诉服务器能够发送哪些语言

  • Cache-control: 这个字段用于指定所有缓存机制在整个请求/响应链中必须服从的指令

** Public 所有内容都将被缓存(客户端和代理服务器都可缓存)

** Private 内容只缓存到私有缓存中(仅客户端可以缓存,代理服务器不可缓存)

** public max-age=xxx (xxx is numeric) 缓存的内容将在 xxx 秒后失效, 这个选项只在HTTP 1.1可用

  • No-store 不缓存

0x01 常见的反爬虫

从功能上来讲,爬虫一般分为数据采集,处理,储存三个部分。这里我们只讨论数据采集部分。

  一般网站从三个方面反爬虫:用户请求的Headers,用户行为,网站目录和数据加载方式。前两种比较容易遇到,大多数网站都从这些角度来反爬虫。第三种一些应用ajax的网站会采用,这样增大了爬取的难度。

1.访问频率

如果访问一个网站过于频繁,网站后台管理可能会针对IP封锁一段时间。那么解决的方法就是有间隔的进行控制时间爬取,比如搞个随机数进行sleep,sleep不同的间隔,那么网站就识别不出是爬虫了,千万不要间隔一样的时间,有规律的时间间隔访问很容易就被网站识别出是人为的啦,可以借用scrapy框架中的setting文件中的智能算法,采用没有规律的时间间隔访问。

1.Headers限制

图片 1

检查User-Agent属性,判断是否为浏览器访问。

检查Referer属性,判断来源。

2. IP 限制

一些网站会根据你的IP地址访问的频率,次数进行反爬。也就是说如果你用单一的 IP 地址访问频率过高,那么服务器会在短时间内禁止这个 IP访问。

解决措施:构造自己的 IP 代理池,然后每次访问时随机选择代理(但一些 IP 地址不是非常稳定,需要经常检查更新)

0x02 通过Headers反爬虫

  从用户请求的Headers反爬虫是最常见的反爬虫策略。很多网站都会对Headers的User-Agent进行检测,还有一部分网站会对Referer进行检测(一些资源网站的防盗链就是检测Referer)。如果遇到了这类反爬虫机制,可以直接在爬虫中添加Headers,将浏览器的User-Agent复制到爬虫的Headers中;或者将Referer值修改为目标网站域名。对于检测Headers的反爬虫,在爬虫中修改或者添加Headers就能很好的绕过。

2.登录限制

有些网站需要登录才能看到页面,如果进行爬虫的话,可以通过模拟登录就像浏览器一样,然后通过cookie记住登录状态,每次进行访问都携带者所需要的cookie过去,所以这种反爬机制也很容易解决。

以下是网上收集的获取不到HTTP_REFERER值的情况:

① 在浏览器内直接敲URL

② windows桌面上的超链接图标

③浏览器内书签

④第三方软件(如Word,Excel等)内容中的链接

⑤SSL认证网站跳入

⑥; meta页面设置自动跳转时,在example.com将取不到REFERER URL

⑦使用JavaScript的Location.href或者是Location.replace()

这应该是最常见的,最基本的反爬虫手段,主要是初步判断你是否是真实的浏览器在操作。

3. UA限制

UA是用户访问网站时候的浏览器标识,其反爬机制与ip限制类似。

解决措施:构造自己的UA池,每次python做requests访问时随机挂上UA标识,更好地模拟浏览器行为。当然如果反爬对时间还有限制的话,可以在requests 设置timeout(最好是随机休眠,这样会更安全稳定,time.sleep())

附:常见的浏览器标识(其实还有很多,大家最好自己搜集一下~):

如果先搜集麻烦可以参照这篇文章
13伪装必杀技之使用超级简单的请求头fake_useragent库

User-Agent: Mozilla/5.0 (Macintosh; U; IntelMac OS X 10_6_8; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1Safari/534.50

'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50

Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)

0x03 基于用户行为反爬虫

  还有一部分网站是通过检测用户行为,例如同一IP短时间内多次访问同一页面,或者同一账户短时间内多次进行相同操作。

  大多数网站都是前一种情况,对于这种情况,使用IP代理就可以解决。可以专门写一个爬虫,爬取网上公开的代理ip,检测后全部保存起来。这样的代理ip爬虫经常会用到,最好自己准备一个。有了大量代理ip后可以每请求几次更换一个ip,这在requests或者urllib2中很容易做到,这样就能很容易的绕过第一种反爬虫。

  对于第二种情况,可以在每次请求后随机间隔几秒再进行下一次请求。有些有逻辑漏洞的网站,可以通过请求几次,退出登录,重新登录,继续请求来绕过同一账号短时间内不能多次进行相同请求的限制。

3.通过Head封杀

我们进行网页爬取的时候,会通过HTTP请求,HTTP请求包含请求头和请求体,有些网站会根据请求头部Head信息进行反爬虫封杀IP,比如可以通过请求头部的User-Agent来判断是否为爬虫还是浏览器。每个网站有一个robots.txt,一般都在服务器的根目录下,比如下面百度的,这个文件的作用是允许不同爬虫可以爬取不同目录下的文件的权限。

图片 2

当然我们爬虫不会傻傻的告诉网站我们是爬虫,一般都会通过修改User-Agent字段的值来伪造成浏览器。所以这种反爬机制也容易对付。

2.IP限制

限制IP也是很多网站反爬虫的初衷,有些人随便写一个循环,就开始暴力爬取 ,确实会给网站服务器带来很大的负担,而这种频繁的访问,显然也不会是真实用户行为,索性果断把你封掉。

当然,攻击者可以通过不断换IP的形式来绕过这种限制。而且封IP会流失用户,一般情况下不会采取。

4.验证码反爬虫或者模拟登陆

验证码:这个办法也是相当古老并且相当的有效果,如果一个爬虫要解释一个验证码中的内容,这在以前通过简单的图像识别是可以完成的,但是就现在来讲,验证码的干扰线,噪点都很多,甚至还出现了人类都难以认识的验证码(~~~)

嗯,如果一个爬虫要访问的页面提示要输入验证码,那么问题就来了,不是所有的爬虫都装备了图像识别技术啊。其实大家要问了,爬虫处理这些登录页面有什么意义呢?除非你是想爆破密码或者是刷xxx什么的。但是真的有人把验证码用在反爬虫上的么?事实上确实有,Google就在使用,如果有使用google经验的读者会发现自己在愉快查google,特别是使用vpn或者是各种科学上网工具的时候,经常会提示你google想知道你是不是一个人(不是人还能是什么?)
相应的解决措施:验证码识别的基本方法:截图,二值化、中值滤波去噪、分割、紧缩重排(让高矮统一)、字库特征匹配识别。(python的PIL库或者其他)

模拟登陆(例如知乎等):用好python requests中的session(下面几行代码实现了最简单的163邮箱的登陆,其实原理是类似的~~)

import requests
s =requests.session()
login_data={"account":"   ","password":"  "}
res=s.post("http://mail.163.com/",login_data)

0x04 动态页面的反爬虫

  上述的几种情况大多都是出现在静态页面,还有一部分网站,我们需要爬取的数据是通过ajax请求得到,或者通过JavaScript生成的。首先用Firebug或者HttpFox对网络请求进行分析。如果能够找到ajax请求,也能分析出具体的参数和响应的具体含义,我们就能采用上面的方法,直接利用requests或者urllib2模拟ajax请求,对响应的json进行分析得到需要的数据。

  能够直接模拟ajax请求获取数据固然是极好的,但是有些网站把ajax请求的所有参数全部加密了。我们根本没办法构造自己所需要的数据的请求。我这几天爬的那个网站就是这样,除了加密ajax参数,它还把一些基本的功能都封装了,全部都是在调用自己的接口,而接口参数都是加密的。遇到这样的网站,我们就不能用上面的方法了,我用的是selenium+phantomJS框架,调用浏览器内核,并利用phantomJS执行js来模拟人为操作以及触发页面中的js脚本。从填写表单到点击按钮再到滚动页面,全部都可以模拟,不考虑具体的请求和响应过程,只是完完整整的把人浏览页面获取数据的过程模拟一遍。

  用这套框架几乎能绕过大多数的反爬虫,因为它不是在伪装成浏览器来获取数据(上述的通过添加 Headers一定程度上就是为了伪装成浏览器),它本身就是浏览器,phantomJS就是一个没有界面的浏览器,只是操控这个浏览器的不是人。利用 selenium+phantomJS能干很多事情,例如识别点触式(12306)或者滑动式的验证码,对页面表单进行暴力破解等等。它在自动化渗透中还 会大展身手,以后还会提到这个。

‘转载’出处:

 

4.JavaScript脚本动态获取网站数据

现在网站大多都是通过这种方式来返回数据给用户,也是主要的反爬虫机制。网站利用ajax异步请求来获得数据,可以增加一定程度的爬虫难度。但不管怎么样,服务器能够返回数据给浏览器就说明浏览器要发送HTTP的请求,那么主要找到所请求的URL就可以得到想要的数据,不然就采用自动化selenium方式来获得数据。

3.动态加载

通过异步加载,一方面是为了反爬虫,一方面也可以给网页浏览带来不同的体验,实现更多的功能。很多动态网站都是通过ajax或者JavaScript来加载请求的网页。

5.Ajax动态加载

网页的不希望被爬虫拿到的数据使用Ajax动态加载,这样就为爬虫造成了绝大的麻烦,如果一个爬虫不具备js引擎,或者具备js引擎,但是没有处理js返回的方案,或者是具备了js引擎,但是没办法让站点显示启用脚本设置。基于这些情况,ajax动态加载反制爬虫还是相当有效的。

Ajax动态加载的工作原理是:从网页的 url 加载网页的源代码之后,会在浏览器里执行JavaScript程序。这些程序会加载出更多的内容,并把这些内容传输到网页中。这就是为什么有些网页直接爬它的URL时却没有数据的原因。

处理方法:若使用审查元素分析”请求“对应的链接(方法:右键→审查元素→Network→清空,点击”加载更多“,出现对应的GET链接寻找Type为text/html的,点击,查看get参数或者复制Request URL),循环过程。如果“请求”之前有页面,依据上一步的网址进行分析推导第1页。以此类推,抓取抓Ajax地址的数据。对返回的json使用requests中的json进行解析,使用eval()转成字典处理(上一讲中的fiddler可以格式化输出json数据

5.验证码

这种方式难度就大了,验证码是专门用来区分人和机器的手段,目前能想到的一种方法是通过图像识别来识别出验证码。但是能够做到图像识别的,不是很容易的。

4.验证码

给用户请求次数加一个阀值,超过该阀值,弹出验证码界面。

6.cookie限制

一次打开网页会生成一个随机cookie,如果再次打开网页这个cookie不存在,那么再次设置,第三次打开仍然不存在,这就非常有可能是爬虫在工作了.

解决措施:在headers挂上相应的cookie或者根据其方法进行构造(例如从中选取几个字母进行构造)。如果过于复杂,可以考虑使用selenium模块(可以完全模拟浏览器行为)

关于其他一些更复杂的方法,也正在学习中,欢迎大家讨论~~

6.IP限制

网站可能会将IP永久封杀掉,但是还是想继续访问的话,只能通过改变ip咯,改变ip的话就得用到IP代理,不过ip代理分两种,一种是透明代理,网站可以知道真实ip,另一种是高匿代理,网站无法获得访问的真实IP。可以借用西祠代理网站提供的免费代理。不过有一些是已经失效的。

5.返回伪造的信息

确定该请求为爬虫请求后,返回虚假混乱的数据增加筛选复杂度。

以下是引用sexycoder的观点:

反爬虫最基本的策略:

1.检查浏览器http请求里面的user-agent字段

2.检查http请求的referer(即当前的这个页面是从哪个页面跳转过来的)

爬虫策略:

这两个都是在http协议的报文段的检查,同样爬虫端可以很方便的设置这些字段的值,来欺骗服务器。

反爬虫进阶策略:

1.像知乎一样,在登录的表单里面放入一个隐藏字段,里面会有一个随机数,每次都不一样,这样除非你的爬虫脚本能够解析这个随机数,否则下次爬的时候就不行了。

2.记录访问的ip,统计访问次数,如果次数太高,可以认为这个ip有问题。

爬虫进阶策略:

1.像这篇文章提到的,爬虫也可以先解析一下隐藏字段的值,然后再进行模拟登录。

2.爬虫可以使用ip代理池的方式,来避免被发现。同时,也可以爬一会休息一会的方式来降低频率。另外,服务器根据ip访问次数来进行反爬,再ipv6没有全面普及的时代,这个策略会很容易造成误伤。

反爬虫进进阶策略:

1.数据投毒,服务器在自己的页面上放置很多隐藏的url,这些url存在于html文件文件里面,但是通过css或者js使他们不会被显示在用户看到的页面上面。(确保用户点击不到)。那么,爬虫在爬取网页的时候,很用可能取访问这个url,服务器可以100%的认为这是爬虫干的,然后可以返回给他一些错误的数据,或者是拒绝响应。

爬虫进进阶策略:

1.各个网站虽然需要反爬虫,但是不能够把百度,谷歌这样的搜索引擎的爬虫给干了(干了的话,你的网站在百度都说搜不到!)。这样爬虫应该就可以冒充是百度的爬虫去爬。(但是ip也许可能被识破,因为你的ip并不是百度的ip)

反爬虫进进进阶策略:

给个验证码,让你输入以后才能登录,登录之后,才能访问。

爬虫进进进阶策略: 图像识别,机器学习,识别验证码。不过这个应该比较难,或者说成本比较高。  

7.网站内容反爬

有一些网站将网站内容用只有人类可以接收的形式来呈现。比如将内容用图片的形式显示。这时候又得通过图像识别等方式啦,难度还是挺大的嘛!

总结:

不过怎么样,爬虫和反爬虫之间就是典型的攻防不同升级的斗争。

 

本文由9159.com发布于编程,转载请注明出处:反爬虫策略只是为了让爬虫更复杂,而Referer则存

关键词:

上一篇:没有了
下一篇:没有了