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

现在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

代码如下:

Java代码 收藏代码
  1. importjava.io.StringWriter;
  2. importjavax.swing.JFrame;
  3. importjavax.swing.JPanel;
  4. importjavax.xml.transform.OutputKeys;
  5. importjavax.xml.transform.Result;
  6. importjavax.xml.transform.Source;
  7. importjavax.xml.transform.Transformer;
  8. importjavax.xml.transform.TransformerFactory;
  9. importjavax.xml.transform.dom.DOMSource;
  10. importjavax.xml.transform.stream.StreamResult;
  11. importorg.mozilla.jrex.JRexFactory;
  12. importorg.mozilla.jrex.event.progress.ProgressEvent;
  13. importorg.mozilla.jrex.navigation.WebNavigation;
  14. importorg.mozilla.jrex.navigation.WebNavigationConstants;
  15. importorg.mozilla.jrex.ui.JRexCanvas;
  16. importorg.mozilla.jrex.window.JRexWindowManager;
  17. importorg.w3c.dom.Document;
  18. importorg.w3c.dom.Element;
  19. importorg.w3c.dom.Node;
  20. publicclassRenderimplementsorg.mozilla.jrex.event.progress.ProgressListener{
  21. booleandone=false;
  22. publicbooleanparsePage(Stringurl)throwsException{
  23. System.setProperty("jrex.browser.usesetupflags","true");
  24. System.setProperty("jrex.browser.allow.images","false");//不加载图片
  25. System.setProperty("jrex.browser.allow.plugin","false");//不加载flash
  26. //TheJRexCanvasisthemainbrowsercomponent.TheWebNavigator
  27. //isusedtoaccesstheDOM.
  28. JRexCanvascanvas=null;
  29. WebNavigationnavigation=null;
  30. //StartupJRex/Gecko.
  31. JRexFactory.getInstance().startEngine();
  32. //GetawindowmanagerandputthebrowserinaSwingframe.
  33. //BasedonDietrichKappe'scode.
  34. JRexWindowManagerwinManager=(JRexWindowManager)JRexFactory
  35. .getInstance().getImplInstance(JRexFactory.WINDOW_MANAGER);
  36. winManager.create(JRexWindowManager.SINGLE_WINDOW_MODE);
  37. JPanelpanel=newJPanel();
  38. JFrameframe=newJFrame();
  39. frame.getContentPane().add(panel);
  40. winManager.init(panel);
  41. //GettheJRexCanvas,setRendertohandleprogresseventsso
  42. //wecandeterminewhenthepageisloaded,andgetthe
  43. //WebNavigatorobject.
  44. canvas=(JRexCanvas)winManager.getBrowserForParent(panel);
  45. canvas.addProgressListener(this);
  46. navigation=canvas.getNavigator();
  47. //Loadandprocessthepage.
  48. navigation.loadURI(url,WebNavigationConstants.LOAD_FLAGS_NONE,null,
  49. null,null);
  50. //Swingmagic.
  51. frame.setSize(640,480);
  52. frame.setVisible(false);
  53. //CheckiftheDOMhasloadedeverytwoseconds.
  54. while(!done){
  55. Thread.sleep(2000);
  56. }
  57. //GettheDOMandrecurseonitsnodes.
  58. Documentdoc=navigation.getDocument();
  59. Elementex=doc.getDocumentElement();
  60. System.out.println(xmlToString(ex));
  61. returntrue;
  62. }
  63. publicstaticStringxmlToString(Nodenode)throwsException{
  64. Sourcesource=newDOMSource(node);
  65. StringWriterstringWriter=newStringWriter();
  66. Resultresult=newStreamResult(stringWriter);
  67. TransformerFactoryfactory=TransformerFactory.newInstance();
  68. Transformertransformer=factory.newTransformer();
  69. transformer.setOutputProperty(OutputKeys.METHOD,"html");
  70. transformer.transform(source,result);
  71. returnstringWriter.getBuffer().toString();
  72. }
  73. /**
  74. *onStateChangeisinvokedseveraltimeswhenDOMloadingiscomplete.Set
  75. *thedoneflagthefirsttime.
  76. */
  77. publicvoidonStateChange(ProgressEventevent){
  78. if(!event.isLoadingDocument()){
  79. if(done)
  80. return;
  81. done=true;
  82. }
  83. }
  84. publicstaticvoidmain(String[]args)throwsException{
  85. Renderp=newRender();
  86. p.parsePage("http://ilovelate.blog.163.com");
  87. System.exit(0);
  88. }
  89. publicvoidonLinkStatusChange(ProgressEventevent){
  90. }
  91. publicvoidonLocationChange(ProgressEventevent){
  92. }
  93. publicvoidonProgressChange(ProgressEventevent){
  94. }
  95. publicvoidonSecurityChange(ProgressEventevent){
  96. }
  97. publicvoidonStatusChange(ProgressEventevent){
  98. }
  99. }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值