上一篇讨论了web driver对动态网页的抓取与分析,可以很清楚的看出这是一种集中式处理方式,简单说,就是利用服务器,打开一个真正的brower,然后将需要解析的地址交给浏览器,浏览器去解析,然后将结果返回。这样正如网友评论一样,效率上不好,其实我想说的是,如果质提不上去,可以采用量的方式,比如开多线程处理,多开几台机器处理,虽然单个不快,量多后,处理速度就上去了。当然这也不是什么特别好的方法。

  先谈谈他的不好之处:

  首先,依赖浏览器的驱动,无论使用ie,firefox,chrome,都需要启动其driver,才能进行操作。

  其次,对响应结果控制力度不够自由,比如有些网页我需要一个东西,有些网页我需要另一个东西,那么我希望是,可以对响应结果进行解析和过滤。

  最后,他是一个集中式处理的方式,现在啥都讲求分布式,当然不能为了分布而分布,不过在利用brower的资源时,分布是一个好的解决方法。

  那么,我还能做什么了,今天和同事聊的时候突然想到一个方案,也许会有一些帮助。当然,目前只是一个想法,不过后续我会去试验可行性,我相信估计也有人这么试过。让我们重新回归原点,从上一篇的解决方案中可以看出,其实我们采用的基本是一种类似黑盒的测试方式,也就是说,我们根本没有分析这些动态网页的构成,只是单纯的将网页让浏览器去解析,然后我们取得结果,(当然这里先不考虑一些复杂的ajax请求)。这里有两个要素,一就是浏览器,使用的web driver;二就是浏览器去解析,并做了请求和响应。

  为什么我不能采用分布式处理呢?利用客户端的资源来解析动态网页,这样不就减轻了压力,而且可以大大增加处理地址的能力。我的想法是这样的:

  1、开发一个简单的网页,用来访问。例如一个jsp

  2、将需要进行解析的地址通过参数的形式传给这个页面。例如采用xxx.jsp?url='www.sina.com.cn'

  3、后台截获这个req,然后根据新的url也就是"http://www.sina.com.cn",发起一个新的httprequest,将这个response,write给前面这个res.

  这样其实就是将sina的respose,交给了我这个jsp。

  4、这样,我就可以做一些手脚,例如获取response的时候,采用html解析器,并利用规则过滤掉一些元素或者添加一些我们需要的脚本代码,并将这个修改后的response,交个浏览器去执行。最后获取执行后的结果,再交给服务器处理或者保存。

  这样就避免掉一开始的一些问题。首先,与浏览器driver无关,也就是说如果用ie访问,就利用ie引擎;用firefox访问,就利用firefox引擎。就可以脱离web driver。其次,可以对结果进行自由控制,采用html解析器,就可以按照自己的规则来过滤响应。最后,利用这种方式就是一种分布式的处理,也就是说凡是访问我页面的浏览器,都可以用来进行页面解析,而且可以不占用我服务器的带宽。

  可见的问题在于:

  1、如何控制客户端去访问我想要的网址。

  2、如何将访问后的内容传回后台处理。

  3、由于篡改了响应,带来的Cross Domain的问题会不会影响到我的解析结果。

  4、如何知道页面已经加载完毕。

  5、采用何种解析器解析。

  

  由于这两天公司正在搬家,暂时要缓缓,不过上面的问题我已经有了一个初步的解决办法,不过仍需验证。无论结果如何,过几天再聊。呵呵

浅谈网络爬虫爬js动态加载网页(三)的更多相关文章

  1. 浅谈网络爬虫爬js动态加载网页(二)

    没错,最后我还是使用了Selenium,去实现上一篇我所说的问题,别的没有试,只试了一下firefox的引擎,总体效果对我来说还是可以接受的. 继续昨天的话题,既然要实现上篇所说的问题,那么就需要一个 ...

  2. 浅谈网络爬虫爬js动态加载网页(一)

    由于别的项目组在做舆情的预言项目,我手头正好没有什么项目,突然心血来潮想研究一下爬虫.分析的简单原型.网上查查这方面的资料还真是多,眼睛都看花了.搜了搜对于我这种新手来说,想做一个简单的爬虫程序,所以 ...

  3. 爬虫——爬取Ajax动态加载网页

    常见的反爬机制及处理方式 1.Headers反爬虫 :Cookie.Referer.User-Agent 解决方案: 通过F12获取headers,传给requests.get()方法 2.IP限制 ...

  4. 爬虫再探实战(四)———爬取动态加载页面——请求json

    还是上次的那个网站,就是它.现在尝试用另一种办法——直接请求json文件,来获取要抓取的信息. 第一步,检查元素,看图如下: 过滤出JS文件,并找出包含要抓取信息的js文件,之后就是构造request ...

  5. Scrapy 框架 使用 selenium 爬取动态加载内容

    使用 selenium 爬取动态加载内容 开启中间件 DOWNLOADER_MIDDLEWARES = { 'wangyiPro.middlewares.WangyiproDownloaderMidd ...

  6. Python+Selenium爬取动态加载页面(1)

    注: 最近有一小任务,需要收集水质和水雨信息,找了两个网站:国家地表水水质自动监测实时数据发布系统和全国水雨情网.由于这两个网站的数据都是动态加载出来的,所以我用了Selenium来完成我的数据获取. ...

  7. JS 动态加载脚本 执行回调

    JS 动态加载脚本  执行回调 关于在javascript里面加载其它的js文件的问题可能很多人都遇到过,但很多朋友可能并不知道怎么判断我们要加载的js文件是否加载完成,如果没有加载完成我们就调用文件 ...

  8. js动态加载以及确定加载完成的代码

    利用原生js动态加载js文件到页面,并在确定加载完成后调用相关function var otherJScipt = document.createElement("script") ...

  9. js动态加载css文件和js文件的方法

    今天研究了下js动态加载js文件和css文件的方法. 网上发现一个动态加载的方法.摘抄下来,方便自己以后使用 [code lang="html"] <html xmlns=& ...

随机推荐

  1. POJ 2100

    Graveyard Design Time Limit: 10000MS   Memory Limit: 64000K Total Submissions: 4443   Accepted: 946 ...

  2. Spring mvc json null

    http://blog.csdn.net/zdsdiablo/article/details/9429263

  3. [你必须知道的.NET]第三十二回,,深入.NET 4.0之,Tuple一二

    发布日期:2009.06.01 作者:Anytao © 2009 Anytao.com ,Anytao原创作品,转贴请注明作者和出处. Tuple,是函数式编程的概念之一,早见于Elang.F#等动态 ...

  4. JAVA IO 类库详解

    JAVA IO类库详解 一.InputStream类 1.表示字节输入流的所有类的超类,是一个抽象类. 2.类的方法 方法 参数 功能详述 InputStream 构造方法 available 如果用 ...

  5. 知问前端——概述及jQuery UI

    知问系统,是一个问答系统.主要功能:即会员提出问题,会员回答问题.目前比较热门的此类网站有:知乎http://www.zhihu.com.百度知道http://zhidao.baidu.com等.这里 ...

  6. ida GDB 远程调试

    在看雪上回答的问题,有人问在WinDbg下断KiDebugRoutine或者KdEnterDebugger函数会引发蓝屏!因为是在调试Windows的内核调试引擎,我给出的解决办法是用不依赖Windo ...

  7. activity 的四种启动方式

    Activity启动模式设置: <activity android:name=".MainActivity" android:launchMode="standar ...

  8. CentOS安装Chrome

    问题 在CentOS安装Chrome会遇到 libstdc++.so.6(GLIBCXX_3.4.15)(64bit) 依赖失败的问题, 即使下载了最新的libstdc++.so.6(包含GLIBCX ...

  9. SPRING IN ACTION 第4版笔记-第十章Hitting the database with spring and jdbc-004-使用NamedParameterJdbcTemplate

    为了使查询数据库时,可以使用命名参数,则要用NamedParameterJdbcTemplate 1.Java文件配置 @Bean public NamedParameterJdbcTemplate ...

  10. STL:string 大小(Size)和容量(Capacity)

    strings存在三种“大小”: 1.size()和length() 返回string中现在的字符个数.上述两个函数等效. 成员函数empty()用来检验字符数是否为0,亦即字符串是否为空.你应该优先 ...