2023年6月29日发(作者:)
「数据分析」2种常见的反爬⾍策略,信息验证和动态反爬⾍©作者 | leo01 什么是爬⾍?爬⾍,见名知义,就好似⼀个探索的⼩机器⼈,模拟⼈的⾏为,扩散到⽹络的各个⾓落,按照⼀定的规则搜集整理数据,并且将他们反馈回来。这是⼀个很形象的⽅式来描述爬⾍的原理。技术⾓度,爬⾍主要是根据⼀定的程序规则或者技术指标,通过⽹络请求的⽅式来获取资源,然后对获取的资源通过⼀定的解析⼿段提取所要信息并存储的过程。02 为什么会产⽣反爬⾍?你见过的最变态的验证码是什么呢?是要考察⼩学数学的验证码,还是考察⼈⽂知识的验证码,现在越来越多的奇葩验证码的出现,在⼀定程度上给我们这些访客带来了很多不便,但是它们的出现真正的⽬的并不是给⽤户增加使⽤难度,⽽是为了防⽌⼤多数的⽆节制访问的爬⾍程序。爬⾍程序的访问速度和⽬的是很容易被发现与正常⽤户的区别的,⼤多数爬⾍具有⽆节制,⼤批量对访问⽬标进⾏爬取的⾏为,这些访问请求会对访问⽬标带来巨⼤的服务器压⼒和不必要的资源投⼊,因此常被运营者定义为‘垃圾流量’。因此,为了更好的维护⾃⾝的利益,营业者就会针对爬⾍的特点应⽤不同的⼿段来防⽌⼤批量爬⾍的访问。根据反爬的出发点,可以将反爬限制⼿段分为:• 主动型限制:开发者会通过技术⼿段主动的限制爬⾍的访问请求,如:验证请求头信息,限制同ip的重复访问,验证码技术等等• 被动型限制:开发者为了节省访问资源的同时也不降低⽤户体验,采⽤了间接的技术⼿段限制爬⾍访问的⽅法,如:⽹页动态加载,数据分段加载,⿏标悬停预览数据等等。• ⽽从具体的反爬⾍实现⼿段上来进⾏划分,则可⼤致分为:信息验证型反爬⾍,动态渲染型反爬⾍,⽂本混淆型反爬⾍,特征识别型反爬⾍。爬⾍与反爬⾍⽆异于⼀场攻防博弈,既有竞争关系,也有相互促进的可能。常见的反爬策略以及应对措施:信息校验型爬⾍:a. User-Agent发爬⾍:基本原理:能够向服务器端发送请求的客户端形式多种多样,既可以是不同型号的个⼈电脑,⼿机,平板电脑,编程程序,也可以是⽹络请求软件,那么服务器该如何识别这些不同的客户端呢?User-Agent便是这样⼀个⽤户发送请求时附带的请求信息的记录。它的主要格式包括如下⼏个部分:**浏览器标识(操作系统标识,加密等级标识;浏览器语⾔)渲染引擎标识 版本信息**例如:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)⽽User-Agent的反爬主要就是通过对User-Agent的头域值进⾏校验,如果存在⿊名单中的值,就会被服务器端封杀。⽽User-Agent的反爬主要就是通过对User-Agent的头域值进⾏校验,如果存在⿊名单中的值,就会被服务器端封杀。例如我们Python中常⽤的Requests库,如果在发送请求时不做Headers参数设置,则服务器读取User-Agent的值就是python-requests/2.21.0b. Cookies反爬⾍Cookies不仅能够⽤于存储Web⽤户的⾝份信息或者保持登录状态,此外也会被⽤作反爬⾍的识别信息。主要的原理是客户端访问服务器时,服务器会返回Set-Cookie头域,客户端会将该信息进⾏存储,再次进⾏访问服务器时会携带对应的Cookie信息,这时服务器端只要验证该Cookie是否符合规则就可以了,如果不符合,则会被重定向到其他页⾯,并在响应中添加Set-Cookie头域和Cookie值。以上验证Cookie的⽅法仅仅是⽐较简单的反爬机制,爬⾍⼯程师仅仅需要在浏览器的请求头中复制该Cookie即可轻松规避,这时Cookie验证常常要结合javascript⽂件,⽣成随机Cookie值进⾏校验:**Cookie名称+3位⼩于9的随机正整数+5位随机⼤写字母+6位⼩于9的正整数+3位随机⼤写字母**该机制还是有可以反复使⽤的可能性,即使加上Cookie过期时间也不能完全保证Cookie的复⽤,这时需要引⼊时间戳结合上述⽅法进⾏进⼀步判定,当Cookie值取出时的时间戳和当前时间戳进⾏差值计算,超过⼀定时间,就会被认定为伪造。c. 签名验证反爬⾍:主要原理时通过客户端⽣成的⼀些随机数和不可逆的MD5加密字符串,在发送请求时发送给服务器,服务器端使⽤相同⽅式进⾏随机值运算并做MD5加密,如果服务器端得到的MD5值和前端的MD5值相等,则表⽰请求正常,否则返回403.⽬前该反爬⾍⽅式⼴泛应⽤于各类⼤型⽹站,绕过它不仅需要从XHR信息中找到相关的请求信息,此外还要在Javacript代码中寻找加密的⽅式。动态渲染反爬⾍:动态⽹页往往是为了提升⽤户体验,节约资源消耗,提升响应速度⽽应⽤的技术,并⾮直接针对爬⾍程序来进⾏的反爬措施,但是在不经意间产⽣了反爬⾍的效果,爬⾍程序不具备页⾯渲染功能,⽽⼀旦遇到动态渲染页⾯,则不能完整的返回需要的信息。⽐如我们要爬取英雄联盟⾥⾯的英雄名称和下载对应图⽚时,按照原有的爬取⽅式,使⽤requests库来进⾏爬取,会发现获取的字段均为空值,这主要的原因是该⽹站使⽤了javacript动态加载技术,只有找到核⼼的js传输代码,才能找到对应信息。通过⽹页检查⼯具我们可以清晰的看到,hero_这个⽂件存储了所有的英雄信息,以及对应的英雄图⽚链接和详情页信息。那么我们在进⾏信息解析时,就需要针对该js⽂件进⾏。动态渲染的主要解决思路:动态渲染技术组合⾮常灵活,如果每次遇到这样的⽹站,我们都要去分析接⼝,参数和javascript代码逻辑,那么耗费的时间成本就会⾼很多。那么能够直接的提取渲染后的结果页⾯对于爬⾍分析就会简单很多,⽬前主要的渲染提取⼯具包括:Puppeter,Selenium,Splash。2.1 Selenium2.1 SeleniumSelenium是我们最为常⽤的⼀种解决动态渲染的技术。浏览器驱动是Selenium对浏览器发送指令或者传递渲染结果的主要⼯具。⽬前该驱动⼀般是通过下⾯⽹址下载的:我们通过简单的代码就可以实现对应信息的提取。from selenium import webdriverurl = '/course/network-security-course/'driver = ()res = (url)course = _element_by_css_selector('.clp-lead__title').e('n','')print(course)()2.2 Puppeter在使⽤Selenium进⾏数据爬取时,如果遇到⼤批量任务执⾏时,显然要花费较长时间,这时我们会引⼊异步加载提取数据的⽅法,那就是Puppeter⽅法,它是google开源的Node库,除了拥有⼀套⾼级的API来控制浏览器,还提供了很多替代⼿动执⾏的操作⽅法,最重要的是它还⽀持异步。import asynciofrom pyppeter import launchasync def main():browser = await launch()page = await e()await ('/course/network-security-course/')res = await ("//*[@class='clp-lead__title']")text = await(await res[0].getProperty('textContent')).jsonValue()print(text)await ()_event_loop().run_until_complete(main())2.3 分布式渲染服务SplashSplash应⽤于分布式爬取需求,假设我们要在更多个机器中运⾏爬⾍程序,还能否通过安装Puppeter和Selenium组件来完成呢?显然是否定的。Splash是⼀个异步的Js渲染服务,⾃带轻量级web浏览器,当我们将它部署在云端时,就可以通过同个API使多个爬⾍程序访问渲染的页⾯了。动态⽹页的⼴泛应⽤除了为了提⾼⽤户体验,也在⼀定程度限制了爬⾍程序的使⽤,⽽结合动态渲染技术进⾏页⾯解析解决了80%以上的复杂页⾯的爬取,但是效率却远不及直接解析javascript⽂件快速,⽽寻找⽹站⼊⼝、js⽂件的定位往往也会耗费⼤量的时间,因此具体的技术使⽤需要根据实际情况灵活使⽤。03 ⽂本混淆反爬⾍⽂本混淆可以有效的避免爬⾍获取Web应⽤中的⽂字数据,通过混淆⽂本信息来限制爬⾍获取数据的技术⼿段称为⽂本混淆反爬⾍。⽂本混淆反爬⾍的前提是不影响正常⽤户的使⽤体验,因此⽂本混淆不能直接的展现出来,所以开发者通常是利⽤CSS特性来实现混淆。常见的⽂本混淆⽅法包括:图⽚伪装、⽂字映射和⾃定义字体3.1 图⽚伪装该⽅法是使⽤图⽚来替换原有的⽂字信息,使得直接的⽂字提取⽅法失效。⽐如:电话
电话 |
发布者:admin,转转请注明出处:http://www.yc00.com/xiaochengxu/1687982083a63465.html
评论列表(0条)