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

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

首先介绍每个类的功能

DownloadPage.java的功能是下载此超链接的页面源代码.

FunctionUtils.java 的功能是提供不同的静态方法,包括:页面链接正则表达式匹配,获取URL链接的元素,判断是否创建文件,获取页面的Url并将其转换为规范的Url,截取网页网页源文件的目标内容。

HrefOfPage.java 的功能是获取页面源代码的超链接。

UrlDataHanding.java 的功能是整合各个给类,实现url到获取数据到数据处理类。

UrlQueue.java 的未访问Url队列。

VisitedUrlQueue.java 已访问过的URL队列。

下面介绍一下每个类的源代码:

DownloadPage.java 此类要用到HttpClient组件。

  1. View Code
  2.  package com.sreach.spider;
  3.  import java.io.IOException;
  4.  import org.apache.http.HttpEntity;
  5.  import org.apache.http.HttpResponse;
  6.  import org.apache.http.client.ClientProtocolException;
  7.  import org.apache.http.client.HttpClient;
  8.  import org.apache.http.client.methods.HttpGet;
  9.  import org.apache.http.impl.client.DefaultHttpClient;
  10.  import org.apache.http.util.EntityUtils;
  11.  public class DownloadPage
  12.  {
  13.      /**
  14.       * 根据URL抓取网页内容
  15.       *
  16.       * @param url
  17.       * @return
  18.       */
  19.      public static String getContentFormUrl(String url)
  20.      {
  21.          /* 实例化一个HttpClient客户端 */
  22.          HttpClient client = new DefaultHttpClient();
  23.          HttpGet getHttp = new HttpGet(url);
  24.          String content = null;
  25.          HttpResponse response;
  26.          try
  27.          {
  28.              /*获得信息载体*/
  29.              response = client.execute(getHttp);
  30.              HttpEntity entity = response.getEntity();
  31.              VisitedUrlQueue.addElem(url);
  32.              if (entity != null)
  33.              {
  34.                  /* 转化为文本信息 */
  35.                  content = EntityUtils.toString(entity);
  36.                  /* 判断是否符合下载网页源代码到本地的条件 */
  37.                  if (FunctionUtils.isCreateFile(url)
  38.                          && FunctionUtils.isHasGoalContent(content) != -1)
  39.                  {
  40.                      FunctionUtils.createFile(FunctionUtils
  41.                              .getGoalContent(content), url);
  42.                  }
  43.              }
  44.          } catch (ClientProtocolException e)
  45.          {
  46.              e.printStackTrace();
  47.          } catch (IOException e)
  48.          {
  49.              e.printStackTrace();
  50.          } finally
  51.          {
  52.              client.getConnectionManager().shutdown();
  53.          }
  54.          return content;
  55.      }
  56.  }

FunctionUtils.java 此类的方法均为static方法

  1. View Code
  2. package com.sreach.spider;
  3. import java.io.BufferedWriter;
  4. import java.io.File;
  5. import java.io.FileOutputStream;
  6. import java.io.IOException;
  7. import java.io.OutputStreamWriter;
  8. import java.util.regex.Matcher;
  9. import java.util.regex.Pattern;
  10. public class FunctionUtils
  11. {
  12.     /**
  13.      * 匹配超链接的正则表达式
  14.      */
  15.     private static String pat = "http://www\\.oschina\\.net/code/explore/.*/\\w+\\.[a-zA-Z]+";
  16.     private static Pattern pattern = Pattern.compile(pat);
  17.     private static BufferedWriter writer = null;
  18.     /**
  19.      * 爬虫搜索深度
  20.      */
  21.     public static int depth = 0;
  22.     /**
  23.      * 以"/"来分割URL,获得超链接的元素
  24.      *
  25.      * @param url
  26.      * @return
  27.      */
  28.     public static String[] divUrl(String url)
  29.     {
  30.         return url.split("/");
  31.     }
  32.     /**
  33.      * 判断是否创建文件
  34.      *
  35.      * @param url
  36.      * @return
  37.      */
  38.     public static boolean isCreateFile(String url)
  39.     {
  40.         Matcher matcher = pattern.matcher(url);
  41.         return matcher.matches();
  42.     }
  43.     /**
  44.      * 创建对应文件
  45.      *
  46.      * @param content
  47.      * @param urlPath
  48.      */
  49.     public static void createFile(String content, String urlPath)
  50.     {
  51.         /* 分割url */
  52.         String[] elems = divUrl(urlPath);
  53.         StringBuffer path = new StringBuffer();
  54.         File file = null;
  55.         for (int i = 1; i < elems.length; i++)
  56.         {
  57.             if (i != elems.length - 1)
  58.             {
  59.                 path.append(elems[i]);
  60.                 path.append(File.separator);
  61.                 file = new File("D:" + File.separator + path.toString());
  62.             }
  63.             if (i == elems.length - 1)
  64.             {
  65.                 Pattern pattern = Pattern.compile("\\w+\\.[a-zA-Z]+");
  66.                 Matcher matcher = pattern.matcher(elems[i]);
  67.                 if ((matcher.matches()))
  68.                 {
  69.                     if (!file.exists())
  70.                     {
  71.                         file.mkdirs();
  72.                     }
  73.                     String[] fileName = elems[i].split("\\.");
  74.                     file = new File("D:" + File.separator + path.toString()
  75.                             + File.separator + fileName[0] + ".txt");
  76.                     try
  77.                     {
  78.                         file.createNewFile();
  79.                         writer = new BufferedWriter(new OutputStreamWriter(
  80.                                 new FileOutputStream(file)));
  81.                         writer.write(content);
  82.                         writer.flush();
  83.                         writer.close();
  84.                         System.out.println("创建文件成功");
  85.                     } catch (IOException e)
  86.                     {
  87.                         e.printStackTrace();
  88.                     }
  89.                 }
  90.             }
  91.         }
  92.     }
  93.     /**
  94.      * 获取页面的超链接并将其转换为正式的A标签
  95.      *
  96.      * @param href
  97.      * @return
  98.      */
  99.     public static String getHrefOfInOut(String href)
  100.     {
  101.         /* 内外部链接最终转化为完整的链接格式 */
  102.         String resultHref = null;
  103.         /* 判断是否为外部链接 */
  104.         if (href.startsWith("http://"))
  105.         {
  106.             resultHref = href;
  107.         } else
  108.         {
  109.             /* 如果是内部链接,则补充完整的链接地址,其他的格式忽略不处理,如:a href="#" */
  110.             if (href.startsWith("/"))
  111.             {
  112.                 resultHref = "http://www.oschina.net" + href;
  113.             }
  114.         }
  115.         return resultHref;
  116.     }
  117.     /**
  118.      * 截取网页网页源文件的目标内容
  119.      *
  120.      * @param content
  121.      * @return
  122.      */
  123.     public static String getGoalContent(String content)
  124.     {
  125.         int sign = content.indexOf("<pre class=\"");
  126.         String signContent = content.substring(sign);
  127.         int start = signContent.indexOf(">");
  128.         int end = signContent.indexOf("</pre>");
  129.         return signContent.substring(start + 1, end);
  130.     }
  131.     /**
  132.      * 检查网页源文件中是否有目标文件
  133.      *
  134.      * @param content
  135.      * @return
  136.      */
  137.     public static int isHasGoalContent(String content)
  138.     {
  139.         return content.indexOf("<pre class=\"");
  140.     }
  141. }

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

标签: Java网络爬虫, Java模拟蜘蛛

添加新评论