Java网络爬虫的实现

发表于:2011-3-10 09:40

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:grunt1223    来源:51Testing软件测试网采编

分享:

  Java代码

  • private CrawlerUrl getNextUrl() throws Throwable {     
  •     CrawlerUrl nextUrl = null;     
  •     while ((nextUrl == null) && (!urlQueue.isEmpty())) {     
  •         CrawlerUrl crawlerUrl = this.urlQueue.remove();     
  •                     
  •         //doWeHavePermissionToVisit:是否有权限访问该URL,友好的爬虫会根据网站提供的"Robot.txt"中配置的规则进行爬取     
  •         //isUrlAlreadyVisited:URL是否访问过,大型的搜索引擎往往采用BloomFilter进行排重,这里简单使用HashMap     
  •         //isDepthAcceptable:是否达到指定的深度上限。爬虫一般采取广度优先的方式。一些网站会构建爬虫陷阱(自动生成一些无效链接使爬虫陷入死循环),采用深度限制加以避免     
  •         if (doWeHavePermissionToVisit(crawlerUrl)     
  •             && (!isUrlAlreadyVisited(crawlerUrl))      
  •             && isDepthAcceptable(crawlerUrl)) {     
  •             nextUrl = crawlerUrl;     
  •             // System.out.println("Next url to be visited is " + nextUrl);     
  •         }     
  •     }     
  •     return nextUrl;     
  • }
  •   更多的关于robot.txt的具体写法,可参考以下这篇文章:http://www.bloghuman.com/post/67/

      getContent内部使用apache的httpclient 4.1获取网页内容,具体代码如下:

      Java代码

  • private String getContent(CrawlerUrl url) throws Throwable {     
  •     //HttpClient4.1的调用与之前的方式不同     
  •     HttpClient client = new DefaultHttpClient();     
  •     HttpGet httpGet = new HttpGet(url.getUrlString());     
  •     StringBuffer strBuf = new StringBuffer();     
  •     HttpResponse response = client.execute(httpGet);     
  •     if (HttpStatus.SC_OK == response.getStatusLine().getStatusCode()) {     
  •         HttpEntity entity = response.getEntity();     
  •         if (entity != null) {     
  •             BufferedReader reader = new BufferedReader(     
  •                 new InputStreamReader(entity.getContent(), "UTF-8"));     
  •             String line = null;     
  •             if (entity.getContentLength() > 0) {     
  •                 strBuf = new StringBuffer((int) entity.getContentLength());     
  •                 while ((line = reader.readLine()) != null) {     
  •                     strBuf.append(line);     
  •                 }     
  •             }     
  •         }     
  •         if (entity != null) {     
  •             entity.consumeContent();     
  •         }     
  •     }     
  •     //将url标记为已访问     
  •     markUrlAsVisited(url);     
  •     return strBuf.toString();     
  • }
  •   对于垂直型应用来说,数据的准确性往往更为重要。聚焦型爬虫的主要特点是,只收集和主题相关的数据,这就是isContentRelevant方法的作用。这里或许要使用分类预测技术,为简单起见,采用正则匹配来代替。其主要代码如下:

      Java代码

  • public static boolean isContentRelevant(String content,     
  • Pattern regexpPattern) {     
  •     boolean retValue = false;     
  •     if (content != null) {     
  •         //是否符合正则表达式的条件     
  •         Matcher m = regexpPattern.matcher(content.toLowerCase());     
  •         retValue = m.find();     
  •     }     
  •     return retValue;     
  • }
  • 32/3<123>
    精选软件测试好文,快来阅读吧~

    关注51Testing

    联系我们

    快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

    法律顾问:上海兰迪律师事务所 项棋律师
    版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
    投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

    沪ICP备05003035号

    沪公网安备 31010102002173号