using System.Net;
using System.IO;
using System.Text.RegularExpressions;
using System.Text;
WebClient client = new WebClient();
string page = client.DownloadString(new Uri("https://bigenc.ru/contacts"));
File.WriteAllText(@"c:\page.txt",page);
using (WebScanner scanner = new WebScanner())
{
scanner.TargetFound += (page, links) =>
{
Console.WriteLine($"\nPage:\n\t{page}\nLinks:");
foreach (var link in links)
Console.WriteLine($"\t{link}");
};
scanner.Scan(new Uri("https://bigenc.ru/contacts"),10);
Console.WriteLine("Done.");
}
public class WebScanner : IDisposable
{
private readonly HashSet<Uri> _procLinks = new HashSet<Uri>();
private readonly WebClient _webClient = new WebClient();
private readonly HashSet<string> _ignoreFiles = new HashSet<string> {".ico",".xml" };
private void OnTargetFound(Uri page, Uri[] links)
{
TargetFound?.Invoke(page, links);
}
private void Process(string domain,Uri page, int count)
{
if(count<=0) return;
if (_procLinks.Contains(page)) return;
_procLinks.Add(page);
string html = _webClient.DownloadString(page);
//Поиск почты
var hrefs = (from href in Regex.Matches(html, @"class=""[\w\s\-\>\""\<\а-яА-Я\]+""").Cast<Match>()
let url = href.Value.Replace("class=","").Trim('"')
let loc = url.StartsWith("/")
select new
{
Ref = new Uri(loc ?$"{domain}{url}" : url),
IsLocal = loc || url.StartsWith(domain)
}
).ToList();
var externals = (from href in hrefs
where !href.IsLocal
select href.Ref).ToArray();
if (externals.Length > 0) OnTargetFound(page, externals);
var locals = (from href in hrefs
where href.IsLocal
select href.Ref).ToList();
foreach (var href in locals)
{
string fileEx = Path.GetExtension(href.LocalPath).ToLower();
if (_ignoreFiles.Contains(fileEx)) continue;
Process(domain, href, --count);
}
}
public event Action<Uri, Uri[]> TargetFound;
public void Scan(Uri startPage, int pageCount)
{
_procLinks.Clear();
string domain = $"{startPage.Scheme}://{startPage.Host}";
Process(domain, startPage, pageCount);
}
public void Dispose()
{
_webClient.Dispose();
}
}
Не получается получить названия страницы,как правильно написать это регулярное выражение?@"class=""[\w\s->""<\а-яА-Я]+"""
Вот такую ошибку выдаёт Unhandled exception. System.Text.RegularExpressions.RegexParseException: Invalid pattern
WebClientявляется устаревшим в C#, это можете узнать в документации. А так, HTML не парсят регулярками, как и через что - можете почитать тут. – EvgeniyZ Nov 22 '22 at 18:20string hrefs = doc.DocumentNode.QuerySelectorAll("a[href]").Select(node => node.Attributes["href"].Value).ToArray();. Плагин нужен потому что не люблю XPath (.SelectNodes), но кому что больше нравится. – aepot Nov 22 '22 at 18:28