排名轻松seo 网站,微软做网站的工具,广告公司宣传语,广告平台对接一、什么是反爬虫
网络爬虫#xff0c;是一个自动提取网页的程序#xff0c;它为搜索引擎从万维网上下载网页#xff0c;是搜索引擎的重要组成。但是当网络爬虫被滥用后#xff0c;互联网上就出现太多同质的东西#xff0c;原创得不到保护。于是#xff0c;很多网站开始…一、什么是反爬虫
网络爬虫是一个自动提取网页的程序它为搜索引擎从万维网上下载网页是搜索引擎的重要组成。但是当网络爬虫被滥用后互联网上就出现太多同质的东西原创得不到保护。于是很多网站开始反网络爬虫,想方设法保护自己的内容。 他们根据ip访问频率浏览网页速度账户登录输入验证码flash封装ajax混淆js加密图片css混淆等五花八门的技术来对反网络爬虫。 防的一方不惜工本迫使抓的一方在考虑成本效益后放弃,抓的一方不惜工本防的一方在考虑用户流失后放弃.
二、反爬虫的原因
1. 爬虫占总PVPV是指页面的访问次数每打开或刷新一次页面就算做一个pv比例较高服务器的压力上升能力下降。
2018年2月24日晚卓见云某客户网站公网出流量突然爆发性增长导致带宽被占满事故发现后紧急提升了SLB的带宽但提升后的带宽仍然被流量占满原带宽15M提升至35M。由于事故发生在非黄金访问时段正常流量不会这么大加上其他现象怀疑是遭到了网络攻击。 再比如某节某动为了快速发展搜索业务派出爬虫四处暴力抓取网站内容部分配置较低的网站已经直接瘫痪给中小网站主们造成了很大的损失和困扰严重影响了网站正常的用户访问。 某中小网站今年7月份他突然发现公司的网站经常性打不开网页加载极其缓慢有时甚至直接瘫痪。经过一系列排查后在服务器日志上发现了bytespider爬虫的痕迹。该爬虫抓取的频率每天达几百万次高则上千万次服务器带宽负载飙至100%而且该爬虫在抓取时完全不遵守网站的robots协议。 有小网站主抱怨表示某节某动的爬虫“一上午对网站发出46万次请求”网站都瘫痪了度娘也没有这么折腾的
可能原因分析
1商业对手出于竞争需要采用爬虫获取信息。
2 搜素引擎抽风。
3“三月份爬虫”应届毕业生为交论文常在这个时间点在网上爬取数据此类爬虫通常简单粗暴不管服务器压力。
4近期做的推广活动带来访问压力增加。
2. 公司可免费查询的资源被批量抓走丧失竞争力。
数据可以在非登录状态下直接被查询比如下方的招聘信息 也有网站想获取信息必须强制登陆如果没有登陆是看不到任何信息的。但是如果不强制对方登录争对手可以轻松批量抓到更多的信息企业的竞争力就会大大减少。 3. 状告爬虫成功的几率小
爬虫在国内还是个擦边球就是有可能可以起诉成功也可能完全无效。近期引发关注的是淘宝被非法爬取案件这是成功的案例还有很多没有成功的案例。 所以还是需要用技术手段来做最后的保障。
三、反什么样的爬虫
新手兴趣爱好者或者是应届毕业生
新手兴趣爱好者、应届毕业生的爬虫通常简单粗暴根本不管服务器压力加上人数不可预测很容易把站点弄挂。
创业小公司
现在的创业公司越来越多觉得大数据比较热就开始做大数据。发现自己手头没有数据。怎么办只能通过写爬虫获取更多的数据。于是就有了不计其数的小爬虫出于公司生死存亡的考虑不断爬取数据维持公司的生计。
失控小爬虫
有些网站已经做了相应的反爬但是爬虫依然孜孜不倦地爬取。虽然他们根本爬不到任何数据或者一切数据都是不对的可是爬虫依然不停止。 这个很可能就是一些托管在某些服务器上的小爬虫已经无人认领了依然在辛勤地工作着。
成型的商业对手
这个是最大的对手他们有技术有钱要什么有什么如果和你死磕你就只能硬着头皮和他死磕。否则法律手段解决。
抽风的搜索引擎
大家不要以为搜索引擎都是好人他们也有抽风的时候而且一抽风就会导致服务器性能下降请求量跟网络攻击没什么区别。
四、常见的反扒手段
反扒的手段基本是基于以下三种
基于身份识别进行反爬 基于爬虫行为进行反爬 基于数据加密进行反爬
身份识别的反爬
1. 通过headers字段来反扒
headers知识补充
host提供了主机名及端口号 Referer 提供给服务器客户端从那个页面链接过来的信息有些网站会据此来反爬 OriginOrigin字段里只包含是谁发起的请求并没有其他信息.(仅存于post请求) User agent: 发送请求的应用程序名一些网站会根据UA访问的频率间隔时间进行反爬 proxies代理一些网站会根据ip访问的频率次数等选择封ip. cookie特定的标记信息一般可以直接复制对于一些变化的可以选择构造.
2. 通过请求参数来反爬 常见的有
1 通过headers中的User-Agent字段来反爬、通过referer字段或者是其他字段来反爬。如果Python写的爬虫不加入User-Agent在后台服务器是可以看到服务器的类型pySpider。
2 通过cookie限制抓取信息比如我们模拟登陆之后想拿到登陆之后某页面信息千万不要以为模拟登陆之后就所有页面都可以抓了有时候还需要请求一些中间页面拿到特定cookie然后才可以抓到我们需要的页面。
3最为经典的反爬虫策略当属“验证码”了。最普通的是文字验证码因为是图片用户登录时只需输入一次便可录成功而我们程序抓取数据过程中需要不断的登录手动输入验证码是不现实的所以验证码的出现难倒了一大批人。当然还有滑块的点触的的比如12306的点触验证等。 4另一种比较常见的反爬虫模式当属采用JS渲染页面了。就是返回的页面并不是直接请求得到而是有一部分由JS操作DOM得到所以那部分数据我们也拿不到咯。
基于爬虫行为进行反爬
1基于请求频率或总请求数量的反扒这是一种比较恶心又比较常见的反爬虫策略当属封ip和封账号当你抓取频率过快时ip或者账号被检测出异常会被封禁。被封的结果就是浏览器都无法登陆了但是换成ip代理就没有问题。 爬虫如何避免被封IP呢
降低访问频率 反爬虫一般是在规定时间内IP访问次数进行的限制可以限制每天抓取的页面数量和时间间隔。既能满足采集速度也能不被限制IP。 2.多线程采集 采集大批量的数据的时候可以使用多线程。它可以同步完成多项任务每个线程采集不同的任务提高采集数量。 3.使用代理IP 想要突破网站的反爬虫机制需要使用代理IP通过换IP的方法进行多次访问。采用多线程采集时也需要大量的IP优先使用高匿名代理否则目标网站检测到你的真实IP也会影响到工作的进行。 4.对IP进行伪装 虽然大多网站都有反爬虫但有一些网站对这方便比较忽略这样就可以对IP进行伪装修改X-Forwarded-for就可以避过。但如果想频发抓取还是需要多IP。
( 2 ) 通过js实现跳转来反爬js实现页面跳转无法在源码中获取下一页url需要多次抓包获取条状url分析规律。
( 3 )通过蜜罐(陷阱)获取爬虫ip(或者代理ip)进行反爬。蜜罐的原理在爬虫获取链接进行请求的过程中爬虫会根据正则xpathcss等方式进行后续链接的提取此时服务器端可以设置一个陷阱url会被提取规则获取但是正常用户无法获取这样就能有效的区分爬虫和正常用户
( 4 )通过假数据反爬向返回的响应中添加假数据污染数据库通常假数据不会被正常用户看到。
基于数据加密进行反爬
( 1 )对响应中含有的数据进行特殊化处理
通常的特殊化处理主要指的就是css数据偏移/自定义字体/数据加密/数据图片/特殊编码格式等 根据css你会发现他们用了一个字体打开你就发现了一件事
正常字体是0123456789在去哪儿官方的字体里被替换成了图片里的
另外还有这种情况的字体反爬 (2) 有一些网站的内容由前端的JS动态生成由于呈现在网页上的内容是由JS生成而来我们能够在浏览器上看得到但是在HTML源码中却发现不了。这就需要解析关键js获得数据生成流程模拟生成数据。一般获取的数据是通过AJAX获取的返回的结果是Json然后解析Json获取数据。
(3) 通过编码格式进行反爬不适用默认编码格式在获取响应之后通常爬虫使用utf-8格式进行解码此时解码结果将会是乱码或者报错。解决思路根据源码进行多格式解码或者真正的解码格式
五、知己知彼编写爬虫
简单爬虫
要想做反爬虫我们首先需要知道如何写个简单的爬虫。
通常编写爬虫需要经过这么几个过程
分析页面请求格式 创建合适的http请求 批量发送http请求获取数据 举个例子直接查看携程生产url。在详情页点击“确定”按钮会加载价格。假设价格是你想要的那么抓出网络请求之后哪个请求才是你想要的结果呢你只需要用根据网络传输数据量进行倒序排列即可。因为其他的迷惑性的url再多再复杂开发人员也不会舍得加数据量给他。 代码
import requestsdef download_page(url):headers{User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.80 Safari/537.36}data requests.get(url,headersheaders)return dataif __name__ __main__:url https://m.ctrip.com/restapi/soa2/21881/json/HotelSearch?testab5b9a651b08c1069815c5af78f8b2bf6df9dd42a6129be5784bb096315494619adownload_page(url)高级爬虫
那么爬虫进阶应该如何做呢通常所谓的进阶有以下几种
1.分布式爬虫
Python默认情况下我们使用scrapy框架进行爬虫时使用的是单机爬虫就是说它只能在一台电脑上运行因为爬虫调度器当中的队列queue去重和set集合都只能在本机上创建的其他电脑无法访问另外一台电脑上的内存和内容。
分布式爬虫实现了多台电脑使用一个共同的爬虫程序它可以同时将爬虫任务部署到多台电脑上运行这样可以提高爬虫速度实现分布式爬虫。首先就需要配置安装redis和scrapy-redis而scrapy-redis是一个基于redis数据库的scrapy组件它提供了四种组件通过它可以快速实现简单分布式爬虫程序。
四种scrapy-redis组件
1.Scheduler调度Scrapy改造了python本来的collection.deque(双向队列)形成了自己Scrapy queue而scrapy-redis 的解决是把这个Scrapy queue换成redis数据库从同一个redis-server存放要爬取的request便能让多个spider去同一个数据库里读取。Scheduler负责对新的request进行入列操作加入Scrapy queue取出下一个要爬取的request从Scrapy queue中取出等操作。 2. Duplication Filter去重Scrapy中用集合实现这个request去重功能Scrapy中把已经发送的request指纹放入到一个集合中把下一个request的指纹拿到集合中比对如果该指纹存在于集合中说明这个request发送过了如果没有则继续操作。 3. Item Pipline管道引擎将(Spider返回的)爬取到的Item给Item Pipelinescrapy-redis 的Item Pipeline将爬取到的 Item 存⼊redis的 items queue 。 4. Base Spider爬虫不再使用scrapy原有的Spider类重写的RedisSpider继承了Spider和RedisMixin这两个类RedisMixin是用来从redis读取url的类。
工作原理 1)首先Slaver端从Master端拿任务Request、url进行数据抓取Slaver抓取数据的同时产生新任务的Request便提交给 Master 处理
2)Master端只有一个Redis数据库负责将未处理的Request去重和任务分配将处理后的Request加入待爬队列并且存储爬取的数据。
2. 模拟JavaScript
模拟javascript抓取动态网页是进阶技巧。但是其实这只是个很简单的功能。因为如果对方没有反爬虫你完全可以直接抓ajax本身而无需关心js怎么处理的。如果对方有反爬虫那么javascript必然十分复杂重点在于分析而不仅仅是简单的模拟。
3. PhantomJs或者selenium
以上的用来做自动测试的结果因为效果很好很多人拿来做爬虫。但是这个东西有个硬伤就是效率。占用资源比较多但是爬取效果很好。
六、总结
越是低级的爬虫越容易被封锁但是性能好成本低。越是高级的爬虫越难被封锁但是性能低成本也越高。
当成本高到一定程度我们就可以无需再对爬虫进行封锁。经济学上有个词叫边际效应。付出成本高到一定程度收益就不是很多了。
关于Python的技术储备
在这里给大家分享一些免费的课程供大家学习下面是课程里面的截图扫描最下方的二维码就能全部领取。
1.Python所有方向的学习路线 2.学习软件
工欲善其事必先利其器。学习Python常用的开发软件都在这里了给大家节省了很多时间。
3.学习资料 4.实战资料
实践是检验真理的唯一标准。这里的压缩包可以让你再闲暇之余帮你提升你的个人能力。
5.视频课程 好啦今天的分享就到这里结束了快乐的时光总是短暂呢想学习更多课程的小伙伴不要着急有更多惊喜哦~