适合C# Actor的消息执行方式(5):一个简单的网络爬虫
2010-09-30 20:50:14 来源:WEB开发网Monitor要处理的自然是ICrawlResponseHandler中的Succeeded或Failed方法:
void ICrawlResponseHandler.Succeeded(Crawler crawler, string url, List<string> links)
{
Console.WriteLine("{0} crawled, {1} link(s).", url, links.Count);
foreach (var newUrl in links)
{
if (!this.m_allUrls.Contains(newUrl))
{
this.m_allUrls.Add(newUrl);
this.m_readyToCrawl.Enqueue(newUrl);
}
}
this.DispatchCrawlingTasks(crawler);
}
void ICrawlResponseHandler.Failed(Crawler crawler, string url, Exception ex)
{
Console.WriteLine("{0} error occurred: {1}.", url, ex.Message);
this.DispatchCrawlingTasks(crawler);
}
在抓取成功时,Monitor将遍历links列表中的所有地址,如果发现新的url,则加入相关集合中。在抓取失败的情况下,我们也只是简单的继续下去而已。而“继续”则是由DispatchCrawlingTasks方法实现的,我们需要传入一个“可复用”的Crawler对象:
private void DispatchCrawlingTasks(Crawler reusableCrawler)
{
if (this.m_readyToCrawl.Count <= 0)
{
this.WorkingCrawlerCount--;
return;
}
var url = this.m_readyToCrawl.Dequeue();
reusableCrawler.Post(c => c.Crawl(this, url));
while (this.m_readyToCrawl.Count > 0 &&
this.WorkingCrawlerCount < this.MaxCrawlerCount)
{
var newUrl = this.m_readyToCrawl.Dequeue();
new Crawler().Post(c => c.Crawl(this, newUrl));
this.WorkingCrawlerCount++;
}
}
- ››适合做商品团购营销的网站
- ››适合所有浏览器hack的CSS技巧
- ››消息称中国移动即将获得iPhone 4销售权
- ››适合C# Actor的消息执行方式(1):Erlang中的模式...
- ››适合C# Actor的消息执行方式(2):C# Actor的尴尬...
- ››适合C# Actor的消息执行方式(3):中看不中用的解...
- ››适合C# Actor的消息执行方式(4):阶段性总结
- ››适合C# Actor的消息执行方式(5):一个简单的网络...
- ››适合C# Actor的消息执行方式(6):协变与逆变
- ››适合1-5个月经验的seo优化全过程分享
- ››消息称联通高层赴美谈引入iPhone4 将带WiFi
- ››消息称微软将在近期发布IE9 beta
更多精彩
赞助商链接