网站地图 | RSS订阅 老铁博客 - 上海SEO优化|上海网站建设|蜘蛛池出租|站群代搭建
你的位置:首页 » 推广营销 » 正文

如果有人问你Python爬虫抓取技术的门道请叫他来看这篇文章

2019-8-8 2:5:33 | 作者:老铁SEO | 0个评论 | 人浏览

  web是一个开放的平台,这也奠定了web从90年代初诞生直至今日将近30年来蓬勃的发展。然而,正所谓成也萧何败也萧何,开放的特性、搜索引擎以及简单易学的html、css技术使得web成为了互联网领域里最为流行和成熟的信息传播媒介;但如今作为商业化软件,web这个平台上的内容信息的版权却毫无保证,因为相比软件客户端而言,你的网页中的内容可以被很低成本、很低的技术门槛实现出的一些抓取程序获取到,这也就是这一系列文章将要探讨的话题——

  有很多人认为web应当始终遵循开放的精神,呈现在页面中的信息应当毫无保留地分享给整个互联网。然而我认为,在IT行业发展至今天,web已经不再是当年那个和pdf一争高下的所谓“超文本”信息载体了,它已经是以一种轻量级客户端软件的意识形态的存在了。而商业软件发展到今天,web也不得不面对知识产权保护的问题,试想如果原创的高质量内容得不到保护,抄袭和盗版横行网络世界,这其实对web生态的良性发展是不利的,也很难鼓励更多的优质原创内容的生产。

  未授权的爬虫抓取程序是危害web原创内容生态的一大元凶,因此要保护网站的内容,首先就要考虑如何反爬虫。

  大家在学python的时候肯定会遇到很多难题,以及对于新技术的追求,这里推荐一下我们的Python学习扣qun:784758214,这里是python学习者聚集地!!同时,自己是一名高级python开发工程师,从基础的python脚本到web开发、爬虫、django、数据挖掘等,零基础到项目实战的资料都有整理。送给每一位python的小伙伴!每日分享一些学习的方法和需要注意的小细节

  最简单的爬虫,是几乎所有服务端、客户端编程语言都支持的http请求,只要向目标页面的url发起一个http get请求,即可获得到浏览器加载这个页面时的完整html文档,这被我们称之为“同步页”。

  作为防守的一方,服务端可以根据http请求头中的User-Agent来检查客户端是否是一个合法的浏览器程序,亦或是一个脚本编写的抓取程序,从而决定是否将真实的页面信息内容下发给你。

  这当然是最小儿科的防御手段,爬虫作为进攻的一方,完全可以伪造User-Agent字段,甚至,只要你愿意,http的get方法里, request header的Referrer、Cookie等等所有字段爬虫都可以轻而易举的伪造。

  此时服务端可以利用浏览器http头指纹,根据你声明的自己的浏览器厂商和版本(来自User-Agent),来鉴别你的http header中的各个字段是否符合该浏览器的特征,如不符合则作为爬虫程序对待。这个技术有一个典型的应用,就是PhantomJS1.x版本中,由于其底层调用了Qt框架的网络库,因此http头里有明显的Qt框架网络请求的特征,可以被服务端直接识别并拦截。

  除此之外,还有一种更加变态的服务端爬虫检测机制,就是对所有访问页面的http请求,在http response中种下一个cookie token,然后在这个页面内异步执行的一些ajax接口里去校验来访请求是否含有cookie token,将token回传回来则表明这是一个合法的浏览器来访,否则说明刚刚被下发了那个token的用户访问了页面html却没有访问html内执行js后调用的ajax请求,很有可能是一个爬虫程序。

  如果你不携带token直接访问一个接口,这也就意味着你没请求过html页面直接向本应由页面内ajax访问的接口发起了网络请求,这也显然证明了你是一个可疑的爬虫。知名电商网站Amazon就是采用的这种防御策略。

  现代浏览器赋予了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存在诸多问题,因为是单进程模型,没有必要的沙箱保护,浏览器内核的安全性较差。另外,该项目作者已经声明停止维护此项目了。

  Headless Chrome可谓是Headless Browser中独树一帜的大杀器,由于其自身就是一个chrome浏览器,因此支持各种新的css渲染特性和js运行时语法。

  基于这样的手段,爬虫作为进攻的一方可以绕过几乎所有服务端校验逻辑,但是这些爬虫在客户端的js运行时中依然存在着一些破绽,诸如:

  基于以上的一些浏览器特性的判断,基本可以通杀市面上大多数Headless Browser程序。在这一层面上,实际上是将网页抓取的门槛提高,要求编写爬虫程序的开发者不得不修改浏览器内核的C++代码,重新编译一个浏览器,并且,以上几点特征是对浏览器内核的改动其实并不小,如果你曾尝试过编译Blink内核或Gecko内核你会明白这对于一个“脚本小子”来说有多难~

  更进一步,我们还可以基于浏览器的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之后是不带函数名的,因此你需要在toString之后检查函数名是否为空。

  这个技巧有什么用呢?这里延伸一下,反抓取的防御者有一种Robot Detect的办法是在js运行时主动抛出一个alert,文案可以写一些与业务逻辑相关的,正常的用户点确定按钮时必定会有一个1s甚至更长的延时,由于浏览器里alert会阻塞js代码运行(实际上在v8里他会把这个isolate上下文以类似进程挂起的方式暂停执行),所以爬虫程序作为攻击者可以选择以上面的技巧在页面所有js运行以前预注入一段js代码,把alert、prompt、confirm等弹窗方法全部hook伪造。如果防御者在弹窗代码之前先检验下自己调用的alert方法还是不是原生的,这条路就被封死了。

  目前的反抓取、机器人检查手段,最可靠的还是验证码技术。但验证码并不意味着一定要强迫用户输入一连串字母数字,也有很多基于用户鼠标、触屏(移动端)等行为的行为验证技术,这其中最为成熟的当属Google reCAPTCHA,基于机器学习的方式对用户与爬虫进行区分。

  基于以上诸多对用户与爬虫的识别区分技术,网站的防御方最终要做的是封禁ip地址或是对这个ip的来访用户施以高强度的验证码策略。这样一来,进攻方不得不购买ip代理池来抓取网站信息内容,否则单个ip地址很容易被封导致无法抓取。抓取与反抓取的门槛被提高到了ip代理池经济费用的层面。

  除此之外,在爬虫抓取技术领域还有一个“白道”的手段,叫做robots协议。Allow和Disallow声明了对各个UA爬虫的抓取授权。

  不过,这只是一个君子协议,虽具有法律效益,但只能够限制那些商业搜索引擎的蜘蛛程序,你无法对那些“野爬爱好者”加以限制。

  默默在贵论坛潜水好久了,首先要感谢各位无私的分享,我深受益于社区伙伴们的技术博客,着实助我在初学道路上扫石除障了不少。monkey:2.gif 鄙人医药相关专业研一在读,数理功底本科阶段基本自废武功了论坛

  女神式大写悲伤……国外知名IT网站StackOverflow最近公布了《2019全球开发者调查》的结果。获得了一些意想不到的结果……1Java一降再降不再是最火语言(各语......博文来自:Python大本营的博客

  Python简直就是万能的,你用Python都做过哪些事?用网页看各大网站的VIP视频,用python下载?用Python玩跳一跳,跳到50000分?过年过节各大亲友群、红包群抢红包还用Python?...博文来自:weixin_34112900的博客

  如果做一个薪资水平的排行榜,程序员这个职位一定会榜上有名的。身边已经有不少程序员开始关注投资,有的咨询身边的人,有的开始到处听分享会,关注金融动态,加了一堆的金融销售微信......博文来自:Python中文社区

  本文首发于我的个人博客,同步发布于SegmentFault专栏,非商业转载请注明出处,商业转载请阅读原文链接里的法律声明。web是一个开放的平台,这也奠定了web从90年代初诞生直至今日将近30年来蓬...博文来自:weixin_34320159的博客

  前言提到ZooKeeper,相信大家都不会陌生。Dubbo,Kafka,Hadoop等等项目里都能看到它的影子。但是你真的了解ZooKeeper吗?如果面试官让你给他讲讲ZooKeeper是个什么东西...博文来自:weixin_33834137的博客

  1.背景在我们的业务需求中通常有需要一些唯一的ID,来记录我们某个数据的标识:某个用户的ID某个订单的单号某个信息的ID通常我们会调研各种各样的生成策略,根据不同的业务,采取最合适的策略,下面我会讨论...博文来自:weixin_34021089的博客

  想用Python做爬虫,而你却还不会Python的话,那么这些入门基础知识必不可少。很多小伙伴,特别是在学校的学生,接触到爬虫之后就感觉这个好厉害的样子,我要学。但是却完全不知道从何开始,很迷茫,学的...博文来自:Tips的博客

  Python爬虫和毛爷爷的关系:Python是最简单最流行的开发语言,毛爷爷是最招人喜欢的人民币。如果你学会了Python爬虫,就可以挣更多的毛爷爷。 大家发现没有,实际上Python早已经火起来了,...博文来自:jthnfldx的专栏

  Python简直就是万能的,你用Python都做过哪些事?用网页看各大网站的VIP视频,用python下载?用Python玩跳一跳,跳到50000分?过年过节各大亲友群、......博文来自:Python之禅

  导读  爬虫现在越来越火,随之带来的就是一大波的就业岗位,随之越来越多的人转行学习Python,其中不缺乏Java等语言程序员,难道,爬虫在未来会狠狠的压住其他语言,而一直蝉联冠军吗?什么是爬虫?  ...博文来自:的博客

  最近几年软件开发的从业人员还真不是一般的多,当然做程序员的我们工资也很难提高。先说说我自己吧,毕业后前面几年也没多少努力,公司也没找好,一直是下游的工资收入,只能养活自己。那时候只会做delphi(稍论坛

  面试问你:谈谈什么是JAVA,那你就这么回答JAVA的特点JVAVA之所以被广泛应用在企业中,无外乎他所具有的6个特点:1.平台无关行我们编写一段JAVA程序后,通过javac命令编译,得到了一份CL...博文来自:的博客

  现在Python非常的热门,之前在一个公众号的启发下,萌发了学习爬虫的兴趣,之前自学过Python的一点基础,所以经过几天的折腾终于弄出了一个小小的案例—用BeautifulSoup爬取了自己博客一些...博文来自:DonLex 的博客

  有群友问过,是什么原因使我开始写技术公众号,又是什么动力让我坚持写的。在我看来,写作是一件不能敷衍的事,通过写作来学习,反而要比单纯地学习的效果要好。为了写成一篇“拿得出手”的文章,我要反复查找资料,...博文来自:weixin_33966365的博客

  八戒推荐一老男孩Linux高薪运维23期完整版●●●经常面试别人,也被别人面试的人来答。下面的主要内容是授人以渔,务虚。伸手党请退散,面试初级职位的恐怕也没用。简而言之,尊重自己的权利,尊重面试官的感...博文来自:weixin_34049948的博客

  在《深入理解Java虚拟机》中,有这样一段话:synchronized关键字在需要原子性、可见性和有序性这三种特性的时候都可以作为其中一种解决方案,看起来是“万能”的。的确,大部分并发控制操作都能使用...博文来自:weixin_34280237的博客

  天下熙熙,皆为利来;天下攘攘,皆为利往。司马迁一言说透了社会最重要的形态,赚钱。赚钱,是币圈熙熙攘攘的首要和必要条件。昨天,我们说了区块链项目中的赚钱门道,今天我们再来聊聊区块链世界的更大、更多的赚钱...博文来自:三方流通平台

  客户端管理器客户端管理器是处理客户端通信的。客户端可以是一个(网站)服务器或者一个最终用户或最终应用。客户端管理器通过一系列知名的API(JDBC,ODBC,OLE-DB…)提供不同的方式来访问数据库...博文来自:zhangcanyan的博客

  如果你一直想学Python,但是不知道如何入手,那就别犹豫了。这篇文章就是

  如果你一直想学Python,但是不知道如何入手,那就别犹豫了。这篇文章就是

  如果你一直想学Python,但是不知道如何入手,那就别犹豫了。这篇文章就是

  如果你一直想学Python,但是不知道如何入手,那就别犹豫了。这篇文章就是

  如果你一直想学Python,但是不知道如何入手,那就别犹豫了。这篇文章就是

  Python基础 如果你一直想学Python,但是不知道如何入手,那就别犹豫了。这篇文章就是

  1.女孩子并不在乎你有没有钱,她在乎的是你会不会发奋努力改变现状;     2.女孩子并不在乎与你生活在一起会遇到困难,她在乎的是你会不会迎难而上,不逃避;     3.女孩子并不在乎你长得有多帅,她...博文来自:张淑程 专栏

  yo简评:MarcCenedella是Ladders的创始人,今年,他要求他那些来自哈佛商学院的同学们更新一些面试问题列表,这些最佳面试问题的目的是为了提供给你容易问,并且能得到有分量的答案。面试实际...博文来自:weixin_33805743的博客

  找了大概一个多月的工作了,手头现在有满意的offer了,可以开始总结自己面试过程中遇到的一些问题及自己是怎么回答的,给即将要面试或是将来要面试的同学们一些参考吧。这篇主要说说在面试官面完自己后,自己有...博文来自:smileiam的专栏

  统计一篇文章中每个单词的个数 小程序 源代码 很好用。 界面清秀柔和。

  产品的视角++从热闹到门道(完整版).pdf 目录 · · · · · · 推荐 自序 第1章互联网需要产品经理 001 第1节 ▎互联网:钱多,人少,速来! 001 第2节 ▎互联网在中国:草根的崛起 010 第3节 ▎20年的BA...

  这篇文章介绍了vfp数据技术的基本概念,对学习的vfp的很有帮助,请大家下载

  该方法是依赖于urllib2库来完成的,首先你需要安装好你的python环境,然后安装urllib2库程序的起始方法(返回值是公众号文章列表):defopenUrl():print(启动爬...博文来自:max_wcsdn的博客

  模块安装这里涉及到的模块,没有安装的可以自己安装pipinstallxxx实现目的通过搜狗搜素相关关键词的微信文章,通过解析,提取相关信息,保存到mongdb数据库中源码importrequestsf...博文来自:jia666666的博客

  近日登陆CSDN发现了好多博客都是未经我同意私自转载我的博客,不留署名信息的;有的是直接全文复制;有的是直接把我的github的文件下载下来放到了CSDN让别人用积分下载;有的是直接写的原创。下面就简...博文来自:lzw的专栏

  1、要么喜欢一个能给你带来力量好像信念一般存在的人,要么找到一个能让你为之努力的梦想。重要的是你会因为这些东西而切实的努力,在跌倒的时候也能找到勇气和力量;重要的是那些会让你真正的行动起来,把你的生活...博文来自:一棵不断成长的小白菜

  wangjianan168:单步调试都可以,插入图片,插入到mongodb里面,到dashboard里面点击run按钮就没有任何结果。知道原因么?

  weixin_45366905:现在在慢慢学习中,才刚刚开始学习lunix的基础命令行,不知道啥时候才能开扒

  • 本文来自: 老铁博客,转载请保留出处!欢迎发表您的评论
  • 相关标签:反爬虫技术  
  • 已有0位网友发表了一针见血的评论,你还等什么?

    必填

    选填

    记住我,下次回复时不用重新输入个人信息

    必填,不填不让过哦,嘻嘻。

    ◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。