`
Mybeautiful
  • 浏览: 298350 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

网页抓取之新方法 (在java程序中使用jQuery)

阅读更多

    你想要的任何信息,基本上在互联网上存在了,问题是如何把它们整理成你所需要的,比如在某个行业网站上抓取所有相关公司的的名字,联系电话,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

 

推荐阅读,

Java学习这七年     如何阅读源代码     我应该做的更差吗?

  • 大小: 123.9 KB
4
3
分享到:
评论
8 楼 Mybeautiful 2014-11-04  
hanjiangit 写道
青峰大辉 写道
你好,整个工程直接运行报错:
Exception in thread "main" org.mozilla.javascript.EvaluatorException: uncaught JavaScript runtime exception: ReferenceError: "util" is not defined. (./js/pair.js#3)

受累看下。

同问,楼主

我刚才测试了下,没有发现你们说的问题;附上我测试图片。我用的jdk1.7;不知是否有关。
7 楼 hanjiangit 2014-11-04  
青峰大辉 写道
你好,整个工程直接运行报错:
Exception in thread "main" org.mozilla.javascript.EvaluatorException: uncaught JavaScript runtime exception: ReferenceError: "util" is not defined. (./js/pair.js#3)

受累看下。

同问,楼主
6 楼 青峰大辉 2014-07-02  
你好,整个工程直接运行报错:
Exception in thread "main" org.mozilla.javascript.EvaluatorException: uncaught JavaScript runtime exception: ReferenceError: "util" is not defined. (./js/pair.js#3)

受累看下。
5 楼 Mybeautiful 2013-03-19  
sbear 写道
楼主可以提供一下源码吗

389331837 写道
代码有错  ExtendUtil 这个类是在那里定义的呢?

yxzkm 写道
嗯,不错!不过,请看一下jsoup,似乎在服务端就能解决dom的遍历问题


对不起没有及时回复,已经把整个项目附上了,大家试试看。
4 楼 yxzkm 2013-02-05  
嗯,不错!不过,请看一下jsoup,似乎在服务端就能解决dom的遍历问题
3 楼 sbear 2013-01-23  
楼主可以提供一下源码吗
2 楼 389331837 2012-11-21  
代码有错  ExtendUtil 这个类是在那里定义的呢?
1 楼 Mybeautiful 2012-03-09  
补充一下,
经过研究,如果Rhino能结合jsdom那将能解决javascript的问题,就如同node.js一样。有相关经验的朋友,提示一下。

相关推荐

    jsoup-1.13.1.jar Java爬虫经典框架 抓取网页内容

    - **文本内容**:jsoup提供了方便的方法提取元素的文本内容,如`.text()`方法,这在抓取网页正文时非常有用。 - **属性值**:对于HTML元素的属性,如href或src,jsoup也提供了便捷的接口获取,例如`.attr(...

    JAVA 模拟网页是登录

    它提供了一种方便的API,用于提取和操作数据,使用DOM,CSS,以及类似于jQuery的方法。在我们的案例中,JSOUP主要用于解析登录页面的HTML,获取登录所需的表单数据。 2. **解析HTML**:使用JSOUP,我们可以加载登录...

    抓取网络数据demo

    Jsoup是一款Java库,它提供了强大的功能,使得开发者可以方便地处理HTML文档,类似于jQuery的API,使得在Java中进行Web抓取变得更加简单。 首先,Jsoup的核心功能在于解析HTML。它能够将网页内容转换为DOM树结构,...

    针对 httpclient4.* 绕验证码获取公司信息 包括 jsoup网页信息的爬虫及htmlUnit对动态网站信息的抓取

    在IT行业中,网络爬虫是数据挖掘的一种重要技术,它允许我们自动地抓取互联网上的信息。本主题主要关注如何使用`httpclient4.*`库来绕过验证码获取公司信息,以及结合`jsoup`解析静态网页信息和`htmlUnit`处理动态...

    五种切换效果的jQuery幻灯片

    在网页设计中,jQuery幻灯片是一种常见的交互元素,它能以动态且吸引人的方式展示多张图片或内容。"五种切换效果的jQuery幻灯片"是一个专门针对这一需求的资源,它提供了五种不同的过渡效果,为网站增添视觉吸引力,...

    最新Java WebMagic爬虫教程

    Java WebMagic是一个强大的开源Web爬虫框架,专为简化网页抓取而设计。它提供了简单易用的API,使得开发者可以快速地构建自己的网络爬虫项目。本教程将涵盖使用WebMagic进行爬虫开发的基本步骤,同时也会涉及...

    IMDBScrapper:该Java项目使用JSoup库来抓取IMDB网站并获得最新比赛的电影评级

    IMDBScrapper是一个Java开发的项目,其主要目的是...总之,IMDBScrapper项目提供了一个学习和实践Java网络爬虫技术的好机会,通过它你可以深入理解如何使用JSoup进行网页数据抓取,并将所学应用到其他类似的任务中。

    使用Java编写爬虫写入excel的多个sheet

    本篇文章将详细讲解如何使用Java以及Jsoup库来编写爬虫,抓取网页数据并将其有效地写入Excel的不同工作表(即sheet)中。 首先,让我们了解Jsoup是什么。Jsoup是一个用于处理真实世界HTML的Java库。它提供了非常...

    jsoup1.10_jsoupjar包网页_

    "jsoup.jar包"是该库的Java归档(JAR)文件,它是Java应用程序的可执行文件,包含了jsoup的所有类和资源,使得开发者能够将其引入项目中进行网页爬虫相关的开发。 **网页爬虫基础** 网页爬虫是一种自动化程序,...

    java jsoup应用爬取数据存储数据库及日志开关

    本教程将深入探讨如何使用Jsoup进行网页抓取,如何将抓取的数据存储到数据库中,以及如何管理和优化日志系统。 首先,Jsoup是一个Java库,它提供了方便的API来解析HTML,类似于jQuery的语法,使得开发者能够轻松地...

    java爬虫Gecco工具抓取新闻实例

    Java爬虫Gecco工具是Java领域中用于网页抓取的一个简单易用的框架,它借鉴了jQuery的选择器语法,使得开发者能方便地定位到需要抓取的网页元素。本文将详细解析如何使用Gecco工具抓取新闻实例,包括配置依赖、编写...

    jsoup_htmlunit_seleniumWebdriver_jar

    它提供了一种易于使用的API,用于提取和操作数据,采用DOM,CSS,以及jQuery-like方法。Jsoup可以解析HTML文档,抓取数据,修改文档结构、内容和属性,然后输出格式化的HTML。在网页抓取和数据提取方面,Jsoup是...

    dispatch-jsoup_2.11-0.8.10.zip

    这个库是不推荐使用的,可能是因为已经被更新的版本或者其他的API替代,或者是不再维护,因此在新项目中应避免使用。 虽然被标记为"不推荐",但了解`intercom-java`的工作原理仍然有价值,尤其是对于那些需要与类似...

    基于Java的HTML解析器 jsoup.zip

    它的设计目标是使得开发者可以方便地解析、遍历、修改HTML文档,就像在jQuery中操作DOM一样。 2. **安装与引入** 要使用`jsoup`,首先需要将其添加到项目的依赖中。如果你使用的是Maven,可以在pom.xml文件中添加...

    Android_Jsoup网页爬虫案例

    在Android开发中,我们有时需要从网页上抓取数据,比如新闻标题、产品信息等,这时Jsoup就能大显身手。本文将详细介绍如何在Android环境中使用Jsoup进行网页爬虫的实践。 首先,我们需要在Android项目中添加Jsoup...

    爬虫视频教程

    网络爬虫,也称为网页蜘蛛或数据抓取器,是一种自动化程序,能够按照一定的规则遍历互联网上的网页,抓取所需的信息。在JAVA中实现爬虫,需要掌握网络请求库如HttpURLConnection或者第三方库如Apache HttpClient,...

    java htmlparser 类JAR包下载

    它为开发者提供了在Java环境中处理HTML内容的工具,尤其适用于从网页中提取数据或进行自动化测试。这个类库可以帮助你解析HTML文档,就像XML一样,即使HTML文档的结构可能不那么规整。 HTMLParser-2.0-SNAPSHOT版本...

    jsoup-1.14.3-bin.zip

    它的出现极大地简化了Java开发者在网页抓取、网页数据提取和网页更新等任务中的工作流程。 **解析HTML** jsoup能够解析各种格式的HTML,无论是整洁的结构化代码还是混乱的实际网页源码。它使用了一个叫做 Cleaner ...

    基于Java的源码-HTML解析器 jsoup.zip

    1. **选择器API**:jsoup支持CSS选择器,这意味着开发者可以像在jQuery中那样,通过简单的字符串表达式选择HTML元素。例如,`$("div.container &gt; p")`将选取所有`div.container`下的直接子`p`元素。 2. **选择器...

Global site tag (gtag.js) - Google Analytics