爬虫抓取网页数据(Python爬虫的抓取技术大盘点-抓取爬虫技术篇)

优采云 发布时间: 2022-01-09 03:24

  爬虫抓取网页数据(Python爬虫的抓取技术大盘点-抓取爬虫技术篇)

  网络爬虫一直是讨论的热门话题。了解Python爬虫技术更受欢迎,学习Python爬虫可以更好地了解如何应对网络危害。未经授权的爬虫爬取程序是危害web原创内容生态的一大罪魁祸首,所以要保护网站的内容,首先要考虑如何防范爬虫。接下来,IT培训网将为大家盘点一下Python爬虫的一些爬取技术。

  

  Python爬虫爬取技术盘点

  1、从爬虫攻防的角度看

  最简单的爬虫是几乎所有服务器端和客户端编程语言都支持的 http 请求。只要对目标页面的url进行http get请求,就可以获得浏览器加载页面时的完整html文档。我们称之为“同步页面”。作为防御方,服务器可以根据http请求头中的User-Agent检查客户端是合法的浏览器程序还是脚本爬虫,从而决定是否使用真实的页面信息内容发送给你。

  这当然是最小的小儿防御方法。作为进攻方,爬虫完全可以伪造User-Agent字段。甚至,只要你愿意,在http的get方法中,请求头的Referrer、Cookie等所有字段都可以被爬虫轻松处理。伪造。这时,服务器就可以根据你声明的浏览器厂商和版本(来自User-Agent),使用浏览器的http头指纹来识别你http头中的每个字段是否符合浏览器的特性。如果匹配,它将被视为爬虫。该技术的一个典型应用是在 PhantomJS 1.x 版本中,由于底层调用了 Qt 框架的网络库,http 头具有明显的 Qt 框架的网络请求特征,可以直接被服务器识别。并被拦截。

  另外还有一个比较异常的服务端爬虫检测机制,就是在http响应中种一个cookie token,让所有http请求访问页面,然后在这个异步执行的一些ajax接口上学页。检查访问请求中是否收录cookie token,返回token表示这是一次合法的浏览器访问,否则表示刚刚发出token的用户访问了页面html但没有访问执行js后调用的ajax在 html 请求中,很可能是爬虫。

  如果直接访问一个没有token的接口,说明你没有请求过html页面,而是直接向页面中应该通过ajax访问的接口发起网络请求,这显然证明了你是一个可疑的爬虫。知名电子商务公司网站亚马逊采用了这种防御策略。

  以上是基于服务器端验证爬虫程序可以玩的一些套路。

  2、基于客户端js运行时检测

  现代浏览器赋予 JavaScript 强大的能力,所以我们可以将页面的所有核心内容作为 js 异步请求 ajax 获取数据然后渲染到页面中,这显然提高了爬取内容的门槛。这样,我们就将爬虫和反爬的战斗从服务端转移到了客户端浏览器中的js运行时。接下来说一下结合客户端js运行时的爬取技术。

  刚才提到的各种服务器端验证,对于普通的python和java语言编写的HTTP爬虫程序,都有一定的技术门槛。毕竟,Web 应用程序是未经授权的抓取工具的黑匣子。很多东西都需要一点一点的去尝试,而一套耗费大量人力物力开发的爬虫程序,只要网站作为防御者可以轻松调整一些策略,攻击者也需要花费同样的时间再次修改爬虫的爬取逻辑。此时,您需要使用无头浏览器。这是什么技术?其实说白了就是程序可以操作浏览器访问网页,这样写爬虫的人就可以通过调用浏览器暴露给程序的API来实现复杂性。获取业务逻辑。

  近年来,这并不是一项新技术。曾经有基于webkit内核的PhantomJS,基于火狐浏览器内核的SlimerJS,甚至还有基于IE内核的trifleJS。如果你有兴趣,可以看看这里,这里是两个无头浏览器列表的集合。这些无头浏览器程序的原理其实就是对一些开源的浏览器内核C++代码进行改造和封装,实现一个简单的浏览器程序,无需GUI界面渲染。但是这些项目的通病是因为他们的代码是基于fork官方webkit和其他内核的某个版本的trunk代码,所以跟不上一些最新的css属性和js语法,还有一些兼容性问题,不如真实的GUI浏览器发行版运行稳定。

  其中,最成熟、用得最多的应该是PhantonJS。之前写过一篇关于这种爬虫识别的博客,这里不再赘述。PhantomJS 有很多问题,因为它是单进程模型,没有必要的沙箱保护,浏览器内核的安全性较差。此外,该项目的作者已经宣布他们将停止维护这个项目。Headless Chrome 可以说是 Headless Browser 中独一无二的杀手锏。由于它本身就是一个 chrome 浏览器,它支持各种新的 CSS 渲染特性和 js 运行时语法。基于这种方法,爬虫作为攻击方可以绕过几乎所有的服务器端验证逻辑,但是这些爬虫在客户端js运行时还是存在一些缺陷,比如:

  基于插件对象的检查

  if(navigator.plugins.length === 0) { console.log('可能是 Chrome 无头'); }

  基于语言的检查

  if(navigator.languages=== '') { console.log('Chrome headless detected'); }

  基于以上一些浏览器特性的判断,它基本上可以秒杀市面上大部分的Headless Browser程序。在这个层面上,网页爬虫的门槛其实是提高了,要求编写爬虫程序的开发者不得不修改浏览器内核的C++代码,重新编译一个浏览器,而以上特性对浏览器来说是很重要的。内核的改动其实不小,如果你尝试过编译Blink内核或者Gecko内核你就会明白对于一个“脚本小子”来说是多么的难了~

  进一步,我们还可以根据浏览器的UserAgent字段中描述的浏览器品牌、版本、型号信息,检查js运行时、DOM和BOM的各个native对象的属性和方法,观察特征是否符合浏览器这个版本。设备应具备的功能。这种方法称为浏览器指纹识别技术,它依赖于大型网站对各类浏览器的api信息的采集。作为编写爬虫程序的攻击者,你可以在无头浏览器运行时预先注入一些js逻辑来伪造浏览器的特性。

  爬虫攻击者可能会预先注入一些js方法,用一层代理函数作为钩子包裹一些原生api,然后用这个假的js api覆盖原生api。如果防御者在函数 toString 之后基于对 [native code] 的检查来检查这一点,它将被绕过。所以需要更严格的检查,因为bind(null) fake方法在toString之后没有函数名,所以需要检查toString之后的函数名是否为空。

  这种技术有什么用?在这里延伸一下,反爬虫防御者有一个Robot Detect方法,就是在js运行的时候主动抛出一个alert。文案可以写一些业务逻辑相关的,普通用户点击OK按钮肯定会有1s甚至更长的延迟,因为浏览器中的alert会阻塞js代码运行(其实在v8中他会暂停以类似于进程挂起的方式执行隔离上下文),因此爬虫程序作为攻击者可以选择使用上述技术在页面上的所有js运行之前预先注入一段js代码,并伪造所有的提示、提示、确认等弹出方式。如果防御者在弹出代码之前检查他调用的alert方法是否仍然是原生的,则这种方式被阻止。

  3、反爬虫银弹

  目前最可靠的反爬虫和机器人巡检手段是验证码技术。但是,验证码并不意味着必须强制用户输入一系列字母和数字。还有很多基于用户鼠标、触摸屏(移动端)等行为的行为验证技术。其中,最成熟的是基于机器学习的谷歌reCAPTCHA。区分用户和爬虫。

  基于以上对用户和爬虫的识别和区分技术,网站的防御者需要做的就是封锁IP地址或者对该IP的访问用户施加高强度的验证码策略。这样攻击者就不得不购买IP代理池来捕获网站信息内容,否则单个IP地址很容易被封杀,无法被捕获。爬取和反爬取的门槛已经提升到IP代理池的经济成本水平。

  4、机器人协议

  此外,在爬虫爬取技术领域,还有一种叫做robots协议的“白道”方式。Allow 和 Disallow 声明每个 UA 爬虫的爬取授权。然而,这只是君子之约。虽然它有法律上的好处,但它只能限制那些商业搜索引擎的蜘蛛程序,你不能限制那些“野爬爱好者”。

  总之,Python爬虫对网页内容的爬取与对策,注定是一场一只脚一只脚的猫捉老鼠游戏。你永远不可能用某种技术完全挡住爬虫的去路。唯一的事情是增加攻击者的捕获成本,并更准确地了解未经授权的捕获行为。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线