Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 274|回复: 0

[网络编程学习]一个Web搜索程序

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-10-31 00:00:17 | 显示全部楼层 |阅读模式
    这是一个web搜索的基本程序,从命令行输入搜索条件(起始的URL、处理url的最大数、要搜索的字符串),
    它就会逐个对Internet上的URL进行实时搜索,查找并输出匹配搜索条件的页面。 这个程序的原型来自《java编程艺术》,
    为了更好的分析,站长去掉了其中的GUI部分,并稍作修改以适用jdk1.5。以这个程序为基础,可以写出在互联网上搜索
    诸如图像、邮件、网页下载之类的“爬虫”。
    先请看程序运行的过程:


    D:java>javac  SearchCrawler.java(编译)

    D:java>java   SearchCrawler http://127.0.0.1:8080/zz3zcwbwebhome/index.jsp 20 java

      

      
      Start searching...
    result:
    searchString=java
    http://127.0.0.1:8080/zz3zcwbwebhome/index.jsp
    http://127.0.0.1:8080/zz3zcwbwebhome/reply.jsp
    http://127.0.0.1:8080/zz3zcwbwebhome/learn.jsp
    http://127.0.0.1:8080/zz3zcwbwebhome/download.jsp
    http://127.0.0.1:8080/zz3zcwbwebhome/article.jsp
    http://127.0.0.1:8080/zz3zcwbwebhome/myexample/jlGUIOverview.htm
    http://127.0.0.1:8080/zz3zcwbwebhome/myexample/Proxooldoc/index.HTML
    http://127.0.0.1:8080/zz3zcwbwebhome/view.jsp?id=301
    http://127.0.0.1:8080/zz3zcwbwebhome/view.jsp?id=297
    http://127.0.0.1:8080/zz3zcwbwebhome/view.jsp?id=291
    http://127.0.0.1:8080/zz3zcwbwebhome/view.jsp?id=286
    http://127.0.0.1:8080/zz3zcwbwebhome/view.jsp?id=285
    http://127.0.0.1:8080/zz3zcwbwebhome/view.jsp?id=284
    http://127.0.0.1:8080/zz3zcwbwebhome/view.jsp?id=276
    http://127.0.0.1:8080/zz3zcwbwebhome/view.jsp?id=272  
      
       
       
       

       
      
      
    又如:
    D:java>java    SearchCrawler http://www.sina.com  20 java
    Start searching...
    result:
    searchString=java
    http://sina.com
    http://redirect.sina.com/WWW/sinaCN/www.sina.com.cn class=a2
    http://redirect.sina.com/WWW/sinaCN/www.sina.com.cn class=a8
    http://redirect.sina.com/WWW/sinaHK/www.sina.com.hk class=a2
    http://redirect.sina.com/WWW/sinaTW/www.sina.com.tw class=a8
    http://redirect.sina.com/WWW/sinaUS/home.sina.com class=a8
    http://redirect.sina.com/WWW/smsCN/sms.sina.com.cn/ class=a2
    http://redirect.sina.com/WWW/smsCN/sms.sina.com.cn/ class=a3
    http://redirect.sina.com/WWW/sinaNet/www.sina.net/ class=a3


    D:java>
    下面是这个程序的源码
    1. import java.util.*;
    2. import java.net.*;
    3. import java.io.*;
    4. import java.util.regex.*;
    5. // 搜索Web爬行者
    6. public class SearchCrawler implements Runnable{

    7. /* disallowListCache缓存robot不允许搜索的URL。 Robot协议在Web站点的根目录下设置一个robots.txt文件,
    8.   *规定站点上的哪些页面是限制搜索的。 搜索程序应该在搜索过程中跳过这些区域,下面是robots.txt的一个例子:
    9. # robots.txt for http://somehost.com/
    10.    User-agent: *
    11.    Disallow: /cgi-bin/
    12.    Disallow: /registration # /Disallow robots on registration page
    13.    Disallow: /login
    14.   */
    15.   private HashMap< String,ArrayList< String>> disallowListCache = new HashMap< String,ArrayList< String>>();
    16.   ArrayList< String> errorList= new ArrayList< String>();//错误信息
    17.   ArrayList< String> result=new ArrayList< String>(); //搜索到的结果
    18.   String startUrl;//开始搜索的起点
    19.   int maxUrl;//最大处理的url数
    20.   String searchString;//要搜索的字符串(英文)
    21.   boolean caseSensitive=false;//是否区分大小写
    22.   boolean limitHost=false;//是否在限制的主机内搜索
    23.   
    24.   public SearchCrawler(String startUrl,int maxUrl,String searchString){
    25.    this.startUrl=startUrl;
    26.    this.maxUrl=maxUrl;
    27.    this.searchString=searchString;
    28.   }
    29.    public ArrayList< String> getResult(){
    30.        return result;
    31.    }
    32.   public void run(){//启动搜索线程
    33.       
    34.        crawl(startUrl,maxUrl, searchString,limitHost,caseSensitive);
    35.   }
    36.    
    37.     //检测URL格式
    38.   private URL verifyUrl(String url) {
    39.     // 只处理HTTP URLs.
    40.     if (!url.toLowerCase().startsWith("http://"))
    41.       return null;
    42.     URL verifiedUrl = null;
    43.     try {
    44.       verifiedUrl = new URL(url);
    45.     } catch (Exception e) {
    46.       return null;
    47.     }
    48.     return verifiedUrl;
    49.   }
    50.   // 检测robot是否允许访问给出的URL.
    51. private boolean isRobotAllowed(URL urlToCheck) {
    52.     String host = urlToCheck.getHost().toLowerCase();//获取给出RUL的主机
    53.     //System.out.println("主机="+host);
    54.     // 获取主机不允许搜索的URL缓存
    55.     ArrayList< String> disallowList =disallowListCache.get(host);
    56.     // 如果还没有缓存,下载并缓存。
    57.     if (disallowList == null) {
    58.       disallowList = new ArrayList< String>();
    59.       try {
    60.         URL robotsFileUrl =new URL("http://" + host + "/robots.txt");
    61.         BufferedReader reader =new BufferedReader(new InputStreamReader(robotsFileUrl.openStream()));
    62.         // 读robot文件,创建不允许访问的路径列表。
    63.         String line;
    64.         while ((line = reader.readLine()) != null) {
    65.           if (line.indexOf("Disallow:") == 0) {//是否包含"Disallow:"
    66.             String disallowPath =line.substring("Disallow:".length());//获取不允许访问路径
    67.             // 检查是否有注释。
    68.             int commentIndex = disallowPath.indexOf("#");
    69.             if (commentIndex != - 1) {
    70.               disallowPath =disallowPath.substring(0, commentIndex);//去掉注释
    71.             }
    72.             
    73.             disallowPath = disallowPath.trim();
    74.             disallowList.add(disallowPath);
    75.            }
    76.          }
    77.         // 缓存此主机不允许访问的路径。
    78.         disallowListCache.put(host, disallowList);
    79.       } catch (Exception e) {
    80.               return true; //web站点根目录下没有robots.txt文件,返回真
    81.       }
    82.     }
    83.      
    84.     String file = urlToCheck.getFile();
    85.     //System.out.println("文件getFile()="+file);
    86.     for (int i = 0; i < disallowList.size(); i++) {
    87.       String disallow = disallowList.get(i);
    88.       if (file.startsWith(disallow)) {
    89.         return false;
    90.       }
    91.     }
    92.     return true;
    93.   }

    94.   private String downloadPage(URL pageUrl) {
    95.      try {
    96.         // Open connection to URL for reading.
    97.         BufferedReader reader =
    98.           new BufferedReader(new InputStreamReader(pageUrl.openStream()));
    99.         // Read page into buffer.
    100.         String line;
    101.         StringBuffer pageBuffer = new StringBuffer();
    102.         while ((line = reader.readLine()) != null) {
    103.           pageBuffer.append(line);
    104.         }
    105.         
    106.         return pageBuffer.toString();
    107.      } catch (Exception e) {
    108.      }
    109.      return null;
    110.   }
    111.   // 从URL中去掉"www"
    112.   private String removeWwwFromUrl(String url) {
    113.     int index = url.indexOf("://www.");
    114.     if (index != -1) {
    115.       return url.substring(0, index + 3) +
    116.         url.substring(index + 7);
    117.     }
    118.     return (url);
    119.   }
    120.   // 解析页面并找出链接
    121.   private ArrayList< String> retrieveLinks(URL pageUrl, String pageContents, HashSet crawledList,
    122.     boolean limitHost)
    123.   {
    124.     // 用正则表达式编译链接的匹配模式。
    125.     Pattern p =Pattern.compile("< a\s+href\s*=\s*"?(.*?)["|>]",Pattern.CASE_INSENSITIVE);
    126.     Matcher m = p.matcher(pageContents);
    127.    
    128.     ArrayList< String> linkList = new ArrayList< String>();
    129.     while (m.find()) {
    130.       String link = m.group(1).trim();
    131.       
    132.       if (link.length() < 1) {
    133.         continue;
    134.       }
    135.       // 跳过链到本页面内链接。
    136.       if (link.charAt(0) == "#") {
    137.         continue;
    138.       }
    139.       
    140.       if (link.indexOf("mailto:") != -1) {
    141.         continue;
    142.       }
    143.      
    144.       if (link.toLowerCase().indexOf("javascript") != -1) {
    145.         continue;
    146.       }
    147.       if (link.indexOf("://") == -1){
    148.         if (link.charAt(0) == "/") {//处理绝对地  
    149.           link = "http://" + pageUrl.getHost()+":"+pageUrl.getPort()+ link;
    150.         } else {         
    151.           String file = pageUrl.getFile();
    152.           if (file.indexOf("/") == -1) {//处理相对地址
    153.             link = "http://" + pageUrl.getHost()+":"+pageUrl.getPort() + "/" + link;
    154.           } else {
    155.             String path =file.substring(0, file.lastIndexOf("/") + 1);
    156.             link = "http://" + pageUrl.getHost() +":"+pageUrl.getPort()+ path + link;
    157.           }
    158.         }
    159.       }
    160.       int index = link.indexOf("#");
    161.       if (index != -1) {
    162.         link = link.substring(0, index);
    163.       }
    164.       link = removeWwwFromUrl(link);
    165.       URL verifiedLink = verifyUrl(link);
    166.       if (verifiedLink == null) {
    167.         continue;
    168.       }
    169.       /* 如果限定主机,排除那些不合条件的URL*/
    170.       if (limitHost &&
    171.           !pageUrl.getHost().toLowerCase().equals(
    172.             verifiedLink.getHost().toLowerCase()))
    173.       {
    174.         continue;
    175.       }
    176.       // 跳过那些已经处理的链接.
    177.       if (crawledList.contains(link)) {
    178.         continue;
    179.       }
    180.        linkList.add(link);
    181.     }
    182.    return (linkList);
    183.   }
    184. // 搜索下载Web页面的内容,判断在该页面内有没有指定的搜索字符串
    185.   private boolean searchStringMatches(String pageContents, String searchString, boolean caseSensitive){
    186.        String searchContents = pageContents;
    187.        if (!caseSensitive) {//如果不区分大小写
    188.           searchContents = pageContents.toLowerCase();
    189.        }
    190.    
    191.     Pattern p = Pattern.compile("[\s]+");
    192.     String[] terms = p.split(searchString);
    193.     for (int i = 0; i < terms.length; i++) {
    194.       if (caseSensitive) {
    195.         if (searchContents.indexOf(terms[i]) == -1) {
    196.           return false;
    197.         }
    198.       } else {
    199.         if (searchContents.indexOf(terms[i].toLowerCase()) == -1) {
    200.           return false;
    201.         }
    202.       }     }
    203.     return true;
    204.   }
    205.   
    206.   //执行实际的搜索操作
    207.   public ArrayList< String> crawl(String startUrl, int maxUrls, String searchString,boolean limithost,boolean caseSensitive )
    208.   {
    209.    
    210.     System.out.println("searchString="+searchString);
    211.     HashSet< String> crawledList = new HashSet< String>();
    212.     LinkedHashSet< String> toCrawlList = new LinkedHashSet< String>();
    213.      if (maxUrls < 1) {
    214.         errorList.add("Invalid Max URLs value.");
    215.         System.out.println("Invalid Max URLs value.");
    216.       }
    217.   
    218.    
    219.     if (searchString.length() < 1) {
    220.       errorList.add("Missing Search String.");
    221.       System.out.println("Missing search String");
    222.     }
    223.    
    224.     if (errorList.size() > 0) {
    225.       System.out.println("err!!!");
    226.       return errorList;
    227.       }
    228.    
    229.     // 从开始URL中移出www
    230.     startUrl = removeWwwFromUrl(startUrl);
    231.    
    232.     toCrawlList.add(startUrl);
    233.     while (toCrawlList.size() > 0) {
    234.       
    235.       if (maxUrls != -1) {
    236.         if (crawledList.size() == maxUrls) {
    237.           break;
    238.         }
    239.       }
    240.       // Get URL at bottom of the list.
    241.       String url =  toCrawlList.iterator().next();
    242.       // Remove URL from the to crawl list.
    243.       toCrawlList.remove(url);
    244.       // Convert string url to URL object.
    245.       URL verifiedUrl = verifyUrl(url);
    246.       // Skip URL if robots are not allowed to access it.
    247.       if (!isRobotAllowed(verifiedUrl)) {
    248.         continue;
    249.       }
    250.    
    251.       // 增加已处理的URL到crawledList
    252.       crawledList.add(url);
    253.       String pageContents = downloadPage(verifiedUrl);
    254.       
    255.       if (pageContents != null && pageContents.length() > 0){
    256.         // 从页面中获取有效的链接
    257.         ArrayList< String> links =retrieveLinks(verifiedUrl, pageContents, crawledList,limitHost);
    258.      
    259.         toCrawlList.addAll(links);
    260.         if (searchStringMatches(pageContents, searchString,caseSensitive))
    261.         {
    262.           result.add(url);
    263.           System.out.println(url);
    264.         }
    265.      }
    266.    
    267.     }
    268.    return result;
    269.   }
    270.   // 主函数
    271.   public static void main(String[] args) {
    272.      if(args.length!=3){
    273.         System.out.println("Usage:java SearchCrawler startUrl maxUrl searchString");
    274.         return;
    275.      }
    276.     int max=Integer.parseInt(args[1]);
    277.     SearchCrawler crawler = new SearchCrawler(args[0],max,args[2]);
    278.     Thread  search=new Thread(crawler);
    279.     System.out.println("Start searching...");
    280.     System.out.println("result:");
    281.     search.start();
    282.    
    283.   }
    284. }
    复制代码


      
      
       
       

         
       

         
       
      

         
      

      



                            function TempSave(ElementID)
                            {
                                    CommentsPersistDiv.setAttribute("CommentContent",document.getElementById(ElementID).value);
                                    CommentsPersistDiv.save("CommentXMLStore");
                            }
                            function Restore(ElementID)
                            {
                                    CommentsPersistDiv.load("CommentXMLStore");
                                    document.getElementById(ElementID).value=CommentsPersistDiv.getAttribute("CommentContent");
                            }
                   
                      











    源码下载:http://file.javaxxz.com/2014/10/31/000017218.zip
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-2-25 19:04 , Processed in 0.376103 second(s), 46 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表