Ejemplo n.º 1
0
        private void UpdateProgress(CrawlPageResults results)
        {
            _statistics.AppendPageResults(results);

            if (_crawledUri.Count % _saveProgressPeriod == 0)
            {
                SaveProgress();
            }
        }
Ejemplo n.º 2
0
        private async Task LoadContent(CrawlPageResults results)
        {
            if (results == null)
            {
                return;
            }

            if (string.IsNullOrEmpty(_configuration.ContentFileMask))
            {
                return;
            }

            string directoryName = Path.Combine(
                _domainDirectory,
                GetDirectoryNameByUri(results.CrawledUri));

            Regex maskRegex = FileMaskToRegex(_configuration.ContentFileMask);

            foreach (var uri in results.ContentUris)
            {
                string fileName = System.IO.Path.GetFileName(uri.LocalPath);

                if (maskRegex.IsMatch(fileName))
                {
                    Directory.CreateDirectory(directoryName);

                    var webRequest = WebRequest.Create(uri);

                    try
                    {
                        using (WebResponse response = await webRequest.GetResponseAsync())
                        {
                            using (Stream resopnseStream = response.GetResponseStream())
                            {
                                using (var fileStream = File.OpenWrite(Path.Combine(directoryName, fileName)))
                                {
                                    await resopnseStream.CopyToAsync(fileStream);
                                }
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        Logger.Log(
                            LogLevel.Error,
                            ex,
                            $"Saving content exception. {uri}");
                    }
                }
            }
        }
Ejemplo n.º 3
0
        private async Task <Tuple <CrawlPageResults, int> > CrawlPage(CrawlQueueItem crawlItem, CancellationToken cancellationToken)
        {
            CrawlPageResults results = null;

            try
            {
                // Раскладываем в корень страницы.
                using (FileStream pageStream = new FileStream(
                           Path.Combine(
                               _domainDirectory,
                               GetPageFileNameByUri(crawlItem.PageUri)),
                           FileMode.Create))
                {
                    var pageCrawler = new PageCrawler(crawlItem.PageUri);

                    results =
                        await pageCrawler.StartCrawling(pageStream, cancellationToken);

                    // В прекрасном мире, здесь был бы стрим, который пропускал через себя страницу,
                    // которую по мере вычитывания ему давал PageCrawler и, тем самым проверялось
                    // бы и стоп условие и все шло бы без излишних проверок и прочего, но имеем то,
                    // что имеем.
                    if (!string.IsNullOrEmpty(_configuration.StopString) &&
                        results.PageContent.Contains(_configuration.StopString))
                    {
                        Logger.Log(
                            LogLevel.Info,
                            $"Stop string found at {crawlItem.PageUri}");

                        _contentFound = true;
                    }
                }

                await LoadContent(results);
            }
            catch (Exception e)
            {
                Logger.Log(
                    LogLevel.Error,
                    e,
                    $"Page crawl exception with uri {crawlItem.PageUri}");
            }
            finally
            {
            }

            return(new Tuple <CrawlPageResults, int>(results, crawlItem.PageLevel));
        }