Пример #1
0
        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;
                    }
                }
            }
        }
Пример #2
0
 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);
 }