日期:2014-05-16  浏览次数:20410 次

动态爬虫jsoup+jdic实现

准备资料

jsoup 是一款 Java 的HTML 解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于JQuery的操作方法来取出和操作数据。

jsoup的主要功能如下:

  1. 从一个URL,文件或字符串中解析HTML;
  2. 使用DOM或CSS选择器来查找、取出数据;
  3. 可操作HTML元素、属性、文本;
如果对jsoup不熟悉,请移步http://jsoup.org/


JDIC 全程是 JDesktop Integration Components 目的是构建消除本机应用程序和 Java 等价物之间差距的组件。JDIC 单一的 Java API 允许应用程序接进本机操作系统特性,同时保持跨平台支持。它目前提供了本机 Web 浏览器(Internet Explorer 或 Mozilla) 支持、系统托盘支持、文件扩展集成和其他桌面特性。
官网:http://java.net/projects/jdic/
svn地址,直接下了看例子吧:https://svn.java.net/svn/jdic~svn
helloword程序:http://plplum.blog.163.com/blog/static/31032400200910994034328/



另,刚刚找到的一篇好文章,Java 网页浏览器组件介绍:http://www.ibm.com/developerworks/cn/java/j-lo-browser/index.html


动态核心

jsoup?的解析很好用,但是jsoup不能解析动态的代码,于是就有了JDIC调用ie内核,然后执行
	String jscript =   "function getAllHtml() {"+
		    "var a='';" +
		    "a = '<html><head><title>';" +
		    "a += document.title;"+	    
		    "a += '</title></head>';"+
	 	 	 "a += document.body.outerHTML;"+
	 	 	"a += '</html>';"+
			"return a;"+
		"}"+
		"getAllHtml();";
	  String result = webBrowser.executeScript(jscript);
?这段代码得到当前的html,然后交由jsoup 进行解析
Document doc=Jsoup.parse(result);
??

例子

示例目标
招聘网站,希望出来的结果按照公司规模来排序
购物网站,希望商品按照评论的多少来排序
图片搜索,快速保存所有的结果
。。。。。。

下面的演示实现了找出标题,百度图片搜索的前2页,智联招聘的前6页


package ins1000.main;

import ins1000.dialect.DefiniteUrl;
import ins1000.dialect.impl.CopyOfDefiniteUrl_zhilianzhaoping;
import ins1000.dialect.impl.DefiniteUrl_baiduMap;
import ins1000.util.BrowserReadHtml;

import java.util.ArrayList;
import java.util.List;

/**
 * 以网页翻页为例子
 * @author Administrator
 *
 */
public class Main{
	static List<DefiniteUrl> definiteUrls=new ArrayList<DefiniteUrl>();
	static{
		definiteUrls.add(new DefiniteUrl_baiduMap());
		definiteUrls.add(new CopyOfDefiniteUrl_zhilianzhaoping());
	}
	
	public static void main(String[] args) throws Exception {
		for(DefiniteUrl du:definiteUrls){
			BrowserReadHtml brh= new BrowserReadHtml(du);
			brh.begin();
		}
	}
	
	public static void finish(DefiniteUrl du) {
		definiteUrls.remove(du);
		if(definiteUrls.size()==0){
			System.exit(0);
		}
		
	}

}