python爬虫技术难点_爬虫技术的门道,这篇文章总结的最全

python爬虫技术难点_爬虫技术的门道,这篇文章总结的最全

2023年6月29日发(作者:)

python爬⾍技术难点_爬⾍技术的门道,这篇⽂章总结的最全Web是⼀个开放的平台,这也奠定了Web从90年代初诞⽣直⾄今⽇将近30年来蓬勃的发展。然⽽,正所谓成也萧何败也萧何,开放的特型、搜索引擎以及简单易学的HTML、CSS技术使得Web成为了互联⽹领域⾥最为流⾏和成熟的信息传播媒介;但如今作为商业化软件,Web这个平台上的内容信息的版权却毫⽆保证,因为相⽐软件客户端⽽⾔,你的⽹页中的内容可以被很低成本、很低的技术门槛实现出的⼀些抓取程序获取到,这也就是这⼀系列⽂章将要探讨的话题—— ⽹络爬⾍。有很多⼈认为Web应当始终遵循开放的精神,呈现在页⾯中的信息应当毫⽆保留地分享给整个互联⽹。然⽽我认为,在IT⾏业发展⾄今天,Web已经不再是当年那个和PDF⼀争⾼下的所谓 “超⽂本”信息载体 了,它已经是以⼀种 轻量级客户端软件 的意识形态的存在了。⽽商业软件发展到今天,Web也不得不⾯对知识产权保护的问题,试想如果原创的⾼质量内容得不到保护,抄袭和盗版横⾏⽹络世界,这其实对Web⽣态的良性发展是不利的,也很难⿎励更多的优质原创内容的⽣产。未授权的爬⾍抓取程序是危害Web原创内容⽣态的⼀⼤元凶,因此要保护⽹站的内容,⾸先就要考虑如何反爬⾍。从爬⾍的攻防⾓度来讲最简单的爬⾍,是⼏乎所有服务端、客户端编程语⾔都⽀持的http请求,只要向⽬标页⾯的url发起⼀个http get请求,即可获得到浏览器加载这个页⾯时的完整html⽂档,这被我们称之为“同步页”。作为防守的⼀⽅,服务端可以根据http请求头中的User-Agent来检查客户端是否是⼀个合法的浏览器程序,亦或是⼀个脚本编写的抓取程序,从⽽决定是否将真实的页⾯信息内容下发给你。这当然是最⼩⼉科的防御⼿段,爬⾍作为进攻的⼀⽅,完全可以伪造User-Agent字段,甚⾄,只要你愿意,http的get⽅法⾥, requestheader的 Referrer 、 Cookie 等等所有字段爬⾍都可以轻⽽易举的伪造。此时服务端可以利⽤浏览器http头指纹,根据你声明的⾃⼰的浏览器⼚商和版本(来⾃ User-Agent ),来鉴别你的http header中的各个字段是否符合该浏览器的特征,如不符合则作为爬⾍程序对待。这个技术有⼀个典型的应⽤,就是 PhantomJS 1.x版本中,由于其底层调⽤了Qt框架的⽹络库,因此http头⾥有明显的Qt框架⽹络请求的特征,可以被服务端直接识别并拦截。除此之外,还有⼀种更加变态的服务端爬⾍检测机制,就是对所有访问页⾯的http请求,在 http response 中种下⼀个 cookie token ,然后在这个页⾯内异步执⾏的⼀些ajax接⼝⾥去校验来访请求是否含有cookie token,将token回传回来则表明这是⼀个合法的浏览器来访,否则说明刚刚被下发了那个token的⽤户访问了页⾯html却没有访问html内执⾏js后调⽤的ajax请求,很有可能是⼀个爬⾍程序。如果你不携带token直接访问⼀个接⼝,这也就意味着你没请求过html页⾯直接向本应由页⾯内ajax访问的接⼝发起了⽹络请求,这也显然证明了你是⼀个可疑的爬⾍。知名电商⽹站amazon就是采⽤的这种防御策略。以上则是基于服务端校验爬⾍程序,可以玩出的⼀些套路⼿段。基于客户端js运⾏时的检测现代浏览器赋予了JavaScript强⼤的能⼒,因此我们可以把页⾯的所有核⼼内容都做成js异步请求 ajax 获取数据后渲染在页⾯中的,这显然提⾼了爬⾍抓取内容的门槛。依靠这种⽅式,我们把对抓取与反抓取的对抗战场从服务端转移到了客户端浏览器中的js运⾏时,接下来说⼀说结合客户端js运⾏时的爬⾍抓取技术。刚刚谈到的各种服务端校验,对于普通的python、java语⾔编写的http抓取程序⽽⾔,具有⼀定的技术门槛,毕竟⼀个web应⽤对于未授权抓取者⽽⾔是⿊盒的,很多东西需要⼀点⼀点去尝试,⽽花费⼤量⼈⼒物⼒开发好的⼀套抓取程序,web站作为防守⼀⽅只要轻易调整⼀些策略,攻击者就需要再次花费同等的时间去修改爬⾍抓取逻辑。此时就需要使⽤headless browser了,这是什么技术呢?其实说⽩了就是,让程序可以操作浏览器去访问⽹页,这样编写爬⾍的⼈可以通过调⽤浏览器暴露出来给程序调⽤的api去实现复杂的抓取业务逻辑。其实近年来这已经不算是什么新鲜的技术了,从前有基于webkit内核的PhantomJS,基于Firefox浏览器内核的SlimerJS,甚⾄基于IE内核的trifleJS,有兴趣可以看看这⾥和这⾥ 是两个headless browser的收集列表。这些headless browser程序实现的原理其实是把开源的⼀些浏览器内核C++代码加以改造和封装,实现⼀个简易的⽆GUI界⾯渲染的browser程序。但这些项⽬普遍存在的问题是,由于他们的代码基于fork官⽅webkit等内核的某⼀个版本的主⼲代码,因此⽆法跟进⼀些最新的css属性和js语法,并且存在⼀些兼容性的问题,不如真正的release版GUI浏览器。这其中最为成熟、使⽤率最⾼的应该当属 PhantonJS 了,对这种爬⾍的识别我之前曾写过⼀篇博客,这⾥不再赘述。PhantomJS存在诸多问题,因为是单进程模型,没有必要的沙箱保护,浏览器内核的安全性较差。如今Google Chrome团队在chrome 59 release版本中开放了headless mode api,并开源了⼀个基于调⽤的headlesschromium dirver库,我也为这个库贡献了⼀个centos环境的部署依赖安装列表。headless chrome可谓是headless browser中独树⼀帜的⼤杀器,由于其⾃⾝就是⼀个chrome浏览器,因此⽀持各种新的css渲染特性和js运⾏时语法。基于这样的⼿段,爬⾍作为进攻的⼀⽅可以绕过⼏乎所有服务端校验逻辑,但是这些爬⾍在客户端的js运⾏时中依然存在着⼀些破绽,诸如:基于plugin对象的检查基于language的检查基于webgl的检查基于浏览器hairline特性的检查基于错误img src属性⽣成的img对象的检查基于以上的⼀些浏览器特性的判断,基本可以通杀市⾯上⼤多数 headless browser 程序。在这⼀点上,实际上是将⽹页抓取的门槛提⾼,要求编写爬⾍程序的开发者不得不修改浏览器内核的C++代码,重新编译⼀个浏览器,并且,以上⼏点特征是对浏览器内核的改动其实并不⼩。更进⼀步,我们还可以基于浏览器的 UserAgent 字段描述的浏览器品牌、版本型号信息,对js运⾏时、DOM和BOM的各个原⽣对象的属性及⽅法进⾏检验,观察其特征是否符合该版本的浏览器所应具备的特征。这种⽅式被称为 浏览器指纹检查 技术,依托于⼤型web站对各型号浏览器api信息的收集。⽽作为编写爬⾍程序的进攻⼀⽅,则可以在headless browser 运⾏时⾥预注⼊⼀些js逻辑,伪造浏览器的特征。另外,在研究浏览器端利⽤js api进⾏ robots browser detect 时,我们发现了⼀个有趣的⼩技巧,你可以把⼀个预注⼊的js函数,伪装成⼀个native function,来看看下⾯代码:爬⾍进攻⽅可能会预注⼊⼀些js⽅法,把原⽣的⼀些api外⾯包装⼀层proxy function作为hook,然后再⽤这个假的js api去覆盖原⽣api。如果防御者在对此做检查判断时是基于把函数toString之后对[native code]的检查,那么就会被绕过。所以需要更严格的检查,因为bind(null)伪造的⽅法,在toString之后是不带函数名的。反爬⾍的银弹⽬前的反抓取、机器⼈检查⼿段,最可靠的还是验证码技术。但验证码并不意味着⼀定要强迫⽤户输⼊⼀连串字母数字,也有很多基于⽤户⿏标、触屏(移动端)等⾏为的⾏为验证技术,这其中最为成熟的当属Google reCAPTCHA。基于以上诸多对⽤户与爬⾍的识别区分技术,⽹站的防御⽅最终要做的是封禁ip地址或是对这个ip的来访⽤户施以⾼强度的验证码策略。这样⼀来,进攻⽅不得不购买ip代理池来抓取⽹站信息内容,否则单个ip地址很容易被封导致⽆法抓取。抓取与反抓取的门槛被提⾼到了ip代理池经济费⽤的层⾯。机器⼈协议除此之外,在爬⾍抓取技术领域还有⼀个“⽩道”的⼿段,叫做robots协议。你可以在⼀个⽹站的根⽬录下访问/,⽐如让我们⼀起来看看github的机器⼈协议,Allow和Disallow声明了对各个UA爬⾍的抓取授权。不过,这只是⼀个君⼦协议,虽具有法律效益,但只能够限制那些商业搜索引擎的蜘蛛程序,你⽆法对那些“野爬爱好者”加以限制。写在最后对⽹页内容的抓取与反制,注定是⼀个魔⾼⼀尺道⾼⼀丈的猫⿏游戏,你永远不可能以某⼀种技术彻底封死爬⾍程序的路,你能做的只是提⾼攻击者的抓取成本,并对于未授权的抓取⾏为做到较为精确的获悉。这篇⽂章中提到的对于验证码的攻防其实也是⼀个较为复杂的技术难点,在此留⼀个悬念,感兴趣可以加关注期待后续⽂章进⾏详细阐述。另外,欢迎对抓取⽅⾯感兴趣的朋友关注我的⼀个开源项⽬webster, 项⽬以 结合Chrome headless模式实现了⼀个⾼可⽤性⽹络爬⾍抓取框架,借以chrome对页⾯的渲染能⼒, 可以抓取⼀个页⾯中 所有的js及ajax渲染的异步内容;并结合redis实现了⼀个任务队列,使得爬⾍程序可以⽅便的进⾏横向、纵向的分布式扩展。你想更深⼊了解学习Python知识体系,你可以看⼀下我们花费了⼀个多⽉整理了上百⼩时的⼏百个知识点体系内容:

发布者:admin,转转请注明出处:http://www.yc00.com/web/1687981965a63449.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信