添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

转自: http://yiyickf.iteye.com/blog/1107108

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内核,然后执行

Java代码

  1. String jscript =   "function getAllHtml() {"+
  2. "var a='';" +
  3. "a = '<html><head><title>';" +
  4. "a += document.title;"+
  5. "a += '</title></head>';"+
  6. "a += document.body.outerHTML;"+
  7. "a += '</html>';"+
  8. "return a;"+
  9. "}"+
  10. "getAllHtml();";
  11. String result = webBrowser.executeScript(jscript);

这段代码得到当前的html,然后交由jsoup 进行解析

Java代码

  1. Document doc=Jsoup.parse(result);

示例目标:

招聘网站,希望出来的结果按照公司规模来排序

购物网站,希望商品按照评论的多少来排序

图片搜索,快速保存所有的结果

。。。。。。

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

Java代码

  1. package ins1000.main;
  2. import ins1000.dialect.DefiniteUrl;
  3. import ins1000.dialect.impl.CopyOfDefiniteUrl_zhilianzhaoping;
  4. import ins1000.dialect.impl.DefiniteUrl_baiduMap;
  5. import ins1000.util.BrowserReadHtml;
  6. import java.util.ArrayList;
  7. import java.util.List;
  8. /**
  9. * 以网页翻页为例子
  10. * @author Administrator
  11. *
  12. */
  13. public class Main{
  14. static List<DefiniteUrl> definiteUrls=new ArrayList<DefiniteUrl>();
  15. static{
  16. definiteUrls.add(new DefiniteUrl_baiduMap());
  17. definiteUrls.add(new CopyOfDefiniteUrl_zhilianzhaoping());
  18. }
  19. public static void main(String[] args) throws Exception {
  20. for(DefiniteUrl du:definiteUrls){
  21. BrowserReadHtml brh= new BrowserReadHtml(du);
  22. brh.begin();
  23. }
  24. }
  25. public static void finish(DefiniteUrl du) {
  26. definiteUrls.remove(du);
  27. if(definiteUrls.size()==0){
  28. System.exit(0);
  29. }
  30. }
  31. }

主类,扩展的时候直接添加definiteUrls.add(new xxx());即可

Java代码

  1. package ins1000.util;
  2. import ins1000.dialect.DefiniteUrl;
  3. import java.awt.BorderLayout;
  4. import java.net.URL;
  5. import java.util.Timer;
  6. import java.util.TimerTask;
  7. import javax.swing.JFrame;
  8. import javax.swing.JPanel;
  9. import org.jdesktop.jdic.browser.WebBrowser;
  10. import org.jdesktop.jdic.browser.WebBrowserEvent;
  11. import org.jdesktop.jdic.browser.WebBrowserListener;
  12. import org.jsoup.Jsoup;
  13. import org.jsoup.nodes.Document;
  14. /**
  15. * 动态读取页面的html
  16. * @author ckf
  17. *
  18. */
  19. public class BrowserReadHtml {
  20. private DefiniteUrl definiteUrl;
  21. public BrowserReadHtml(DefiniteUrl definiteUrl) {
  22. this.definiteUrl=definiteUrl;
  23. }
  24. private  JFrame frame;
  25. private JPanel panel_name=new JPanel();
  26. private WebBrowser webBrowser = new WebBrowser();
  27. public void begin() throws Exception{
  28. initwebBrowser();
  29. frame = new JFrame("Browser Test");
  30. frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  31. frame.getContentPane().add(webBrowser);
  32. frame.pack();
  33. frame.setSize(900,500);
  34. frame.setLocation((int)(100*Math.random()), (int)(100*Math.random()));
  35. frame.setVisible(definiteUrl.isVisible());
  36. }
  37. int begincount;
  38. private void initwebBrowser()  throws Exception{
  39. panel_name.add(webBrowser, BorderLayout.CENTER);
  40. webBrowser .setURL(new URL(definiteUrl.getUrl()));
  41. webBrowser .addWebBrowserListener(new WebBrowserListener() {
  42. public void documentCompleted(WebBrowserEvent event) {
  43. if(begincount==0){
  44. getThisPageResult();
  45. }
  46. begincount++;
  47. }
  48. public void downloadStarted(WebBrowserEvent event) {}
  49. public void downloadCompleted(WebBrowserEvent event) {      }
  50. public void downloadProgress(WebBrowserEvent event) {       }
  51. public void downloadError(WebBrowserEvent event) {          }
  52. public void titleChange(WebBrowserEvent event) {        }
  53. public void statusTextChange(WebBrowserEvent event) {       }
  54. public void windowClose(WebBrowserEvent arg0) {     }
  55. });
  56. }
  57. private void callback(String result) {
  58. Document doc=Jsoup.parse(result);
  59. definiteUrl.page(doc);
  60. if(definiteUrl.isEndPage(doc)){
  61. frame.dispose();
  62. definiteUrl.finish();
  63. }else{
  64. webBrowser.executeScript(definiteUrl.getNextPageJavaScript(doc));
  65. getThisPageResult();
  66. }
  67. }
  68. private void getThisPageResult() {
  69. Timer timer = new Timer(false);
  70. timer.schedule(new AllTask(), 1 * 1000);
  71. }
  72. class AllTask extends TimerTask {
  73. public void run() {
  74. String jscript =   "function getAllHtml() {"+
  75. "var a='';" +
  76. "a = '<html><head><title>';" +
  77. "a += document.title;"+
  78. "a += '</title></head>';"+
  79. "a += document.body.outerHTML;"+
  80. "a += '</html>';"+
  81. "return a;"+
  82. "}"+
  83. "getAllHtml();";
  84. String result = webBrowser.executeScript(jscript);
  85. callback(result);
  86. }
  87. }
  88. }

这个类是调用ie浏览器,执行javascript代码,可以不管

Java代码

  1. package ins1000.dialect;
  2. import ins1000.main.Main;
  3. import org.jsoup.nodes.Document;
  4. /**
  5. * 抽象类,每个具体的网站都要继承此类
  6. * @author Administrator
  7. *
  8. */
  9. public abstract class DefiniteUrl{
  10. private String url;
  11. private boolean visible;
  12. public DefiniteUrl(String url){
  13. this.url=url;
  14. visible=true;
  15. }
  16. public abstract String getNextPageJavaScript(Document doc);
  17. public abstract boolean isEndPage(Document doc);
  18. public abstract void page(Document doc);
  19. public String getUrl() {
  20. return url;
  21. }
  22. public void setUrl(String url) {
  23. this.url = url;
  24. }
  25. public boolean isVisible() {
  26. return visible;
  27. }
  28. public void setVisible(boolean visible) {
  29. this.visible = visible;
  30. }
  31. public void finish() {
  32. Main.finish(this);
  33. }
  34. }

这个是抽象类,每个网站要实现对应的方法

getNextPageJavaScript下一页javascript代码,可以是点击下一页按钮,也可以是直接换url

isEndPage是否为最后一页

page当前页面最终的html代码(动态的html代码)

//以下为具体的实现类,扩展的时候直接继承一个DefiniteUrl

Java代码

  1. package ins1000.dialect.impl;
  2. import org.jsoup.nodes.Document;
  3. import org.jsoup.nodes.Element;
  4. import org.jsoup.select.Elements;
  5. import ins1000.dialect.DefiniteUrl;
  6. public class DefiniteUrl_baiduMap  extends DefiniteUrl{
  7. public DefiniteUrl_baiduMap() {
  8. //设置网站入口地址
  9. super("http://image.baidu.com/i?ct=201326592&cl=2&lm=-1&tn=baiduimage&istype=2&fm=index&pv=&z=0&word=%C2%E3%BB%E9%CA%B1%B4%FA&s=0");
  10. //设置窗口是否可视化,默认为true
  11. //setVisible(false);
  12. }
  13. private int count=1;
  14. @Override
  15. public String getNextPageJavaScript(Document doc) {
  16. count++;
  17. Element el= doc.select("#pgw").select("a").last();
  18. return el.attr("onclick");
  19. }
  20. @Override
  21. public boolean isEndPage(Document doc) {
  22. if(count>=2){
  23. return true;
  24. }else{
  25. return false;
  26. }
  27. }
  28. @Override
  29. public void page(Document doc) {
  30. Elements els= doc.select("#imgid").select("dl");
  31. for(Element el:els){
  32. Element img=el.select("img").first();
  33. Element link=el.select("dt").select("a").first();
  34. System.out.println(link.text()+"=======>"+img.absUrl("src"));
  35. }
  36. }
  37. }

Java代码

  1. package ins1000.dialect.impl;
  2. import org.jsoup.nodes.Document;
  3. import org.jsoup.nodes.Element;
  4. import org.jsoup.select.Elements;
  5. import ins1000.dialect.DefiniteUrl;
  6. public class CopyOfDefiniteUrl_zhilianzhaoping  extends DefiniteUrl{
  7. public CopyOfDefiniteUrl_zhilianzhaoping() {
  8. //设置网站入口地址
  9. super("http://sou.zhaopin.com/jobs/jobsearch_jobtype.aspx?in=210500&jl=%E6%B7%B1%E5%9C%B3&kw=java&sm=1&p=1");
  10. //设置窗口是否可视化,默认为true
  11. //setVisible(false);
  12. }
  13. private int count=1;
  14. @Override
  15. public String getNextPageJavaScript(Document doc) {
  16. String url="http://sou.zhaopin.com/jobs/jobsearch_jobtype.aspx?in=210500&jl=%E6%B7%B1%E5%9C%B3&kw=java&sm=1&p="+count;
  17. String next="window.location.href='"+url+"';";
  18. count++;
  19. return next;
  20. }
  21. @Override
  22. public boolean isEndPage(Document doc) {
  23. if(count>=6){
  24. return true;
  25. }else{
  26. return false;
  27. }
  28. }
  29. @Override
  30. public void page(Document doc) {
  31. Elements els= doc.select("#joblist").select("[class=trW2]");
  32. for(Element el:els){
  33. try {
  34. System.out.print(el.select("a").first().text());
  35. System.out.print("==========>");
  36. System.out.println(el.select("a").eq(1).text());
  37. } catch (Exception e) {
  38. }
  39. }
  40. }
  41. }

有图有真相

附件中有源码,eclipse导出

Java代码

  1. private void getThisPageResult() {
  2. Timer timer = new Timer(false);
  3. timer.schedule(new AllTask(), 1 * 1000);
  4. }
  5. class AllTask extends TimerTask {
  6. public void run() {
  7. String jscript =   "function getAllHtml() {"+
  8. "var a='';" +
  9. "a = '<html><head><title>';" +
  10. "a += document.title;"+
  11. "a += '</title></head>';"+
  12. "a += document.body.outerHTML;"+
  13. "a += '</html>';"+
  14. "return a;"+
  15. "}"+
  16. "getAllHtml();";
  17. String result = webBrowser.executeScript(jscript);
  18. callback(result);
  19. }

上面是当前代码,求更好的解决方案

现在取得当前的html使用了定时器,1秒后执行,感觉很不精确,有没有什么更好的方式,比如判断当前页面所有的内容都已经加载完了,其它的javascript都已经执行完了的代码?

转自:http://yiyickf.iteye.com/blog/1107108准备资料jsoup 是一款 Java 的HTML 解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于JQuery的操作方法来取出和操作数据。jsoup的主要功能如下:从一个URL,文件或字符串中解析HTML; 使用DOM或CSS选择器来查找...
Java 中, Java .net包里面的类是进行网络编程的,其中, java .net. URL 类和 java .net. URL Conection类是编程者方便地利用 URL 在Internet上进行网络通信。有两种方法可以用来访问Internet。 一是使用 URL 类的openStream()方法: openStream()方法与制定的 URL 建立连接并返回InputStream类的对象,以从这一连接中读取数据; openStream()方法只能读取网络资源。 二是使用 URL 类的openConnection()方
我们抓取到页面后,还需要对页面进行 解析 。可以使用字符串处理工具 解析 页面,也可以使用正则表达式,但是这些技术都会带来很大的开发成本,所以我们需要一款专门 解析 html 页面的技术。 jsoup 是一款 java html 解析 器,可以直接 解析 某个 URL 地址、 HTML 文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似Jquery的操作方法来取出和操作数据。 jsoup 的主要功能如下:
JDIC Java Desktop Integration Components)项目的背景是当可以不考虑 Java 代码的平台可移植性的时候,能让 Java 程序与系统无缝地整合在一起。它提供给 Java 代码直接访问本地桌面的功能,其中包含了一系列的 Java 包以及工具,包含了嵌入本地浏览器组件的功能,启动桌面应用程序,在桌面的系统托盘处添加托盘图标以及注册文件类型关联等等。 JDIC plus 是在 JDIC 项目上的另外一个扩展,它是一个 Java 的 win32 操作系统的扩展开发工具包,也就是说,它只能在 Windows 操作系统上使用,所以不具有平台无关性。它提供了很多类似于 Windows API 的功能,除了提供了对 IE 组件的封装之外,还有地图显示组件,以及编辑浏览 MS Word、MS PPT、MS Excel、MS Outlook、PDF 的组件。 JDIC plus 曾经的官方网站是 https:// jdic .dev. java .net/documentation/incubator/ JDIC plus/index. html ,这个页面上展示了很多使用了 JDIC plus 这个库的 DEMO,这里讨论的主要是对 Windows IE 封装的浏览器组件。