private void CrawlDomain(Uri domainUri) { CrawlingState state = new CrawlingState(); //Состояние кроулинга для домена var uriQueue = new Queue <Uri>(); //Очередь для нерекурсивного обхода в ширину var uriHashSet = new HashSet <string>(); //Множество обойденных ури uriQueue.Enqueue(domainUri); Uri baseUri = domainUri; var mwc = new MyWebClient(); int levelRefsCount = uriQueue.Count;//Количество ссылок на уровне int nextLevelRefs = 0; while (true) { if (uriQueue.Count == 0) { break; } Uri uri = uriQueue.Dequeue(); if (levelRefsCount == 0) //Если прошли все ссылки уровня { state.Depth++; levelRefsCount = nextLevelRefs; nextLevelRefs = 0; } else { levelRefsCount--; } baseUri = UriHelper.MakeAbsoluteUriIfNeeded(uri, baseUri); if (!uriHashSet.Contains(uri.AbsolutePath) &&//Чтобы не зациклиться CrawlPermitter.CanCrawl(state, uri, domainUri)) { try { //todo:статистика кодов статуса var htmlDoc = new HtmlDocument(); string htmlStr = mwc.DownloadString(baseUri); htmlDoc.LoadHtml(htmlStr); PageContentLoaded?.Invoke(this, new PageContentLoadedEventArgs(uri, htmlDoc.DocumentNode.OuterHtml)); uriHashSet.Add(baseUri.AbsolutePath); var uris = GetPageLinks(htmlDoc, baseUri); foreach (var u in uris) { nextLevelRefs++; uriQueue.Enqueue(u); } } catch (WebException wex) { var status = wex.Status; } } } }
public bool CanCrawl(CrawlingState crawlingState, Uri nextUri, Uri domainUri) { return(true); }
public bool CanCrawl(CrawlingState crawlingState, Uri nextUri, Uri domainUri) { return(nextUri.Host == domainUri.Host); }