Java简单的网络爬虫实现(2)



最近在学习搜索方面的东西,需要了解网络爬虫方面的知识,虽然有很多开源的强大的爬虫,但本着学习的态度,自己写了一个简单的网络爬虫,以便了解其中原理。



 

HrefOfPage.java 此类为获取页面的超链接

  1. View Code
  2. package com.sreach.spider;
  3. public class HrefOfPage
  4. {
  5.     /**
  6.      * 获得页面源代码中超链接
  7.      */
  8.     public static void getHrefOfContent(String content)
  9.     {
  10.         System.out.println("开始");
  11.         String[] contents = content.split("<a href=\"");
  12.         for (int i = 1; i < contents.length; i++)
  13.         {
  14.             int endHref = contents[i].indexOf("\"");
  15.             String aHref = FunctionUtils.getHrefOfInOut(contents[i].substring(
  16. , endHref));
  17.             if (aHref != null)
  18.             {
  19.                 String href = FunctionUtils.getHrefOfInOut(aHref);
  20.                 if (!UrlQueue.isContains(href)
  21.                         && href.indexOf("/code/explore") != -1
  22.                         && !VisitedUrlQueue.isContains(href))
  23.                 {
  24.                     UrlQueue.addElem(href);
  25.                 }
  26.             }
  27.         }
  28.         System.out.println(UrlQueue.size() + "--抓取到的连接数");
  29.         System.out.println(VisitedUrlQueue.size() + "--已处理的页面数");
  30.     }
  31. }

UrlDataHanding.java 此类主要是从未访问队列中获取url,下载页面,分析url,保存已访问url等操作,实现Runnable接口

  1. View Code
  2. package com.sreach.spider;
  3. public class UrlDataHanding implements Runnable
  4. {
  5.     /**
  6.      * 下载对应页面并分析出页面对应的URL放在未访问队列中。
  7.      * @param url
  8.      */
  9.     public void dataHanding(String url)
  10.     {
  11.             HrefOfPage.getHrefOfContent(DownloadPage.getContentFormUrl(url));
  12.     }
  13.     public void run()
  14.     {
  15.         while(!UrlQueue.isEmpty())
  16.         {
  17.            dataHanding(UrlQueue.outElem());
  18.         }
  19.     }
  20. }

UrlQueue.java 此类主要是用来存放未访问的URL队列

  1. View Code
  2. package com.sreach.spider;
  3. import java.util.LinkedList;
  4. public class UrlQueue
  5. {
  6.     /**超链接队列*/
  7.     public static LinkedList<String> urlQueue = new LinkedList<String>();
  8.     /**队列中对应最多的超链接数量*/
  9.     public static final int MAX_SIZE = 10000;
  10.     public synchronized static void addElem(String url)
  11.     {
  12.         urlQueue.add(url);
  13.     }
  14.     public synchronized static String outElem()
  15.     {
  16.         return urlQueue.removeFirst();
  17.     }
  18.     public synchronized static boolean isEmpty()
  19.     {
  20.         return urlQueue.isEmpty();
  21.     }
  22.     public  static int size()
  23.     {
  24.         return urlQueue.size();
  25.     }
  26.     public  static boolean isContains(String url)
  27.     {
  28.         return urlQueue.contains(url);
  29.     }
  30. }

VisitedUrlQueue.java 主要是保存已访问过的URL,使用HashSet来保存,主要是考虑到每个访问过的URL是不同。HashSet刚好符合这个要求

  1. View Code
  2. package com.sreach.spider;
  3. import java.util.HashSet;
  4. /**
  5.  * 已访问url队列
  6.  * @author HHZ
  7.  *
  8.  */
  9. public class VisitedUrlQueue
  10. {
  11.     public static HashSet<String> visitedUrlQueue = new HashSet<String>();
  12.     public synchronized static void addElem(String url)
  13.     {
  14.         visitedUrlQueue.add(url);
  15.     }
  16.     public synchronized static boolean isContains(String url)
  17.     {
  18.         return visitedUrlQueue.contains(url);
  19.     }
  20.     public synchronized static int size()
  21.     {
  22.         return visitedUrlQueue.size();
  23.     }
  24. }

Test.java 此类为测试类

  1. View Code
  2. import java.sql.SQLException;
  3. import com.sreach.spider.UrlDataHanding;
  4. import com.sreach.spider.UrlQueue;
  5. public class Test
  6. {
  7.   public static void main(String[] args) throws SQLException
  8.   {
  9.       String url = "http://www.oschina.net/code/explore/achartengine/client/AndroidManifest.xml";
  10.       String url1 = "http://www.oschina.net/code/explore";
  11.       String url2 = "http://www.oschina.net/code/explore/achartengine";
  12.       String url3 = "http://www.oschina.net/code/explore/achartengine/client";
  13.       UrlQueue.addElem(url);
  14.       UrlQueue.addElem(url1);
  15.       UrlQueue.addElem(url2);
  16.       UrlQueue.addElem(url3);
  17.       UrlDataHanding[] url_Handings = new UrlDataHanding[10];
  18.           for(int i = 0 ; i < 10 ; i++)
  19.           {
  20.               url_Handings[i] = new UrlDataHanding();
  21.               new Thread(url_Handings[i]).start();
  22.           }
  23.   }
  24. }

说明一下:由于我抓取的是针对oschina的,所以里面的url正则表达式不适合其他网站,需要自己修改一下。你也可以写成xml来配置。

小弟技术有限,有些地方确实写得不好,希望各位大牛不吝指教。

原文链接:http://www.cnblogs.com/HZhoog/archive/2012/05/08/2490374.html

标签: Java模拟网络爬虫, Java模拟搜索引擎, Java模拟搜索蜘蛛

添加新评论