python系列之反爬虫介绍

2019-09-12 10:52发布


python系列之

反爬虫介绍


作者 · 前言

   Hello!我是高清?高倾?高king?Goking?

   前面推文都在介绍爬虫。既然有爬虫,那么就会有反爬虫。所以今天主要介绍反爬虫,以及简单了解一下反反爬虫。



    我们前面一直在介绍爬虫。爬虫最喜欢的网站就是那种静态的网页,需要的数据都放在网页的源码中。“乖乖地就躺在那里一动不动让你随便***”,试问谁不喜欢呢?另外爬虫还喜欢有条理有规则的网站,可以有理可依,有据可循。要是在垃圾堆里找东西,又试问谁喜欢呢?

    但是“理想很丰满,现实很骨感”。由于爬虫的本质就是“抓取”第二方网站中有价值的数据。因此,每个网站都会或多或少地采用一些反爬虫技术来防范爬虫。比如前面介绍的使用 JavaScript 动态加载资源或是通过 User-Agent 请求头验证是否为浏览器等,这些都是常见的反爬虫手段。




                  为什么有反爬虫?

1

保护某些重要数据

    我们知道爬虫的目的是为了获取网络资源。爬虫的本质就是抓取网站中有价值的数据;另外量变产生质变,当数据达到一定的量,我们就可以通过分析数据进而得到一些有用的结果。

    那么反爬虫的其中一个目的是为了保护某些数据不被过分地获取,保证数据在服务方的控制范围内使用。比如百度地图APP的热力图功能,可以统计某个地区的人流量。由于爬虫是对网页进行爬取的,为了防止爬虫,网页版的百度地图并不开放热力图统计这个功能。所以对于百度地图的热力图我们是不能直接爬取的。包括后面url破解的反爬也是出于这个目的。


2

防止服务器过载

我们知道我们平时所有接触到的网络服务背后都是有服务器在为我们提供服务的。而服务器的搭建是需要成本的,所以服务器的配置是有限的,也就是说服务器的负载能力也是有限的。

    所以反爬虫的第二个目的为了保护服务器。我们知道爬虫的效率很高,但这个对于服务器来说并不是一个好事。如果爬虫在短时间内频繁地访问服务器,一旦超过了服务器的负载将会造成服务器崩溃。比如我们应该都经历过微博因为某条热点新闻(18年的冯绍峰赵丽颖结婚等)导致微博刷新不了,功能无***常使用。就是因为短时间内服务器被人们频繁地访问,超出了服务器的负载,从而服务器崩溃,导致了互联网瘫痪。

反爬虫与反反爬虫

反爬虫原理

    前面推文介绍爬虫的时候,我们讲到爬虫的优点:高效自动。那么识别爬虫最简单的方法就是抓住爬虫的特点:机器的高效性和自动性。关键是区分出是机器行为还是人的行为就可以了。比如人为地同时打开多个网页,再怎么快都需要点好几下,而爬虫不需要一秒,就可以完成同时打开多个网页;另外人在访问网页的时候会附带很多补充的东西,比如加载用户的配置,而爬虫为确保高效则会尽可能地省略这些操作。

常规反爬虫操作

  前面网络爬虫系列二中提到的JS动态加载就是一种常见反爬虫策略,当然还有一些常见的反爬虫操作:

1)IP 地址验证/限制访问频率。

有些网站会使用 IP 地址验证进行反爬虫处理,程序会检查客户端的 IP 地址,当同一个 IP 地址、同一个客户端访问目标网站过于频繁时(正常用户的访问速度没那么快),其很可能会被当成机器程序(比如爬虫)禁止访问。

2)限制访问次数。

有些网站会设置用户的每日访问次数,一般人为地进行访问次数是不会太多。但是爬虫访问网站速度很快且不停地工作,因此次数自然是不会少的。当达到一定次数后将爬虫在当天无法继续正常工作。比如微信小程序宜出行就限制了用户每天的访问次数。

3)图形验证码。

有些网站为了防止机器程序访问,会做一些很“***”的设计,它会记录同一个客户端、同一个IP地址的访问次数,只要达到一定的访问次数(不管你是正常用户,还是机器程序),目标网站就会弹出一个图形验证码让你输入,只有成功输入了图形验证码才能继续访问。比如我们登录QQ或访问其他网站经常遇到的各种图形验证码验证。

4)User-Agent 请求头验证。

我们在系列一讲到的requests,在访问网站的时候一般都是没有加headers的,有些网站就会通过分析请求头来判断是爬虫还是浏览器访问网站。

    反爬虫类似的操作还有很多,常规的反爬虫一般都有对应的解决方法。还有一类比较常见和麻烦的反爬就是通过加密算法来对数据进行保护。当然还有一些不常见的比较特殊的反爬虫。


下面给大家看一个我在做url视频破解时候遇到的一个比较***的反爬虫:

    这个url视频破解网站源码很短,基本采用了JS动态加载的方式。对于该问题,我们在系列二(链接)中介绍了selenium和用浏览器的开发者工具“抓包”的两种方法来解决JS动态加载。

    但是只要我们用selenium+chrome进行爬取,视频就会一直处于加载的状态,网页服务器一直不响应。我尝试过给自动启动的chrome浏览器加载用户配置,但是无效。该网站服务器有识别selenium+chrome爬虫的其他方法,只要检测到是浏览器自动驱动就不加载视频资源。

那我们换另外一个方法:开发者工具来抓包试试:

    这时候我们会发现:该为了保护自己的视频资源,怕服务器地址被发现,视频资源链接被随意爬取甚至连浏览器开发者工具都禁用。只要启动了浏览器的开发者工具网站就会停止加载视频并且发出警告。

反反爬虫

   前面讲到反爬虫的关键就是通过一些技术手段区分出机器和人。那么反反爬虫的原理也可以说是尽可能伪装成人去访问网站。

   在系列二中我们介绍了selenium+chrome和开发者工具“抓包”,就是属于反反爬虫的策略。

    除此之外还有:

1)requests头文件添加。

针对网站服务器会验证请求头来判断是否是爬虫(爬虫一般没有请求头或请求头不会添加用户信息)通过添加用户的请求头信息来伪装成用户访问。

2)selenium添加用户配置。

针对网站会验证浏览器的用户信息来判断其是否是自动启动的浏览器,通过给浏览器自动启动加载用户配置来伪装成用户启动浏览器。

3)设置ip池。

针对IP 地址验证/限制访问频率,可以通过设置ip池,不断切换ip地址对同一网站进行爬取。

4)切换不同账号爬取。

针对账户每日访问次数有限的限制,可以通过申请多个账号轮流爬取解决。

5)破解js加密。

针对js算法加密的数据,最直接的方法就是分析源码找出加密算法的原理,再来解密。也可以不分析,通过开发者工具抓包,绕过加密解密,尝试看看能不能直接获取到想要的资源。

6)设置爬取速度。

针对爬虫访问网站速度过快,过于频繁被封,可以适当降低爬虫的速度,设置爬取时间间隔。

7)当然还有一些不常见的反爬虫就要特殊问题特殊处理。


反反爬虫补充

1)Requests访问加入头文件

    首先我们在网页中通过浏览器开发者工具找到requests需要访问的url的请求,然后再在url请求的headers中找到user-agent。

    然后把上面找到的user-agent复制,再在requests访问的时候加上文件该文件头,如下图所示:

2)selenium启动加载用户配置:

https://blog.csdn.net/zhusongziye/article/details/79636567

3)Scrapy是用python写的一个爬虫框架,当然如果只是写一些简单爬虫,python自己就有做爬虫的库,scrapy只是更加流水线化。Scrapy是一个比较成熟的爬虫框架,所以scrapy本身自带了一些常见的反反爬虫的插件供用户使用。

下面补充两个scrapy反反爬虫的使用介绍:

https://blog.csdn.net/it_arookie/article/details/83188512

http://c.biancheng.net/view/2762.html



体会与总结

        1

    网络的普遍化使得网络数据的总量越来越庞大,已经无法单靠人手动去处理,爬虫的出现解决了这一难题。爬虫的存在确实对于现在这个信息***,大数据的时代来说,既适应了这个时代,又起到了推动的作用。但是“科学是把***剑”,凡事都有两面性促使了反爬虫的出现。

    不少网站为了防止恶意爬虫,都会有反爬虫策略,比如熟悉的知乎,淘宝等网站首当其冲的当属铁路12306当然“良计,我有墙梯,也存在对抗反爬虫的技术——反反爬虫。反反爬虫,甚至反反反爬虫的出现也正应验了“科技总是在对抗中不断进步”那句话。不过部署反爬虫需要额外的成本开销,对服务器本身也是额外的负担,所以一般大型的网站都不会过分地部署反爬。

    爬虫->反爬虫->反反爬虫->爬虫->...,这个循环是不会结束的。就如学无止境,我们仍需要不断地学习,不断地总结,不断地提升。




    到这里本次推文就结束啦~

    本篇推文着重介绍爬虫进阶路上的宿敌——反爬虫以及简单介绍了对抗反爬虫的反反爬虫。相信通过本推文,你又进一步加深了对爬虫这个概念的了解。

    随着爬虫的深入,相信你也会慢慢接触到上面提到的反爬虫操作,甚至也会跟我一样遇到一些很奇葩的反爬虫操作,届时希望你能够不吝赐教,把你解决的反爬虫也记录下来跟我们一起分享。

    希望能给你带来一点帮助~

    如果觉得这篇推文对你有帮助或者有什么建议以及想要交流的,不妨在公众号窗口输入“5@”+“内容”告诉我。

    最后再次感谢能看到这里的您~

学委我本人

    先定个小目标:

毕业前敲它个十万行代码







登录 后发表评论
0条评论
还没有人评论过~