最全的反爬⾍技术
反爬⾍的技术⼤概分为四个种类:
注:⽂末有福利!
传统反爬⾍⼿段
1、后台对访问进⾏统计,如果单个IP访问超过阈值,予以封锁。
这个虽然效果还不错,但是其实有两个缺陷,⼀个是⾮常容易误伤普通⽤户,另⼀个就是,IP其实不值钱,⼏⼗块钱甚⾄有可能买到⼏⼗万个IP。所以总体来说是⽐较亏的。不过针对三⽉份呢爬⾍,这点还是⾮常有⽤的。
2、后台对访问进⾏统计,如果单个session访问超过阈值,予以封锁。
这个看起来更⾼级了⼀些,但是其实效果更差,因为session完全不值钱,重新申请⼀个就可以了。
3、后台对访问进⾏统计,如果单个userAgent访问超过阈值,予以封锁。
这个是⼤招,类似于抗⽣素之类的,效果出奇的好,但是杀伤⼒过⼤,误伤⾮常严重,使⽤的时候要⾮
常⼩⼼。⾄今为⽌我们也就只短暂封杀过mac下的⽕狐。
4、以上的组合
⼀、通过User-Agent来控制访问:
⽆论是浏览器还是爬⾍程序,在向服务器发起⽹络请求的时候,都会发过去⼀个头⽂件:headers,⽐如知乎的requests headers:
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,/;q=0.8
Accept-Encoding:gzip, deflate, sdch, br
Accept-Language:zh-CN,zh;q=0.8,en;q=0.6,zh-TW;q=0.4,da;q=0.2,la;q=0.2
Cache-Control:max-age=0
Connection:keep-alive
Cookie: **********
Host:zhuanlan.zhihu
Referer:Ehco - 知乎
Upgrade-Insecure-Requests:1
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36 Query String Parameters
view source
view URL encoded
这⾥⾯的⼤多的数的字段都是浏览
这⾥⾯的⼤多数的字段都是浏览器向服务器”表明⾝份“⽤的
对于爬⾍程序来说,最需要注意的字段就是:User-Agent
很多⽹站都会建⽴ user-agent⽩名单,只有属于正常范围的user-agent才能够正常访问。
⽐如知乎:
import bs4
import random
def get_html(url):
try:
r = (url, timeout=30)
r.raise_for_status
except:
return "Someting Wrong!"
print(get_html('zhuanlan.zhihu'))
# OUT:
'''
<html><body><h1>500 Server Error</h1>
An internal server error occured.
</body></html>
'''
可以看到,这⾥的请求被拒绝了,并且返回了⼀个500的错误码:
这⾥就是因为requests库本⾝的headers是这样的:
{'Date': 'Tue, 09 May 2017 12:13:00 GMT', 'Content-Type': 'text/html', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'Set-Cookie': 'aliyungf_tc=AQAAAPDDXQnf6AEAHaBXcP1tHo5z1uta; Path=/; HttpOnly, acw_tc=AQAAAAM
89GeptQMAHaBXcJiyTK3l8c5g; Path=/; HttpOnly', 'Cache-Control': 'no-cache'}
这⾥⾯并没有user-agent字段,⾃然不被知乎的服务器所接受了。
解决⽅法:
可以⾃⼰设置⼀下user-agent,或者更好的是,可以从⼀系列的user-agent⾥随机挑出⼀个符合标准的使⽤,代码如下:
'''
模拟header的user-agent字段,
返回⼀个随机的user-agent字典类型的键值对
'''
agents = ['Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0;',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv,2.0.1) Gecko/20100101 Firefox/4.0.1',
'Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; en) Presto/2.8.131 Version/11.11',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11',
'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; 360SE)']
fakeheader = {}
fakeheader['User-agent'] = agents[random.randint(0, len(agents))]
return fakeheader
# 注意看新的请求函数:
def get_html(url):
try:
r = (url, timeout=30,headers=get_agent())
r.raise_for_status
return r.status_code
except:
return "Someting Wrong!"
'''
OUT:
200
'''
⼆、通过IP限制来反爬⾍:
如果⼀个固定的ip在短暂的时间内,快速⼤量的访问⼀个⽹站,那⾃然会引起注意,管理员可以通过⼀些⼿段把这个ip给封了,爬⾍程序⾃然也就做不了什么了。
解决⽅法:
⽐较成熟的⽅式是:IP代理池
简单的说,就是通过ip代理,从不同的ip进⾏访问,这样就不会被封掉ip了。
可是ip代理的获取本⾝就是⼀个很⿇烦的事情,⽹上有免费和付费的,但是质量都层次不齐。如果是企业⾥需要的话,可以通过⾃⼰购买集云服务来⾃建代理池。
这⾥实现了⼀个简单的代理转换,代码如下:
def get_proxy():
'''
简答模拟代理池
返回⼀个字典类型的键值对,
'''
proxy = ["116.211.143.11:80",
"183.1.86.235:8118",
"183.32.88.244:808",
"121.40.42.35:9999",
"222.94.148.210:808"]
fakepxs = {}
fakepxs['http'] = proxy[random.randint(0, len(proxy))]
return fakepxs
三、通过JS脚本来防⽌爬⾍:
这个可以说是终极的办法了,因为,爬⾍终归只是⼀段程序,它并不能像⼈⼀样去应对各种变化,如验证码,滑动解锁之类的。
举个例⼦:如果想爬取某个⽹站,但是在进⼊⽹站之前,它会有⼀个验证页⾯来验证你是不是机器。
它是怎么验证的呢:
他会通过js代码⽣成⼀⼤段随机的数字,然后要求浏览器通过js的运算得出这⼀串数字的和,再返回给服务器.
可想⽽知,这么简单和最基础的⼀个验证步骤,会是写的代码完成不了的。
解决⽅法:
这⾥就要请出⼀个⼤杀器:”PhantomJS“
PhantomJS是⼀个Python包,他可以在没有图形界⾯的情况下,完全模拟⼀个”浏览器“,js脚本验证什么的再也不是问题了。
四、通过来限制爬⾍:
世界上做爬⾍最⼤最好的就是Google了,搜索引擎本⾝就是⼀个超级⼤的爬⾍,Google开发出来爬⾍24h不间断的在⽹上爬取着新的信息,并返回给数据库,但是这些搜索引擎的爬⾍都遵守着⼀个协议:
<(统⼀⼩写)是⼀种存放于⽹站根⽬录下的ASCII编码的⽂本⽂件,它通常告诉⽹络搜索引擎的漫游器(⼜称⽹络蜘蛛),此⽹站中的哪些内容是不应被搜索引擎的漫游器获取的,哪些是可以被漫游器获取的。因为⼀些系统中的URL是⼤⼩写敏感的,所以的⽂件名应统⼀为⼩写。应放置于⽹站的根⽬录下。如果想单独定义搜索引擎的漫游器访问⼦⽬录时的⾏为,那么可以将⾃定的设置合并到根⽬录下的,或者使⽤robots元数据(Metadata,⼜称元数据)。
<协议并不是⼀个规范,⽽只是约定俗成的,所以并不能保证⽹站的隐私。注意是⽤
字符串⽐较来确定是否获取URL,所以⽬录末尾有与没有斜杠“/”表⽰的是不同的URL。允许使⽤类似"Disallow: *.gif"这样的通配符[1][2]。
wiki上说的已经很清楚了,这实际上只是⼀个”君⼦协议“,遵守与否,都在于爬⾍的编写者。
来看⼀下京东的'':
User-agent: *
Disallow: /?*
Disallow: /pop/*.html
Disallow: /pinpai/*.html?*
User-agent: EtaoSpider
Disallow: /
User-agent: HuihuiSpider
Disallow: /
User-agent: GwdangSpider
Disallow: /
User-agent: WochachaSpider
Disallow: /
可以看到,京东的robots协议⾥明确的指出四个”user-agent”是禁⽌访问的,
恶性爬⾍。
事实上,这四个user-agent也是四个臭名昭著的恶性爬⾍。
爬虫可以干什么遵守这个规则!,互联⽹上的很多资源都是免费的,但是如果因为个⼈的利益,⽽损害到别⼈,这是很不对的!
所以最好遵守这个规则!
当然有种情况是例外的,⽐如说我们爬⾍的获取⽹页的速度,和⼈类浏览⽹页是差不多的,这并不会给服务器造成太⼤的性能损失,在这种情况下,我们是可以不⽤恪守 robots协议的。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论