首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网络技术 > 网络基础 >

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

2012-12-18 
实现Ajax友好的搜索引擎爬虫-jrex,gecko此文转自于:http://ilovelate.blog.163.com/blog/static/601420074

实现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.zip和jrex_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) {    }}

?
????

热点排行