在爬虫开发中,大家可以很轻易地 bypass 所谓的 UA 限制,甚至用 scrapy 框架轻易实现按照深度进行爬行。但是实际上,这些并不够。关于爬虫的基础知识比如数据处理与数据存储多线程之类的

  在爬虫开发中,大家可以很轻易地bypass所谓的UA限制,甚至用scrapy框架轻易实现按照深度进行爬行。但是实际上,这些并不够。关于爬虫的基础知识比如数据处理与数据存储多线程之类的。

  请大家移步FB:

  该系列文章都是本人所写,能力有限请多包涵。

  0x01前言

  在进行爬虫开发的过程中,我们会遇到很多的棘手的问题,当然对于普通的问题比如UA等修改的问题,我们并不在讨论范围,既然要将修养,自然不能说这些完全没有意思的小问题。

  0x02Selenium+PhantomJS

  这个东西算是老生长谈的问题吧,基本我在问身边的朋友们的时候,他们都能讲出这条解决方案:

  Selenium+PhantomJS(FirefoxChrome之类的)

  但是真正的有实践过的人,是不会把这个东西投入生产环境的,首先最大的问题就是Selenium+PhantomJS非常的慢,这种慢的原因就是因为他要加载这个网页所有的内容,比如图片资源,link中的CSS,JS都会加载,而且还会渲染整个网页,在渲染结束之后才会允许你操作网页的元素。当然可能会有读者问,Selenium作为可以自动化编写测试脚本的一个模块,他是自带HOOK功能的,在SeleniumAPI中也有介绍说Selenium可以控制等待某一个元素加载成功时返回页面数据。

  没错的确是这样的,我们确实可以使用Selenium的内置api作浏览器完成各种各样的操作,比如模拟点击,模拟填表,甚至执行js,但是最大的问题我们还是没有解决:归根结底是操作浏览器来进行工作的,启动需要打开浏览器(等待一定时间),访问网页之后渲染,下载相应资源,执行JS,这么多的步骤,每一个步骤都需要或多或少的等待时间,这就好比,我们就是在使用浏览器做这样的事情,只不过是加上了精准的鼠标定位而已。

  当然说了这么多,Selenium虽然不适合做生产解决方案,也并不是没有别的解决办法了。

  0x03execjs

  execjs是一个在Python中执行js的模块,听到这个,大家可能会觉得耳目一新:欸?那我是不是可以爬虫爬下来js代码然后手动控制js执行,然后就可以控制自己想要的元素,拿到想要的结果,而且也并不丢失效率。

  但是我要说这样的想法,实际上是非常的naive,虽然有了这个js引擎,但是,我们需要很多很多的轮子,为什么呢?来听我一步一步解释:

  1.js的强大之处其实并不在于松散的语法与容错,而是在于对BOM对象和DOM对象的操作。举个例子来说,比如,一个网页的表单,是通过操作执行js来提交的。那么,问题就在于你有办法仅仅用这个execjs来执行这段js来提交表单么?显然,这是行不通的。为什么呢?因为对于我们来说的话execjs是一个独立的模块,我们没有办法把我们静态扒下来的html文档和execjs建立联系。

  2.如果非要建立联系,那么你需要自己完成jshtmlDOM对象的绑定,具体怎么完成呢?js在浏览器中怎么与DOM树绑定,你就需要怎么去做。但是要怎么做啊,首先你需要一个自己构建DOM树,然后才能进行手动绑定。这个轮子,确实是非常的大。

  但是如果你真的有大把的时间,那么应该怎么去做这个事情呢?没错要不你去HOOK一个webkit要不你去自己构建一个html的解析器。那么我就在这里稍微提一下这个很有趣的事情:如果构建一个HTML解析器:

  最近有用PLY写过一个Lexer当时准备做个解析DOM树的HTML解析器,自己实践第一步也是觉得这个东西理论上是完全可行的,但是能不能完成就要看个人毅力和你个人的编程能力了。

  0x04Ghost

  关于Ghost的话,其实我个人是比较推崇的,但是其实他也并不是特别完美,它对我来说,更像是一个SeleniumPhantomJS的结,怎么说呢,实际上ghost这个模块用的是QT中的webkit,在安装的时候就得被迫安装pyside或者pyqt4,实际上我当时还是很难理解为什么一个这个东西没有图形界面要使用qtpyside这种东西作为引擎呢?单独构造一个浏览器引擎真的就这么困难么?其实装好了也没什么关系,毕竟我觉得还是要比SeleniumPhantomJS好用的。

  话说回来,我们就来讨论一下这个Ghost的一些问题。

  首先,使用Ghost的一个好处是我们并不需要再将一个binary的浏览器放在路径下了,以至于我们不需要去花费时间打开浏览器了,因为ghost就是一个功能完全的Python实现(借助qt的webkit)的轻量级没有图形化的浏览器。

  而且,ghost在初始化的时候,有一个选项可以不下载图片,但是没有办法阻止它下载jscss,其实这个也是可以原谅的,毕竟自己在使用的时候,也是需要自己去下载js在本地筛选。

  于此同时ghost还是提供了相应的API这些APIseleniumAPI功能基本差别不是特别大,也会有处理表单,执行ajax去加载动态页面,这样来说ghost是一个完美的解决方案么?

  其实还是有他自己的缺点的,就是我们还是不能完全控制每一个过程,比如我们如果只想让它解析DOM树,不动态执行js脚本,而且,我想获取他的DOM树手动进行一些操作。这些都是没有办法的。但是也并不是完全没有办法,比如国内某厂他们就做了HOOK了一个浏览器去检测XSS这个思路我们可以在以后的文章中提出,具体的操作的话,这就要看大家的编程功底了。

  0x05原理总结

  当然,懂得归纳的读者其实早就已经看出来了,对动态网页(通过js加载)的网页的信息采集,主要分成三种方案:

  1.基于实体浏览器操作解决方案(适用于测试环境不适用于大量信息采集)。

  2.基于深度控制JS脚本执行的解决方案(速度最快,编写难度最大)。

  3.基于webkit的解决方案。(相对较为折衷)

  本文转自:i春秋社区

  原文地址:http://bbs.ichunqiu.com/thread-11098-1-1.html?from=jbzj

最新资讯
微软(中国)在南昌启动微软云暨移动孵化计划

微软(中国)在南昌启动微

微软(中国)有限公司与南昌红谷滩新区10月20日签署战略合
腾讯与找钢网合资公司已正式成立 腾讯持股40%

腾讯与找钢网合资公司

记者独家获悉,腾讯与找钢网合资的胖猫云(上海)科技公司已
直击|盛大游戏CEO唐彦文:5G时代游戏行业将迎三巨变

直击|盛大游戏CEO唐彦

盛大游戏CEO唐彦文今日在2018年全球盛斗士大会上指出,5
优爱腾独播剧厮杀:爱奇艺弃播放量 腾讯改革会员体系

优爱腾独播剧厮杀:爱

影视行业电视收视率、网络平台播放量造假风波给行业带
奢侈手机品牌VERTU推新机:29800起,可远程删除数据

奢侈手机品牌VERTU推

国奢侈手机品牌VERTU发布全新ASTER P系列,该系列可远程
小牛上市,投资人还原创业故事,还评价了李一男

小牛上市,投资人还原创

明势资本是牛电科技天使轮领投方,在之后的每一轮都追加
最新文章
CPU幽灵和熔断漏洞是什么?Intel为大家简单易懂的科普了一番

CPU幽灵和熔断漏洞是

不久前让整全行业紧张、全球用户恐慌的Spectre幽灵、M
解析文件上传漏洞 从FCKEditor文件上传漏洞谈起

解析文件上传漏洞 从F

大部分的用户可能不要了解文件上传漏洞,下面小编就为大
手把手教你如何构造Office漏洞POC(以CVE-2012-0158为例)

手把手教你如何构造Of

近年来APT追踪盛行,最常见的就是各种以钓鱼开始的攻击
漏洞 自动化脚本 论漏洞和自动化脚本的区别

漏洞 自动化脚本 论漏

漏洞无处不在,它是在硬件、软件、协议的具体实现或系统
Python 爬虫修养-处理动态网页

Python 爬虫修养-处理

在爬虫开发中,大家可以很轻易地 bypass 所谓的 UA 限制
黑客通过Paypal可传输恶意图像

黑客通过Paypal可传输

PayPal解决了一个可被黑客用来向支付页面插入恶意图像