`
anyeeye
  • 浏览: 145642 次
  • 来自: ...
社区版块
存档分类
最新评论
阅读更多

http://playfish.iteye.com/blog/150126

 

 

这是一个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>
下面是这个程序的源码

Java代码 复制代码
  1. import java.util.*;   
  2. import java.net.*;   
  3. import java.io.*;   
  4. import java.util.regex.*;   
  5.   
  6. // 搜索Web爬行者   
  7. public class SearchCrawler implements Runnable{   
  8.     
  9. /* disallowListCache缓存robot不允许搜索的URL。 Robot协议在Web站点的根目录下设置一个robots.txt文件,  
  10.   *规定站点上的哪些页面是限制搜索的。 搜索程序应该在搜索过程中跳过这些区域,下面是robots.txt的一个例子:  
  11.  # robots.txt for http://somehost.com/  
  12.    User-agent: *  
  13.    Disallow: /cgi-bin/  
  14.    Disallow: /registration # /Disallow robots on registration page  
  15.    Disallow: /login  
  16.   */  
  17.   
  18.   
  19.   private HashMap< String,ArrayList< String>> disallowListCache = new HashMap< String,ArrayList< String>>();    
  20.   ArrayList< String> errorList= new ArrayList< String>();//错误信息    
  21.   ArrayList< String> result=new ArrayList< String>(); //搜索到的结果    
  22.   String startUrl;//开始搜索的起点   
  23.   int maxUrl;//最大处理的url数   
  24.   String searchString;//要搜索的字符串(英文)   
  25.   boolean caseSensitive=false;//是否区分大小写   
  26.   boolean limitHost=false;//是否在限制的主机内搜索   
  27.      
  28.   public SearchCrawler(String startUrl,int maxUrl,String searchString){   
  29.    this.startUrl=startUrl;   
  30.    this.maxUrl=maxUrl;   
  31.    this.searchString=searchString;   
  32.   }   
  33.   
  34.    public ArrayList< String> getResult(){   
  35.        return result;   
  36.    }   
  37.   
  38.   public void run(){//启动搜索线程   
  39.          
  40.        crawl(startUrl,maxUrl, searchString,limitHost,caseSensitive);   
  41.   }   
  42.       
  43.   
  44.     //检测URL格式   
  45.   private URL verifyUrl(String url) {   
  46.     // 只处理HTTP URLs.   
  47.     if (!url.toLowerCase().startsWith("http://"))   
  48.       return null;   
  49.   
  50.     URL verifiedUrl = null;   
  51.     try {   
  52.       verifiedUrl = new URL(url);   
  53.     } catch (Exception e) {   
  54.       return null;   
  55.     }   
  56.   
  57.     return verifiedUrl;   
  58.   }   
  59.   
  60.   // 检测robot是否允许访问给出的URL.   
  61.  private boolean isRobotAllowed(URL urlToCheck) {    
  62.     String host = urlToCheck.getHost().toLowerCase();//获取给出RUL的主机    
  63.     //System.out.println("主机="+host);   
  64.   
  65.     // 获取主机不允许搜索的URL缓存    
  66.     ArrayList< String> disallowList =disallowListCache.get(host);    
  67.   
  68.     // 如果还没有缓存,下载并缓存。    
  69.     if (disallowList == null) {    
  70.       disallowList = new ArrayList< String>();    
  71.       try {    
  72.         URL robotsFileUrl =new URL("http://" + host + "/robots.txt");    
  73.         BufferedReader reader =new BufferedReader(new InputStreamReader(robotsFileUrl.openStream()));    
  74.   
  75.         // 读robot文件,创建不允许访问的路径列表。    
  76.         String line;    
  77.         while ((line = reader.readLine()) != null) {    
  78.           if (line.indexOf("Disallow:") == 0) {//是否包含"Disallow:"    
  79.             String disallowPath =line.substring("Disallow:".length());//获取不允许访问路径    
  80.   
  81.             // 检查是否有注释。    
  82.             int commentIndex = disallowPath.indexOf("#");    
  83.             if (commentIndex != - 1) {    
  84.               disallowPath =disallowPath.substring(0, commentIndex);//去掉注释    
  85.             }    
  86.                 
  87.             disallowPath = disallowPath.trim();    
  88.             disallowList.add(disallowPath);    
  89.            }    
  90.          }    
  91.   
  92.         // 缓存此主机不允许访问的路径。    
  93.         disallowListCache.put(host, disallowList);    
  94.       } catch (Exception e) {    
  95.               return true//web站点根目录下没有robots.txt文件,返回真   
  96.       }    
  97.     }    
  98.   
  99.         
  100.     String file = urlToCheck.getFile();    
  101.     //System.out.println("文件getFile()="+file);   
  102.     for (int i = 0; i < disallowList.size(); i++) {    
  103.       String disallow = disallowList.get(i);    
  104.       if (file.startsWith(disallow)) {    
  105.         return false;    
  106.       }    
  107.     }    
  108.   
  109.     return true;    
  110.   }    
  111.   
  112.   
  113.   
  114.     
  115.   private String downloadPage(URL pageUrl) {   
  116.      try {   
  117.         // Open connection to URL for reading.   
  118.         BufferedReader reader =   
  119.           new BufferedReader(new InputStreamReader(pageUrl.openStream()));   
  120.   
  121.         // Read page into buffer.   
  122.         String line;   
  123.         StringBuffer pageBuffer = new StringBuffer();   
  124.         while ((line = reader.readLine()) != null) {   
  125.           pageBuffer.append(line);   
  126.         }   
  127.            
  128.         return pageBuffer.toString();   
  129.      } catch (Exception e) {   
  130.      }   
  131.   
  132.      return null;   
  133.   }   
  134.   
  135.   // 从URL中去掉"www"   
  136.   private String removeWwwFromUrl(String url) {   
  137.     int index = url.indexOf("://www.");   
  138.     if (index != -1) {   
  139.       return url.substring(0, index + 3) +   
  140.         url.substring(index + 7);   
  141.     }   
  142.   
  143.     return (url);   
  144.   }   
  145.   
  146.   // 解析页面并找出链接   
  147.   private ArrayList< String> retrieveLinks(URL pageUrl, String pageContents, HashSet crawledList,   
  148.     boolean limitHost)   
  149.   {   
  150.     // 用正则表达式编译链接的匹配模式。   
  151.     Pattern p =Pattern.compile("<a\\s+href\\s*=\\s*\"?(.*?)[\"|>]",Pattern.CASE_INSENSITIVE);   
  152.     Matcher m = p.matcher(pageContents);   
  153.   
  154.        
  155.     ArrayList< String> linkList = new ArrayList< String>();   
  156.     while (m.find()) {   
  157.       String link = m.group(1).trim();   
  158.          
  159.       if (link.length() < 1) {   
  160.         continue;   
  161.       }   
  162.   
  163.       // 跳过链到本页面内链接。   
  164.       if (link.charAt(0) == '#') {   
  165.         continue;   
  166.       }   
  167.   
  168.          
  169.       if (link.indexOf("mailto:") != -1) {   
  170.         continue;   
  171.       }   
  172.         
  173.       if (link.toLowerCase().indexOf("javascript") != -1) {   
  174.         continue;   
  175.       }   
  176.   
  177.       if (link.indexOf("://") == -1){   
  178.         if (link.charAt(0) == '/') {//处理绝对地     
  179.           link = "http://" + pageUrl.getHost()+":"+pageUrl.getPort()+ link;   
  180.         } else {            
  181.           String file = pageUrl.getFile();   
  182.           if (file.indexOf('/') == -1) {//处理相对地址   
  183.             link = "http://" + pageUrl.getHost()+":"+pageUrl.getPort() + "/" + link;   
  184.           } else {   
  185.             String path =file.substring(0, file.lastIndexOf('/') + 1);   
  186.             link = "http://" + pageUrl.getHost() +":"+pageUrl.getPort()+ path + link;   
  187.           }   
  188.         }   
  189.       }   
  190.   
  191.       int index = link.indexOf('#');   
  192.       if (index != -1) {   
  193.         link = link.substring(0, index);   
  194.       }   
  195.   
  196.       link = removeWwwFromUrl(link);   
  197.   
  198.       URL verifiedLink = verifyUrl(link);   
  199.       if (verifiedLink == null) {   
  200.         continue;   
  201.       }   
  202.   
  203.       /* 如果限定主机,排除那些不合条件的URL*/  
  204.       if (limitHost &&   
  205.           !pageUrl.getHost().toLowerCase().equals(   
  206.             verifiedLink.getHost().toLowerCase()))   
  207.       {   
  208.         continue;   
  209.       }   
  210.   
  211.       // 跳过那些已经处理的链接.   
  212.       if (crawledList.contains(link)) {   
  213.         continue;   
  214.       }   
  215.   
  216.        linkList.add(link);   
  217.     }   
  218.   
  219.    return (linkList);   
  220.   }   
  221.   
  222.  // 搜索下载Web页面的内容,判断在该页面内有没有指定的搜索字符串   
  223.   
  224.   private boolean searchStringMatches(String pageContents, String searchString, boolean caseSensitive){   
  225.        String searchContents = pageContents;    
  226.        if (!caseSensitive) {//如果不区分大小写   
  227.           searchContents = pageContents.toLowerCase();   
  228.        }   
  229.   
  230.        
  231.     Pattern p = Pattern.compile("[\\s]+");   
  232.     String[] terms = p.split(searchString);   
  233.     for (int i = 0; i < terms.length; i++) {   
  234.       if (caseSensitive) {   
  235.         if (searchContents.indexOf(terms[i]) == -1) {   
  236.           return false;   
  237.         }   
  238.       } else {   
  239.         if (searchContents.indexOf(terms[i].toLowerCase()) == -1) {   
  240.           return false;   
  241.         }   
  242.       }     }   
  243.   
  244.     return true;   
  245.   }   
  246.   
  247.      
  248.   //执行实际的搜索操作   
  249.   public ArrayList< String> crawl(String startUrl, int maxUrls, String searchString,boolean limithost,boolean caseSensitive )   
  250.   {    
  251.        
  252.     System.out.println("searchString="+searchString);   
  253.     HashSet< String> crawledList = new HashSet< String>();   
  254.     LinkedHashSet< String> toCrawlList = new LinkedHashSet< String>();   
  255.   
  256.      if (maxUrls < 1) {   
  257.         errorList.add("Invalid Max URLs value.");   
  258.         System.out.println("Invalid Max URLs value.");   
  259.       }   
  260.      
  261.        
  262.     if (searchString.length() < 1) {   
  263.       errorList.add("Missing Search String.");   
  264.       System.out.println("Missing search String");   
  265.     }   
  266.   
  267.        
  268.     if (errorList.size() > 0) {   
  269.       System.out.println("err!!!");   
  270.       return errorList;   
  271.       }   
  272.   
  273.        
  274.     // 从开始URL中移出www   
  275.     startUrl = removeWwwFromUrl(startUrl);   
  276.   
  277.        
  278.     toCrawlList.add(startUrl);   
  279.     while (toCrawlList.size() > 0) {   
  280.          
  281.       if (maxUrls != -1) {   
  282.         if (crawledList.size() == maxUrls) {   
  283.           break;   
  284.         }   
  285.       }   
  286.   
  287.       // Get URL at bottom of the list.   
  288.       String url =  toCrawlList.iterator().next();   
  289.   
  290.       // Remove URL from the to crawl list.   
  291.       toCrawlList.remove(url);   
  292.   
  293.       // Convert string url to URL object.   
  294.       URL verifiedUrl = verifyUrl(url);   
  295.   
  296.       // Skip URL if robots are not allowed to access it.   
  297.       if (!isRobotAllowed(verifiedUrl)) {   
  298.         continue;   
  299.       }   
  300.   
  301.        
  302.       // 增加已处理的URL到crawledList   
  303.       crawledList.add(url);   
  304.       String pageContents = downloadPage(verifiedUrl);   
  305.   
  306.          
  307.       if (pageContents != null && pageContents.length() > 0){   
  308.         // 从页面中获取有效的链接   
  309.         ArrayList< String> links =retrieveLinks(verifiedUrl, pageContents, crawledList,limitHost);   
  310.         
  311.         toCrawlList.addAll(links);   
  312.   
  313.         if (searchStringMatches(pageContents, searchString,caseSensitive))   
  314.         {   
  315.           result.add(url);   
  316.           System.out.println(url);   
  317.         }   
  318.      }   
  319.   
  320.        
  321.     }   
  322.    return result;   
  323.   }   
  324.   
  325.   // 主函数   
  326.   public static void main(String[] args) {   
  327.      if(args.length!=3){   
  328.         System.out.println("Usage:java SearchCrawler startUrl maxUrl searchString");   
  329.         return;   
  330.      }   
  331.     int max=Integer.parseInt(args[1]);   
  332.     SearchCrawler crawler = new SearchCrawler(args[0],max,args[2]);   
  333.     Thread  search=new Thread(crawler);   
  334.     System.out.println("Start searching...");   
  335.     System.out.println("result:");   
  336.     search.start();   
  337.       
  338.   }   
  339. }  
分享到:
评论

相关推荐

    ASP搜索引擎蜘蛛爬行日志生成程序

    总结来说,“ASP搜索引擎蜘蛛爬行日志生成程序”是ASP网站管理者的有力工具,它提供了一种途径来洞察搜索引擎如何看待和处理网站内容,进而提升网站的搜索引擎优化效果。通过细致的分析和持续的优化,网站可以实现更...

    C#仿搜索引擎爬行演示程序源码.RAR

    标题中的"C#仿搜索引擎爬行演示程序源码.RAR"是一个使用C#编程语言开发的项目,其目标是模仿搜索引擎的工作原理,实现对网站的爬行、数据抓取以及快照存储的功能。这个源码可以帮助开发者理解搜索引擎爬虫的实现过程...

    web漏洞爬虫,自动搜索web漏洞

    "WEB漏洞爬行虫"很可能是一款集成了上述功能的工具,它可以自动搜索网站的SQL注入、XSS、CSRF等常见漏洞。使用此类工具时,需注意合法性和道德性,尊重网站的robots.txt文件,避免非法入侵和滥用。 总之,Web漏洞...

    UniDisk:爬行者搜索关键字并比较得分

    优盘爬行者搜索关键字并比较得分安装先决条件Java 8 玛文Tomcat 8.X IntelliJ Ultimate(首选)Primefaces的安装步骤搭建神器mvn安装MVN测试与tomcat和神器之战一起运行码头工人我们使用Docker简化开发。 运行docker...

    bing、baidu搜索引擎爬虫 python3.6 and scrapy

    Bing提供的是必应Web搜索API,可以通过调用HTTP接口来获取搜索结果。而百度则有百度开放搜索API,同样通过HTTP请求获取数据。但要注意,直接大量爬取可能违反服务条款,所以一般会设置合适的延迟和请求限制。 ...

    crowler:爬行者比爬行者更酷

    【标题】:“Crowler:爬行者比爬行者更酷” 在IT行业中,"Crowler"这个名字似乎是对网络爬虫(通常拼写为“Crawler”)的一种独特诠释,暗示着它可能是一个专为JavaScript环境设计的高级爬虫工具。网络爬虫是一种...

    lolgirl:爬行者搜索大声笑的女孩

    "lolgirl:爬行者搜索大声笑的女孩"这个项目标题暗示我们,它可能是一个利用JavaScript实现的网络爬虫,目标是抓取互联网上与“大声笑的女孩”相关的内容,可能是图片、视频或者文章等。 首先,我们需要理解什么是...

    php记录搜索引擎爬行记录的实现代码

    在提供的代码中,`get_naps_bot()` 函数用于检测用户代理(User-Agent)字符串,从而判断访问者是否为搜索引擎的爬虫。这个函数检查了Googlebot、Baiduspider、msnbot、slurp、sosospider、sogou spider 和 yodaobot...

    iis 日志分析器(可以分析各大搜索引擎蜘蛛爬行记录)

    IIS(Internet Information Services)是微软提供的一个强大的Web服务器,用于托管网站和应用程序。IIS日志记录了服务器上所有HTTP交互的详细信息,对于网站管理员来说,这些日志是评估网站性能、诊断问题和理解用户...

    [完整][中文][WEB安全测试].(美)霍普.扫描版.pdf

     Paco Hope,是Cigital公司的一名技术经理,《Mastering FreeBsD and 0penBsDsecurity》 (由O’Reilly出版)的合著者之一。他也发表过有关误用、滥用案例和PKI的文章。他曾被邀请到会议就软件安全需求、Web应用...

    网站蜘蛛爬行统计系统 v1.5-ASP源码.zip

    综合以上,此压缩包提供了一个基于ASP的网站蜘蛛爬行统计系统源码,对于学习ASP编程、了解搜索引擎爬虫行为以及网站优化的实践者来说,这是一个宝贵的资源。通过分析和修改源码,用户可以深入理解如何构建这样的系统...

    E-FFC: an enhanced form-focused crawler for domain-specific deep web databases

    为了验证E-FFC的有效性,研究者们在一系列代表性的领域中对真实Web页面进行了实验。实验结果表明,与现有的特定领域深层网络聚焦表单爬虫相比,E-FFC在收获率、覆盖率以及爬行稳健性方面表现更为出色。 #### 结论与...

    web前端校园兼职项目:兼职宝

    10. SEO优化:对于一个公开的Web应用,考虑搜索引擎优化(SEO)也是必要的,这涉及到合适的元标签、可爬行的链接结构和优化的页面速度。 综上所述,"web前端校园兼职项目:兼职宝"是一个全面锻炼前端开发技能的实践...

    搜索引擎蜘蛛机器人工作原理.pdf

    随着World Wide Web的兴起,这类工具逐渐演变为能够索引和检索网页的搜索引擎。"蜘蛛"这一术语源于它们在网络中爬行的特性,就像蜘蛛在蜘蛛网上移动一样,它们沿着网页之间的链接不断探索。 网络蜘蛛的工作流程通常...

    搜索链接卡卡家园蜘蛛爬行日志分析器 PHP版-kakaseotool.rar

    【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或...

    搜索引擎优化行业术语大全(六).docx

    搜索引擎优化行业术语大全(六) 本篇文章是搜索引擎优化行业术语大全的第六篇,涵盖了从T到X的搜索引擎...本篇文章涵盖了搜索引擎优化领域的多个重要术语,对于搜索引擎优化从业者和网站编辑者具有重要的参考价值。

Global site tag (gtag.js) - Google Analytics