WEB开发网
开发学院软件开发C语言 适合C# Actor的消息执行方式(5):一个简单的网络... 阅读

适合C# Actor的消息执行方式(5):一个简单的网络爬虫

 2010-09-30 20:50:14 来源:WEB开发网   
核心提示: 我们先从简单的Crawler类的实现开始,Crawler类只需要实现ICrawlRequestHandler接口的Crawl方法即可:voidICrawlRequestHandler.Crawl(Monitormonitor,stringurl){try{stringcontent=newWeb

我们先从简单的Crawler类的实现开始。Crawler类只需要实现ICrawlRequestHandler接口的Crawl方法即可:

void ICrawlRequestHandler.Crawl(Monitor monitor, string url) 
{ 
  try 
  { 
    string content = new WebClient().DownloadString(url); 
 
    var matches = Regex.Matches(content, @"href=""(http://[^""]+)""").Cast<Match>(); 
    var links = matches.Select(m => m.Groups[1].Value).Distinct().ToList(); 
    monitor.Post(m => m.Succeeded(this, url, links)); 
  } 
  catch (Exception ex) 
  { 
    monitor.Post(m => m.Failed(this, url, ex)); 
  } 
} 

没错,使用WebClient下载页面内容只需要一行代码就可以了。然后便是使用正则表达式提取出页面上所有的链接。很显然这里是有问题的,因为我们我只分析出以“http://”开头的地址,但是无视其他的“相对地址”——不过作为一个小实验来说已经足够说明问题了。最后自然是使用Post方法将结果发还给Monitor。在抛出异常的情况下,这几行代码的逻辑也非常自然。

Monitor实现

Monitor相对来说便略显复杂了一些。我们知道,Monitor要负责控制Crawler的数量,那么必然需要负责维护一些必要的字段:

private HashSet<string> m_allUrls; // 所有待爬或爬过的url 
private Queue<string> m_readyToCrawl; // 待爬的url 
 
public int MaxCrawlerCount { private set; get; } // 最大爬虫数目 
public int WorkingCrawlerCount { private set; get; } // 正在工作的爬虫数目 
 
public Monitor(int maxCrawlerCount) 
{ 
  this.m_allUrls = new HashSet<string>(); 
  this.m_readyToCrawl = new Queue<string>(); 
  this.MaxCrawlerCount = maxCrawlerCount; 
  this.WorkingCrawlerCount = 0; 
} 

上一页  1 2 3 4 5 6  下一页

Tags:适合 Actor 消息

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接