private void UpdateProgress(CrawlPageResults results) { _statistics.AppendPageResults(results); if (_crawledUri.Count % _saveProgressPeriod == 0) { SaveProgress(); } }
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}"); } } } }
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)); }