@Samyrro054

Как извлечь все ссылки сайта внутри каталога?

Есть сайт rol-x.ru. Необходимо извлечь все внутренние ссылки внутри каталога "Объявления Житомир"
Теоретически, допустим берём 1-ю ссылку https://rol-x.ru/categories.aspx?parent=1.
Программа извлечёт все ссылки имеющиеся на странице, и далее нужно чтобы программа искала все внутренние ссылки внутри каждой до этого извлечённой ссылки, и так пока не закончатся ссылки внутри каталога "Объявления Житомир". Т.е. последней извлечённой ссылкой будет https://rol-x.ru/view_phone.aspx?phone=3207181.
Для начала использую HtmlAgilityPack для извлечения всех ссылок со страницы.
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        static string GetAbsoluteUrlString(string baseUrl, string url)
        {
            var uri = new Uri(url, UriKind.RelativeOrAbsolute);
            if (!uri.IsAbsoluteUri)
                uri = new Uri(new Uri(baseUrl), uri);
            return uri.ToString();
        }
 
 
        public static List<string> ParseLinks(string urlToCrawl)
        {
 
            WebClient webClient = new WebClient();
 
            byte[] data = webClient.DownloadData(urlToCrawl);
            string download = Encoding.ASCII.GetString(data);
 
            HashSet<string> list = new HashSet<string>();
 
            var doc = new HtmlAgilityPack.HtmlDocument();
            doc.LoadHtml(download);
            HtmlNodeCollection nodes = doc.DocumentNode.SelectNodes("//a[@href]");
 
            foreach (var n in nodes)
            {
                string href = n.Attributes["href"].Value;
                list.Add(GetAbsoluteUrlString(urlToCrawl, href));
            }
            return list.ToList();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            List<string> linksToVisit = ParseLinks("https://rol-x.ru/categories.aspx?parent=1");
            using (var writer = new StreamWriter("C:/Reest.txt", append: true))
            {
                
                foreach (var line in linksToVisit)
                {
                    writer.Write(line);
                }
            }
        }
    }
}

Но как реализовать извлечение ссылок из каждой найденной до этого ссылки?
  • Вопрос задан
  • 164 просмотра
Пригласить эксперта
Ответы на вопрос 1
virtual_hack2root
@virtual_hack2root
.NET Core, JS, DevOps
Используй паттерн визитер. Вызывай рекурсивно, с указанием глубины рекурсии, и глобальным списком (стек) подлежащих вызову url, далее, можно параллелить как Task, использовать async, и ValueTask для оптимизации загрузки страниц
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы