你想要的任何信息,基本上在互联网上存在了,问题是如何把它们整理成你所需要的,比如在某个行业网站上抓取所有相关公司的的名字,联系电话,Email等,然后存到Excel里面做分析。网页信息抓取变得原来越有用了。
一般传统的网页,web服务器直接返回Html,这类网页很好抓,不管是用何种方式,只要得到html页面,然后做Dom解析就可以了。但对于需要Javascript生成的网页,就不那么容易了。张瑜 目前也没有找到好办法解决此问题。各位有抓javascript网页经验的朋友,欢迎指点。
所以今天要谈的还是传统html网页的信息抓取。虽然前面说了,没有技术难度,但是是否能有相对更容易的方法呢? 用过jQuery等js框架的朋友,可能都会觉得javascript貌似抓取网页信息的天然助手,而且其出生就是为了网页解析而存在的。当然现在有更多的应用了,如Server端的javascript应用,NodeJs.
如果能在我们的应用程序,如java程序中,能使用jQuery去抓网页,绝对是件激动人心的事情 。确实有现成的解决方案,一个Javascript引擎,一个能支撑jQuery运行的环境就可以了。
工具 : java, Rhino, envJs. 其中 Rhino是Mozzila提供的开源Javascript引擎,envJs是一个模拟浏览器额环境,如Window等。 代码如下,
package stony.zhang.scrape; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.lang.reflect.InvocationTargetException; import org.mozilla.javascript.Context; import org.mozilla.javascript.ContextFactory; import org.mozilla.javascript.Scriptable; import org.mozilla.javascript.ScriptableObject; /** * @author MyBeautiful * @Emal: zhangyu0182@sina.com * @date Mar 7, 2012 */ public class RhinoScaper { private String url; private String jsFile; private Context cx; private Scriptable scope; public String getUrl() { return url; } public String getJsFile() { return jsFile; } public void setUrl(String url) { this.url = url; putObject("url", url); } public void setJsFile(String jsFile) { this.jsFile = jsFile; } public void init() { cx = ContextFactory.getGlobal().enterContext(); scope = cx.initStandardObjects(null); cx.setOptimizationLevel(-1); cx.setLanguageVersion(Context.VERSION_1_5); String[] file = { "./lib/env.rhino.1.2.js", "./lib/jquery.js" }; for (String f : file) { evaluateJs(f); } try { ScriptableObject.defineClass(scope, ExtendUtil.class); } catch (IllegalAccessException e1) { e1.printStackTrace(); } catch (InstantiationException e1) { e1.printStackTrace(); } catch (InvocationTargetException e1) { e1.printStackTrace(); } ExtendUtil util = (ExtendUtil) cx.newObject(scope, "util"); scope.put("util", scope, util); } protected void evaluateJs(String f) { try { FileReader in = null; in = new FileReader(f); cx.evaluateReader(scope, in, f, 1, null); } catch (FileNotFoundException e1) { e1.printStackTrace(); } catch (IOException e1) { e1.printStackTrace(); } } public void putObject(String name, Object o) { scope.put(name, scope, o); } public void run() { evaluateJs(this.jsFile); } }
测试代码:
package stony.zhang.scrape; import java.util.HashMap; import java.util.Map; import junit.framework.TestCase; public class RhinoScaperTest extends TestCase { public RhinoScaperTest(String name) { super(name); } public void testRun() { RhinoScaper rs = new RhinoScaper(); rs.init(); rs.setUrl("http://www.baidu.com"); rs.setJsFile("test.js"); // Map<String, String> o = new HashMap<String, String>(); // rs.putObject("result", o); rs.run(); // System.out.println(o.get("imgurl")); } }
test.js文件,如下
$.ajax({ url: "http://www.baidu.com", context: document.body, success: function(data){ // util.log(data); var result =parseHtml(data); var $v= jQuery(result); // util.log(result); $v.find('#u a').each(function(index) { util.log(index + ': ' + $(this).attr("href")); // arr.add($(this).attr("href")); }); } }); function parseHtml(html) { //Create an iFrame object that will be used to render the HTML in order to get the DOM objects //created - this is a far quicker way of achieving the HTML to DOM conversion than trying //to transform the HTML objects one-by-one var oIframe = document.createElement('iframe'); //Hide the iFrame from view oIframe.style.display = 'none'; if (document.body) document.body.appendChild(oIframe); else document.documentElement.appendChild(oIframe); //Open the iFrame DOM object and write in our HTML oIframe.contentDocument.open(); oIframe.contentDocument.write(html); oIframe.contentDocument.close(); //Return the document body object containing the HTML that was just //added to the iFrame as DOM objects var oBody = oIframe.contentDocument.body; //TODO: Remove the iFrame object created to cleanup the DOM return oBody; }
我们执行Unit Test,将会在控制台打印从网页上抓取的三个baidu的连接,
0: http://www.baidu.com/gaoji/preferences.html
1: http://passport.baidu.com/?login&tpl=mn
2: https://passport.baidu.com/?reg&tpl=mn
测试成功,故证明在java程序中用jQuery抓取网页是可行的.
----------------------------------------------------------------------
张瑜,Mybeautiful , zhangyu0182@sina.com
推荐阅读,
相关推荐
- **文本内容**:jsoup提供了方便的方法提取元素的文本内容,如`.text()`方法,这在抓取网页正文时非常有用。 - **属性值**:对于HTML元素的属性,如href或src,jsoup也提供了便捷的接口获取,例如`.attr(...
它提供了一种方便的API,用于提取和操作数据,使用DOM,CSS,以及类似于jQuery的方法。在我们的案例中,JSOUP主要用于解析登录页面的HTML,获取登录所需的表单数据。 2. **解析HTML**:使用JSOUP,我们可以加载登录...
Jsoup是一款Java库,它提供了强大的功能,使得开发者可以方便地处理HTML文档,类似于jQuery的API,使得在Java中进行Web抓取变得更加简单。 首先,Jsoup的核心功能在于解析HTML。它能够将网页内容转换为DOM树结构,...
在IT行业中,网络爬虫是数据挖掘的一种重要技术,它允许我们自动地抓取互联网上的信息。本主题主要关注如何使用`httpclient4.*`库来绕过验证码获取公司信息,以及结合`jsoup`解析静态网页信息和`htmlUnit`处理动态...
在网页设计中,jQuery幻灯片是一种常见的交互元素,它能以动态且吸引人的方式展示多张图片或内容。"五种切换效果的jQuery幻灯片"是一个专门针对这一需求的资源,它提供了五种不同的过渡效果,为网站增添视觉吸引力,...
Java WebMagic是一个强大的开源Web爬虫框架,专为简化网页抓取而设计。它提供了简单易用的API,使得开发者可以快速地构建自己的网络爬虫项目。本教程将涵盖使用WebMagic进行爬虫开发的基本步骤,同时也会涉及...
IMDBScrapper是一个Java开发的项目,其主要目的是...总之,IMDBScrapper项目提供了一个学习和实践Java网络爬虫技术的好机会,通过它你可以深入理解如何使用JSoup进行网页数据抓取,并将所学应用到其他类似的任务中。
本篇文章将详细讲解如何使用Java以及Jsoup库来编写爬虫,抓取网页数据并将其有效地写入Excel的不同工作表(即sheet)中。 首先,让我们了解Jsoup是什么。Jsoup是一个用于处理真实世界HTML的Java库。它提供了非常...
"jsoup.jar包"是该库的Java归档(JAR)文件,它是Java应用程序的可执行文件,包含了jsoup的所有类和资源,使得开发者能够将其引入项目中进行网页爬虫相关的开发。 **网页爬虫基础** 网页爬虫是一种自动化程序,...
本教程将深入探讨如何使用Jsoup进行网页抓取,如何将抓取的数据存储到数据库中,以及如何管理和优化日志系统。 首先,Jsoup是一个Java库,它提供了方便的API来解析HTML,类似于jQuery的语法,使得开发者能够轻松地...
Java爬虫Gecco工具是Java领域中用于网页抓取的一个简单易用的框架,它借鉴了jQuery的选择器语法,使得开发者能方便地定位到需要抓取的网页元素。本文将详细解析如何使用Gecco工具抓取新闻实例,包括配置依赖、编写...
它提供了一种易于使用的API,用于提取和操作数据,采用DOM,CSS,以及jQuery-like方法。Jsoup可以解析HTML文档,抓取数据,修改文档结构、内容和属性,然后输出格式化的HTML。在网页抓取和数据提取方面,Jsoup是...
这个库是不推荐使用的,可能是因为已经被更新的版本或者其他的API替代,或者是不再维护,因此在新项目中应避免使用。 虽然被标记为"不推荐",但了解`intercom-java`的工作原理仍然有价值,尤其是对于那些需要与类似...
它的设计目标是使得开发者可以方便地解析、遍历、修改HTML文档,就像在jQuery中操作DOM一样。 2. **安装与引入** 要使用`jsoup`,首先需要将其添加到项目的依赖中。如果你使用的是Maven,可以在pom.xml文件中添加...
在Android开发中,我们有时需要从网页上抓取数据,比如新闻标题、产品信息等,这时Jsoup就能大显身手。本文将详细介绍如何在Android环境中使用Jsoup进行网页爬虫的实践。 首先,我们需要在Android项目中添加Jsoup...
网络爬虫,也称为网页蜘蛛或数据抓取器,是一种自动化程序,能够按照一定的规则遍历互联网上的网页,抓取所需的信息。在JAVA中实现爬虫,需要掌握网络请求库如HttpURLConnection或者第三方库如Apache HttpClient,...
它为开发者提供了在Java环境中处理HTML内容的工具,尤其适用于从网页中提取数据或进行自动化测试。这个类库可以帮助你解析HTML文档,就像XML一样,即使HTML文档的结构可能不那么规整。 HTMLParser-2.0-SNAPSHOT版本...
它的出现极大地简化了Java开发者在网页抓取、网页数据提取和网页更新等任务中的工作流程。 **解析HTML** jsoup能够解析各种格式的HTML,无论是整洁的结构化代码还是混乱的实际网页源码。它使用了一个叫做 Cleaner ...
1. **选择器API**:jsoup支持CSS选择器,这意味着开发者可以像在jQuery中那样,通过简单的字符串表达式选择HTML元素。例如,`$("div.container > p")`将选取所有`div.container`下的直接子`p`元素。 2. **选择器...