最全反爬虫技术介绍
2018-04-01 17:22
399 查看
反爬虫 的技术大概分为四个种类: 注:文末有福利!
对于爬虫程序来说,最需要注意的字段就是:User-Agent
很多网站都会建立 user-agent白名单,只有属于正常范围的user-agent才能够正常访问。比如知乎:
这里就是因为requests库本身的headers是这样的:
简单的说,就是通过ip代理,从不同的ip进行访问,这样就不会被封掉ip了。
可是ip代理的获取本身就是一个很麻烦的事情,网上有免费和付费的,但是质量都层次不齐。如果是企业里需要的话,可以通过自己购买集群云服务来自建代理池。这里实现了一个简单的代理转换,代码如下:
举个例子:如果想爬取某个网站,但是在进入网站之前,它会有一个验证页面来验证你是不是机器。
它是怎么验证的呢:他会通过js代码生成一大段随机的数字,然后要求浏览器通过js的运算得出这一串数字的和,再返回给服务器.可想而知,这么简单和最基础的一个验证步骤,会是写的代码完成不了的。解决方法:
这里就要请出一个大杀器:”PhantomJS“PhantomJS是一个Python包,他可以在没有图形界面的情况下,完全模拟一个”浏览器“,js脚本验证什么的再也不是问题了。
robots.txt协议并不是一个规范,而只是约定俗成的,所以并不能保证网站的隐私。注意robots.txt是用字符串比较来确定是否获取URL,所以目录末尾有与没有斜杠“/”表示的是不同的URL。robots.txt允许使用类似"Disallow: *.gif"这样的通配符[1][2]。wiki上说的已经很清楚了,这实际上只是一个”君子协议“,遵守与否,都在于爬虫的编写者。来看一下京东的'robots.txt':
事实上,这四个user-agent也是四个臭名昭著的恶性爬虫。所以最好遵守这个规则!,互联网上的很多资源都是免费的,但是如果因为个人的利益,而损害到别人,这是很不对的!当然有种情况是例外的,比如说我们爬虫的获取网页的速度,和人类浏览网页是差不多的,这并不会给服务器造成太大的性能损失,在这种情况下,我们是可以不用恪守 robots协议的。 最后,给大家推荐一个良心公众号【IT资源社】:本公众号致力于免费分享全网最优秀的视频资源,学习资料,面试经验等,前端,PHP,JAVA,算法,Python,大数据等等,你想要的这都有IT资源社-QQ交流群:601357554微信搜索公众号:ITziyuanshe 或者扫描下方二维码直接关注,
里面基本什么资料都有,基础到进阶到项目实战,如果觉得不够还可以加群跟群主要,最重要的是全部免费!
一、通过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:http://zhuanlan.zhihu.com 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 requests import bs4 import random def get_html(url): try: r = requests.get(url, timeout=30) r.raise_for_status r.encoding = r.apparent_encoding return r.text except: return "Someting Wrong!" print(get_html('https://zhuanlan.zhihu.com')) # 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里随机挑出一个符合标准的使用,代码如下:
def get_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 = requests.get(url, timeout=30,headers=get_agent()) r.raise_for_status r.encoding = r.apparent_encoding return r.status_code except: return "Someting Wrong!" ''' OUT: 200 '''
二、通过IP限制来反爬虫:
如果一个固定的ip在短暂的时间内,快速大量的访问一个网站,那自然会引起注意,管理员可以通过一些手段把这个ip给封了,爬虫程序自然也就做不了什么了。解决方法:比较成熟的方式是:IP代理池简单的说,就是通过ip代理,从不同的ip进行访问,这样就不会被封掉ip了。
可是ip代理的获取本身就是一个很麻烦的事情,网上有免费和付费的,但是质量都层次不齐。如果是企业里需要的话,可以通过自己购买集群云服务来自建代理池。这里实现了一个简单的代理转换,代码如下:
def get_proxy(): ''' 简答模拟代理池 返回一个字典类型的键值对, ''' proxy = ["http://116.211.143.11:80", "http://183.1.86.235:8118", "http://183.32.88.244:808", "http://121.40.42.35:9999", "http://222.94.148.210:808"] fakepxs = {} fakepxs['http'] = proxy[random.randint(0, len(proxy))] return fakepxs
三、通过JS脚本来防止爬虫:
这个可以说是终极的办法了,因为,爬虫终归只是一段程序,它并不能像人一样去应对各种变化,如验证码,滑动解锁之类的。举个例子:如果想爬取某个网站,但是在进入网站之前,它会有一个验证页面来验证你是不是机器。
它是怎么验证的呢:他会通过js代码生成一大段随机的数字,然后要求浏览器通过js的运算得出这一串数字的和,再返回给服务器.可想而知,这么简单和最基础的一个验证步骤,会是写的代码完成不了的。解决方法:
这里就要请出一个大杀器:”PhantomJS“PhantomJS是一个Python包,他可以在没有图形界面的情况下,完全模拟一个”浏览器“,js脚本验证什么的再也不是问题了。
四、通过robots.txt来限制爬虫:
世界上做爬虫最大最好的就是Google了,搜索引擎本身就是一个超级大的爬虫,Google开发出来爬虫24h不间断的在网上爬取着新的信息,并返回给数据库,但是这些搜索引擎的爬虫都遵守着一个协议:robots.txtrobots.txt(统一小写)是一种存放于网站根目录下的ASCII编码的文本文件,它通常告诉网络搜索引擎的漫游器(又称网络蜘蛛),此网站中的哪些内容是不应被搜索引擎的漫游器获取的,哪些是可以被漫游器获取的。因为一些系统中的URL是大小写敏感的,所以robots.txt的文件名应统一为小写。robots.txt应放置于网站的根目录下。如果想单独定义搜索引擎的漫游器访问子目录时的行为,那么可以将自定的设置合并到根目录下的robots.txt,或者使用robots元数据(Metadata,又称元数据)。robots.txt协议并不是一个规范,而只是约定俗成的,所以并不能保证网站的隐私。注意robots.txt是用字符串比较来确定是否获取URL,所以目录末尾有与没有斜杠“/”表示的是不同的URL。robots.txt允许使用类似"Disallow: *.gif"这样的通配符[1][2]。wiki上说的已经很清楚了,这实际上只是一个”君子协议“,遵守与否,都在于爬虫的编写者。来看一下京东的'robots.txt':
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协议的。 最后,给大家推荐一个良心公众号【IT资源社】:本公众号致力于免费分享全网最优秀的视频资源,学习资料,面试经验等,前端,PHP,JAVA,算法,Python,大数据等等,你想要的这都有IT资源社-QQ交流群:601357554微信搜索公众号:ITziyuanshe 或者扫描下方二维码直接关注,
里面基本什么资料都有,基础到进阶到项目实战,如果觉得不够还可以加群跟群主要,最重要的是全部免费!
相关文章推荐
- 最全反爬虫技术介绍
- 最全反爬虫技术介绍
- 介绍最全的LVS负载均衡技术
- 爬虫技术的门道,这篇文章总结的最全
- PHP爬虫最全总结2-phpQuery,PHPcrawer,snoopy框架中文介绍
- 分布式网络爬虫关键技术分析与实现一网络爬虫相关知识介绍
- PHP爬虫最全总结2-phpQuery,PHPcrawer,snoopy框架中文介绍
- 网络爬虫技术介绍
- 223_尚学堂_高淇_java300集最全视频教程_JVM核心机制_线程上下文类加载器_web服务器类加载机制_OSGI技术模块开发原理介绍
- 简单反爬虫技术介绍
- 消息队列MQ技术的介绍和原理
- 最全iOS数据存储方法介绍:FMDB,SQLite3 ,Core Data,Plist,Preference偏好设置,NSKeyedArchiver归档
- IGMP Snooping技术介绍
- 《海量日志数据分析与应用》场景介绍及技术点分析
- 简单介绍区块链技术
- GPU加速原理&技术介绍
- .net知识系列之四:(Page类介绍,Page的生命周期,IsPostBack属性,ClientScriptManager类,回调技术(CallBack)
- 财华股王finet技术介绍
- 细说Servlet 会话技术介绍
- 最全的机器学习中的优化算法介绍