浅谈网络爬虫爬js动态加载网页(二)
没错,最后我还是使用了Selenium,去实现上一篇我所说的问题,别的没有试,只试了一下firefox的引擎,总体效果对我来说还是可以接受的。
继续昨天的话题,既然要实现上篇所说的问题,那么就需要一个可以执行js代码的框架。我首先选择的是htmlunit,先简单介绍一下htmlunit。下面一段摘自网络。
| htmlunit 是一款开源的 java 页面分析工具,启动 htmlunit 之后,底层会启动一个无界面浏览器,用户可以指定浏览器类型:firefox、ie 等,如果不指定,默认采用 INTERNET_EXPLORER_7: WebClient webClient = new WebClient(BrowserVersion.FIREFOX_3_6); 通过简单的调用: 很重要的一点是,HtmlUnit 提供对执行 javascript 的支持: |
最后可以取得page.executeJavaScript(javascript).getNewPage(),获取执行后的页面。换句话说,javascript需要在这里人为的执行,显然与我的初衷不符,另外可能是我水平太差,在抓取sina新闻的页面时总是出错,暂时还没发现错误在何处,但按照网络上查询的结果来分析,极有可能错误的原因是在于htmlunit执行某些带参数的请求时,由于参数的顺序或者编码问题会导致请求失败而报错。关键是,运行后并没有得到我需要的结果。
那么就另寻解决办法,这个时候就找到了Selenium WebDriver,他是我需要的一个解决方案。
参考了资料和例子,就可以开始使用他了。实例代码如下。
File pathToBinary = new File("D:\\Program Files (x86)\\Mozilla Firefox\\firefox.exe");
FirefoxBinary ffBinary = new FirefoxBinary(pathToBinary);
FirefoxProfile firefoxProfile = new FirefoxProfile();
FirefoxDriver driver = new FirefoxDriver(ffBinary,firefoxProfile);
driver.get("http://cq.qq.com/baoliao/detail.htm?294064");
ArrayList list = new ArrayList();
list.add("http://www.sina.com.cn");
list.add("http://www.sohu.com");
list.add("http://www.163.com");
list.add("http://www.qq.com");
long start,end;
for(int i=0;i<list.size();i++){
start = System.currentTimeMillis();
driver.get(list.get(i).toString());
end = System.currentTimeMillis();
System.out.println(list.get(i).toString() + ":" + (end - start));
}
driver.close();
使用了firefox的引擎,得到的结果如下,而且确实满足了我的要求。
http://www.sina.com.cn:6638
http://www.sohu.com:5796
http://www.163.com:7567
http://www.qq.com:9384
可以看见如上的结果时间还是蛮长的,那如何加快速度呢。其实仔细考虑一下,为什么他要这么久,就是因为他在下载网页元素,我们请求一个网站的时候是发起一个req,得到一个res,而res中是只有元素没有内容的,换句话说,他不用执行css,js,不用下载图片,flash,加载广告等等。而如果我们需要加快效率,那就需要移除一切与我分析无关的东西,那么仿照浏览器一样,我们需要屏蔽掉css,图片,flash等等,从而加速网页的速度,更关心其中的内容。
简单方法如下:
//去掉css
firefoxProfile.setPreference("permissions.default.stylesheet", 2);
//去掉图片
firefoxProfile.setPreference("permissions.default.image", 2);
//去掉flash
firefoxProfile.setPreference("dom.ipc.plugins.enabled.libflashplayer.so",false);
那么在去除掉所有firefox缓存后,再次运行一下,会有什么结果呢。结果如下
http://www.sina.com.cn:5085
http://www.sohu.com:3520
http://www.163.com:3329
http://www.qq.com:2048
发现确实快了很多。上面只是一个大致的原型,如果真正的要用,还需要封装。
浅谈网络爬虫爬js动态加载网页(二)的更多相关文章
- 浅谈网络爬虫爬js动态加载网页(一)
由于别的项目组在做舆情的预言项目,我手头正好没有什么项目,突然心血来潮想研究一下爬虫.分析的简单原型.网上查查这方面的资料还真是多,眼睛都看花了.搜了搜对于我这种新手来说,想做一个简单的爬虫程序,所以 ...
- 浅谈网络爬虫爬js动态加载网页(三)
上一篇讨论了web driver对动态网页的抓取与分析,可以很清楚的看出这是一种集中式处理方式,简单说,就是利用服务器,打开一个真正的brower,然后将需要解析的地址交给浏览器,浏览器去解析,然后将 ...
- 爬虫——爬取Ajax动态加载网页
常见的反爬机制及处理方式 1.Headers反爬虫 :Cookie.Referer.User-Agent 解决方案: 通过F12获取headers,传给requests.get()方法 2.IP限制 ...
- 爬虫再探实战(四)———爬取动态加载页面——请求json
还是上次的那个网站,就是它.现在尝试用另一种办法——直接请求json文件,来获取要抓取的信息. 第一步,检查元素,看图如下: 过滤出JS文件,并找出包含要抓取信息的js文件,之后就是构造request ...
- Scrapy 框架 使用 selenium 爬取动态加载内容
使用 selenium 爬取动态加载内容 开启中间件 DOWNLOADER_MIDDLEWARES = { 'wangyiPro.middlewares.WangyiproDownloaderMidd ...
- Python+Selenium爬取动态加载页面(1)
注: 最近有一小任务,需要收集水质和水雨信息,找了两个网站:国家地表水水质自动监测实时数据发布系统和全国水雨情网.由于这两个网站的数据都是动态加载出来的,所以我用了Selenium来完成我的数据获取. ...
- JS 动态加载脚本 执行回调
JS 动态加载脚本 执行回调 关于在javascript里面加载其它的js文件的问题可能很多人都遇到过,但很多朋友可能并不知道怎么判断我们要加载的js文件是否加载完成,如果没有加载完成我们就调用文件 ...
- js动态加载以及确定加载完成的代码
利用原生js动态加载js文件到页面,并在确定加载完成后调用相关function var otherJScipt = document.createElement("script") ...
- js动态加载css文件和js文件的方法
今天研究了下js动态加载js文件和css文件的方法. 网上发现一个动态加载的方法.摘抄下来,方便自己以后使用 [code lang="html"] <html xmlns=& ...
随机推荐
- ASP.NET Web.Config配置数据库连接的一种方法
所谓的webConfig配置数据库连接就是在里面某个特定名称的节点中写下ADP.NET中的ConnectString,就这么简单 1.首先在Web.Config文件里写下数据库连接字符串. <c ...
- (转)单机上配置hadoop
哈哈,几天连续收到百度两次电话,均是利好消息,于是乎不知不觉的自己的工作效率也提高了,几天折腾了好久终于在单机上配置好了hadoop,然后也成功的运行了一个用例,耶耶耶耶耶耶. 转自:http://w ...
- 修改DevExpress中英文提示,将英文改为中文
1 : 修改DX 提示框中的英文字符 /// <summary> /// 重写DX弹出框 英文变为中文 /// </summary> public class CHS : De ...
- [你必须知道的.NET]第三十三回,深入.NET 4.0之,Lazy<T>点滴
发布日期:2009.10.29 作者:Anytao © 2009 Anytao.com ,Anytao原创作品,转贴请注明作者和出处. 对象的创建方式,始终代表了软件工业的生产力方向,代表了先进软件技 ...
- (转)价值240万的photoshop中文教程,错过了后悔都来不及 (吹得好响)
PS抠图方法 一.魔术棒法——最直观的方法 适用范围:图像和背景色色差明显,背景色单一,图像边界清晰. 方法意图:通过删除背景色来获取图像. 方法缺陷:对散乱的毛发没有用. 使用方法:1.点击“魔 ...
- linux中的磁盘的MBR记录详解
在硬盘中,硬盘的0柱面0磁头第一个1扇区称为主引导扇区,也叫主引导记录-MBR(main boot record),其中MBR是以下三个部分组成 1.Bootloader,主引导程序---446个字节 ...
- 如何查看eclipse中servlet跟jsp的版本
打开tomcat的lib 目录下,有两个JAR文件: jsp-api.jar servlet-api.jar .如果没有,那可能是你没有添加进来.解压这两个文件,用记事本分别打开META-INF下的M ...
- mysql使用过程中碰到的问题
start job failed to start mysql ubuntu 原因时我将var整个目录的组权限设置为www-data了, 试了网上的办法都不行(有个妥协方法是重新安装, 但很不好), ...
- 添加dubbo xsd的支持
使用dubbo时遇到问题: org.xml.sax.SAXParseException: schema_reference.4: Failed to read schema document 'htt ...
- java_String和StringBuffer区别分析
JAVA平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据.这个String类提供了数值不可改变的字符串.而这个StringBuffer类提供 ...