`

实现Ajax友好的搜索引擎爬虫-jrex,gecko

阅读更多

此文转自于:http://ilovelate.blog.163.com/blog/static/601420074610168616/

 

   现在web2.0如火如荼,Ajax技术获得了广大的运用,比如咱网易博客,搜狐博客等,仔细研究下这些网站,你会发现他们对搜索引擎很不友好,因为什么 呢,因为这些网站都使用了后加载技术,就是说是在JS里面去动态加载内容的,最典型的就是个人博客的首页,那么多模块都是后加载进来的。对于一般的搜索引 擎来说,他只会抓取网页,然后分析网页的内容,如果搜索引擎来抓个人博客的首页的话,看到的除了head区域,其他的就没有内容了,因为搜索引擎不会执行 页面。 这样就提出了一个问题,怎么实现Ajax友好的爬虫呢,就是说虽然我这个网站引用了Ajax实现了后加载技术,也照样可以抓取我的内容。 可能大家有个疑问,既然这样,为什么在google百度,还能搜到我的日志内容呢,那是因为网易博客的日志页面是使用了静态页面的技术,日志的内容都在网 页内呢,呵呵,另外还有每个博客都有RSS地址,搜索引擎可以通过爬取RSS来获得内容。
     如何爬取后加载的网页呢,简单点说我们爬取的网页应该是像firefox中的view genernated Source这样的网页内容,而不是现在搜索搜索引擎使用的view source内容。 要实现这样的效果,firefox使用的开源GECKO 引擎可以实现我们想要的效果,因为我们使用java来做爬虫的话,jrex已经为gecko做好了封装,很容易使用。
                                                                  
一、       介绍

"JRex" is a Java Browser Component with set of API's for Embedding Mozilla GECKO within a Java Application.

 Jrex提供了对firefox的引擎的java形式的封装。默认的gecko引擎是以C++ dll的形式提供的,Jrex主要是做了JNI这层的封装,并提供了Java的接口
二、       安装

网址: http://jrex.mozdev.org/

1.       下载 jrex-bin-log-1.0b1_dom3.zipjrex_gre.jar

2.       将jrex_gre.jar的后缀改为rar,打开后将最里面的jrex_gre文件夹复制到C:\中,然后将jrex-bin-log-1.0b1_dom3.zip中的jrex.dll文件复制到 C:\jrex_gre 目录中。

3.       直接运行run.bat即可看到用jrex实现的java浏览器,还不错噢。

注意,那个JAVA_HOME应该是JRE的,而不是JDK的,否则会找不到的一个jwt.dll

  "C:\Program Files\Java\jre1.5.0_06/bin/java"

 
三、       编程

实现效果: firefox中的view generated Source

代码如下:

 

 
import java.io.StringWriter;

import javax.swing.JFrame;

import javax.swing.JPanel;

import javax.xml.transform.OutputKeys;

import javax.xml.transform.Result;

import javax.xml.transform.Source;

import javax.xml.transform.Transformer;

import javax.xml.transform.TransformerFactory;

import javax.xml.transform.dom.DOMSource;

import javax.xml.transform.stream.StreamResult;

import org.mozilla.jrex.JRexFactory;

import org.mozilla.jrex.event.progress.ProgressEvent;

import org.mozilla.jrex.navigation.WebNavigation;

import org.mozilla.jrex.navigation.WebNavigationConstants;

import org.mozilla.jrex.ui.JRexCanvas;

import org.mozilla.jrex.window.JRexWindowManager;

import org.w3c.dom.Document;

import org.w3c.dom.Element;

import org.w3c.dom.Node;

public class Render implements org.mozilla.jrex.event.progress.ProgressListener {

    boolean done = false;

    public boolean parsePage(String url) throws Exception {

System.setProperty("jrex.browser.usesetupflags", "true");

       System.setProperty("jrex.browser.allow.images", "false"); //不加载图片

       System.setProperty("jrex.browser.allow.plugin", "false"); //不加载flash




       // The JRexCanvas is the main browser component. The WebNavigator

       // is used to access the DOM.

       JRexCanvas canvas = null;

       WebNavigation navigation = null;

       // Start up JRex/Gecko.

       JRexFactory.getInstance().startEngine();

       // Get a window manager and put the browser in a Swing frame.

       // Based on Dietrich Kappe's code.

       JRexWindowManager winManager = (JRexWindowManager) JRexFactory

              .getInstance().getImplInstance(JRexFactory.WINDOW_MANAGER);

       winManager.create(JRexWindowManager.SINGLE_WINDOW_MODE);

       JPanel panel = new JPanel();

       JFrame frame = new JFrame();

       frame.getContentPane().add(panel);

       winManager.init(panel);

       // Get the JRexCanvas, set Render to handle progress events so

       // we can determine when the page is loaded, and get the

       // WebNavigator object.

       canvas = (JRexCanvas) winManager.getBrowserForParent(panel);

       canvas.addProgressListener(this);

       navigation = canvas.getNavigator();

       // Load and process the page.

       navigation.loadURI(url, WebNavigationConstants.LOAD_FLAGS_NONE, null,

              null, null);

       // Swing magic.

       frame.setSize(640, 480);

       frame.setVisible(false);

       // Check if the DOM has loaded every two seconds.

       while (!done) {

           Thread.sleep(2000);

       }

       // Get the DOM and recurse on its nodes.

       Document doc = navigation.getDocument();

       Element ex = doc.getDocumentElement();

       System.out.println(xmlToString(ex));

       return true;

    }

    public static String xmlToString(Node node) throws Exception {

       Source source = new DOMSource(node);

       StringWriter stringWriter = new StringWriter();

       Result result = new StreamResult(stringWriter);

       TransformerFactory factory = TransformerFactory.newInstance();

       Transformer transformer = factory.newTransformer();

       transformer.setOutputProperty(OutputKeys.METHOD, "html");

       transformer.transform(source, result);

       return stringWriter.getBuffer().toString();

    }

    /**

     * onStateChange is invoked several times when DOM loading is complete. Set

     * the done flag the first time.

     */

    public void onStateChange(ProgressEvent event) {

       if (!event.isLoadingDocument()) {

           if (done)

              return;

           done = true;

       }

    }

    public static void main(String[] args) throws Exception {

       Render p = new Render();

       p.parsePage("http://ilovelate.blog.163.com");

       System.exit(0);

    }

    public void onLinkStatusChange(ProgressEvent event) {

    }

    public void onLocationChange(ProgressEvent event) {

    }

    public void onProgressChange(ProgressEvent event) {

    }

    public void onSecurityChange(ProgressEvent event) {

    }

    public void onStatusChange(ProgressEvent event) {

    }

}

 
    

分享到:
评论

相关推荐

    JRex 爬虫ajax网页 API文档

    一般在浏览器中查看页面代码 是浏览器直接下载到的页面代码 在未经渲染前 对于JS AJAX输出的内容是无法得到的 这样我们得到的页面内容和直接走socket抓取回来无任何区别 还是无法得到需要的页面内容。 JS函数及页面...

    JRex java webbrowser 爬虫ajax网页 源码

    一般在浏览器中查看页面代码 是浏览器直接下载到的页面代码 在未经渲染前 对于JS AJAX输出的内容是无法得到的 这样我们得到的页面内容和直接走socket抓取回来无任何区别 还是无法得到需要的页面内容。 JS函数及页面...

    jrex-bin-nolog-1.0b1_dom3

    使用Jrex的两个包,jrex-bin-nolog-1.0b1_dom3.jar

    JRex_seamonkey_src

    标题“JRex_seamonkey_src”表明这与一个名为JRex的项目有关,该项目与SeaMonkey的源代码有关。SeaMonkey是一款开源的网络浏览器、电子邮件客户端、新闻阅读器和网页编辑器,它是由Mozilla基金会开发的。JRex可能是...

    jrex64_1.8

    标题“jrex64_1.8”暗示我们正在讨论的是Java Runtime Environment(JRE)的一个64位版本,版本号为1.8。JRE是Oracle公司提供的一个软件组件,它允许用户在计算机上运行Java应用程序。1.8是Java SE(标准版)的一个...

    SHARE_Anaheim2012_RexxJava

    通过JREX,Java应用程序可以直接执行Rexx脚本,从而实现对SDSF的访问和操作。 ##### 示例代码: ```java import com.ibm.rexx.jre.RexxExecutor; public class SdsfDemo { public static void main(String[] args...

    JAVA访问串口RXTX包(含演示代码 linux下测试可用)

    复制rxtxSerial.dll 到%JAVA_HOME%\jreX/bin/ b.复制RXTXcomm.jar 到%JAVA_HOME% \jreX/lib/ext/ linux下安装包方法: a.复制rxtxSerial.so 到%JAVA_HOME%\jreX/lib/[machine type] b.复制RXTXcomm.jar 到%JAVA_...

    jre8.0 for X86

    jre8.0 for X86最新版

    rxtx-2.2官方包,java串口开发必备

    rxtx java串口开发使用依赖jar包以及dll文件。解压取其中rxtxSerial.dll和 RXTXcomm.jar 文件 a.复制rxtxSerial.dll 到%JAVA_HOME%\jreX/bin/ b.复制RXTXcomm.jar 到%JAVA_HOME% \jreX/lib/ext/

    java链接各种数据库

    在Java开发中,经常需要与不同的数据库进行交互,以实现数据的存储、查询等功能。本篇文章主要介绍如何使用Java连接几种常见的数据库,包括MySQL、SQL Server、Oracle以及DB2,并提供具体的示例代码。这些示例虽然...

    aes 256 cbc 加密jar

    aes 256 cbc 加密jar KeyGenerator 不支持 int(256)时, 下载jar包, 有1.6和1.7的 替换到\jreX\lib\security下的: local_policy.jar和US_export_policy.jar

    java版chm制作工具

    制作java api,类似chm的工具,使用jrex内置浏览器,使用lucene建立索引 http://blog.csdn.net/a276202460/archive/2010/08/26/5839040.aspx

Global site tag (gtag.js) - Google Analytics