当前访客身份:游客 [ 登录 | 加入 OSCHINA ]

代码分享

当前位置:
代码分享 » C#  » 网络编程
杨军军

简单的网络爬虫

杨军军 发布于 2011年08月05日 9时, 4评/6970阅
分享到: 
收藏 +0
2
从指定的链接开始,读取该地址的内容以查找链接;如果找到链接,那么询问用户是否希望进入该链接,或者在当前页面搜索另一链接,或着退出。 (来源: C#3.0 完全参考手册
标签: 爬虫

代码片段(2) [全屏查看所有代码]

1. [代码][C#]代码     跳至 [1] [全屏预览]

/* MiniCrawler: A skeletal Web crawler. 
 
   Usage: 
     To start crawling, specify a starting 
     URI on the command line. For example, 
     to start at McGraw-Hill.com use this 
     command line: 
   
       MiniCrawler http://McGraw-Hill.com  
   
*/  
 
using System; 
using System.Net; 
using System.IO; 
 
class MiniCrawler {  
 
  // Find a link in a content string. 
  static string FindLink(string htmlstr,  
                         ref int startloc) { 
    int i; 
    int start, end; 
    string uri = null; 
    string lowcasestr = htmlstr.ToLower(); 
 
    i = lowcasestr.IndexOf("href=\"http", startloc); 
    if(i != -1) { 
      start = htmlstr.IndexOf('"', i) + 1; 
      end = htmlstr.IndexOf('"', start); 
      uri = htmlstr.Substring(start, end-start); 
      startloc = end; 
    } 
             
    return uri; 
  } 
 
  static void Main(string[] args) { 
    string link = null; 
    string str; 
    string answer; 
 
    int curloc; // holds current location in response 
 
    if(args.Length != 1) { 
      Console.WriteLine("Usage: MiniCrawler <uri>"); 
      return ; 
    } 
 
    string uristr = args[0]; // holds current URI 
 
    try { 
 
      do { 
        Console.WriteLine("Linking to " + uristr); 
 
        // Create a WebRequest to the specified URI. 
        HttpWebRequest req = (HttpWebRequest) 
               WebRequest.Create(uristr); 
 
        uristr = null; // disallow further use of this URI 
 
        // Send that request and return the response. 
        HttpWebResponse resp = (HttpWebResponse) 
               req.GetResponse(); 
 
        // From the response, obtain an input stream. 
        Stream istrm = resp.GetResponseStream(); 
 
        // Wrap the input stream in a StreamReader. 
        StreamReader rdr = new StreamReader(istrm); 
 
        // Read in the entire page. 
        str = rdr.ReadToEnd(); 
 
        curloc = 0; 
        
        do { 
          // Find the next URI to link to. 
          link = FindLink(str, ref curloc); 
 
          if(link != null) { 
            Console.WriteLine("Link found: " + link); 
 
            Console.Write("Link, More, Quit?"); 
            answer = Console.ReadLine(); 
 
            if(string.Compare(answer, "L", true) == 0) { 
              uristr = string.Copy(link); 
              break; 
            } else if(string.Compare(answer, "Q", true) == 0) { 
              break; 
            } else if(string.Compare(answer, "M", true) == 0) { 
              Console.WriteLine("Searching for another link."); 
            } 
          } else { 
            Console.WriteLine("No link found."); 
            break; 
          } 
 
        } while(link.Length > 0); 
 
        // Close the Response. 
        resp.Close(); 
      } while(uristr != null); 
 
    } catch(WebException exc) { 
      Console.WriteLine("Network Error: " + exc.Message +  
                        "\nStatus code: " + exc.Status); 
    } catch(ProtocolViolationException exc) { 
      Console.WriteLine("Protocol Error: " + exc.Message); 
    } catch(UriFormatException exc) { 
      Console.WriteLine("URI Format Error: " + exc.Message); 
    } catch(NotSupportedException exc) { 
      Console.WriteLine("Unknown Protocol: " + exc.Message); 
    } catch(IOException exc) { 
      Console.WriteLine("I/O Error: " + exc.Message); 
    } 
 
    Console.WriteLine("Terminating MiniCrawler."); 
  } 
}

2. [图片] temp.png    



开源中国-程序员在线工具:Git代码托管 API文档大全(120+) JS在线编辑演示 二维码 更多»

发表评论 回到顶部 网友评论(4)

  • 1楼:好威支有希 发表于 2011-08-07 01:06 回复此评论
    没有多线程哇,这虫爬不回来的
  • 2楼:游而不击 发表于 2011-08-12 13:14 回复此评论
    我居然连一个正则表达式都没看到,楼主还需努力啊
  • 3楼:lucika 发表于 2011-10-05 20:44 回复此评论
    不错。这种方式只能查找标准的链接。对于非标准链接无能为力。如href=sports.163.com,这种方式也是可以访问的。
  • 4楼:宋亚非 发表于 2012-04-19 11:16 回复此评论
    没多线程不说 还没有确定爬虫的长度 这样的爬虫怎样结束? 要是爬取了重复的链接怎么办? 没有过滤一些不是链接的
开源从代码分享开始 分享代码