//public virtual List<Uri> Crawl2(Uri websiteUri, PageDownloader pageDownloader, PageParser pageParser)
        //{
        //    List<Uri> result = new List<Uri>();
        //    Queue<Uri> linksToParse = new Queue<Uri>();
        //    linksToParse.Enqueue(websiteUri);
        //
        //    while (linksToParse.Count!=0)
        //    {
        //        var linkToParse = linksToParse.Dequeue();
        //        result.Add(linkToParse);
        //        string htmlPage = pageDownloader.GetPage(linkToParse);
        //        var parsedLinks = pageParser.GetLinks(htmlPage, websiteUri);
        //
        //        foreach (var link in parsedLinks)
        //        {
        //            if(!result.Contains(link)&&!linksToParse.Contains(link))
        //                linksToParse.Enqueue(link);
        //        }
        //    }
        //
        //    return result
        //        .Distinct()
        //        .ToList();
        //}

        public virtual List <Uri> Crawl(Uri websiteUri, PageDownloader pageDownloader, PageParser pageParser)
        {
            List <Uri> result       = new List <Uri>();
            List <Uri> linksToParse = new List <Uri>();

            linksToParse.Add(websiteUri);

            while (linksToParse.Count != 0)
            {
                result.Add(linksToParse[0]);
                string htmlPage    = pageDownloader.GetPage(linksToParse[0]);
                var    parsedLinks = pageParser.GetLinks(htmlPage, websiteUri);

                foreach (var link in parsedLinks)
                {
                    if (!result.Contains(link) && !linksToParse.Contains(link))
                    {
                        linksToParse.Add(link);
                    }
                }
                linksToParse.RemoveAt(0);
            }

            return(result
                   .Distinct()
                   .ToList());
        }
示例#2
0
        virtual public Uri GetSitemapUri(Uri baseUri, PageDownloader downloader)
        {
            Uri sitemapUri;

            try
            {
                Uri robotsTxtUri = new Uri(baseUri, "/robots.txt");

                string fileContent = "";

                fileContent = downloader.GetPage(robotsTxtUri);

                var sitemapString = fileContent.Split('\n')
                                    .Select(x => x.Trim())
                                    .Where(x => x.StartsWith("Sitemap:"))
                                    .FirstOrDefault();

                if (!String.IsNullOrEmpty(sitemapString))
                {
                    sitemapString = sitemapString
                                    .Replace("Sitemap:", "")
                                    .Trim();
                    sitemapUri = new Uri(sitemapString);
                }
                else
                {
                    sitemapUri = new Uri(baseUri, "/sitemap.xml");
                }

                return(sitemapUri);
            }
            catch
            {
                return(sitemapUri = new Uri(baseUri, "/sitemap.xml")); //default sitemap url
            }
        }
示例#3
0
        virtual public List <Uri> Crawl(Uri websiteUri, SitemapLinkReceiver linkReceiver, PageDownloader pageDownloader, SitemapParser sitemapParser)
        {
            Uri        sitemapUri   = linkReceiver.GetSitemapUri(websiteUri, pageDownloader);
            string     sitemap      = pageDownloader.GetPage(sitemapUri);
            List <Uri> crawledLinks = sitemapParser.GetLinks(sitemap, websiteUri);

            return(crawledLinks);
        }