Проблемы с попыткой веб-скрапинга на C#

В настоящее время я пытаюсь удалить некоторые записи из таблицы веб-сайта, но когда я делаю запрос на получение, строковый ответ не включает те записи, которые отображаются на веб-сайте.

Вот сайт: https://www.services-rte.com/en/view-data-published-by-rte/downtime-of-generation-resources.html

Я предполагаю, что мне нужно сделать запрос на публикацию, чтобы загрузить таблицу, но я не могу найти, что именно опубликовать. Поправьте меня, если я ошибаюсь.

Вот мой код

static async void GetEntries()
    {
        var services = new ServiceCollection();
        services.AddHttpClient();
        var serviceProvider = services.BuildServiceProvider();
        var httpClientFactory = serviceProvider.GetService<IHttpClientFactory>();
        var client = httpClientFactory.CreateClient();

        string response = string.Empty;
        try
        {
            response = await client.GetStringAsync("https://www.services-rte.com/en/view-data-published-by-rte/downtime-of-generation-resources.html");
        }
        catch
        {
            Console.WriteLine("Site not found.");
            return;
        }

        var parser = new HtmlParser();
        var document = parser.ParseDocument(response);

        string content = string.Empty;
        for (int i = 1; i <= 20; i++)
        {
            try
            {
                Console.WriteLine(i);
                content = document.QuerySelector($"#wrapper > div > div > div.c-editorial-page__container > div.c-editorial-page__content > ctx-remit-generation-unavailability > cortex-remit-generation-unavailability-table > cortex-table > div > div.ctx__table_content > cortex-table-row:nth-child({i})").TextContent;
            }
            catch
            {
                Console.WriteLine($"CSS selector not found for {i}.");
                continue;
            }

            Console.WriteLine(content);
            Console.WriteLine("NEW");
        }
    }

Ошибка в этой строке: content = document.QuerySelector($"#wrapper > div > div > div.c-editor-page__container > div.c-editor-page__content > ctx-remit-generation-unavailability > cortex-remit-generation- таблица недоступности > таблица-коры > div > div.ctx__table_content > строка-таблицы-коры: n-й дочерний элемент ({i})").TextContent;

В экземпляре объекта не задана ссылка на объект.

Эта таблица создается другим вызовом для получения JSON, похоже, было бы намного проще, если бы вы сделали то же самое, просто ПОЛУЧИТЕ эту страницу (конечно, с динамической строкой запроса): services-rte.com/api/public/ …

DavidG 10.02.2023 13:12

Я знаю, что API существует, но я специально хочу получить данные из Интернета. Разве я не могу вызвать функцию, которая генерирует таблицу?

MegaPaul 10.02.2023 13:13

Нет, это Javascript

DavidG 10.02.2023 13:13

@MegaPaul: веб-скрапинг — это упражнение по обратному инжинирингу. В идеале вы могли бы вместо этого взаимодействовать с API. Но если это недоступно, вы зависите от любой функциональности, создающей эту страницу в браузере. Вы можете использовать инструменты отладки своего браузера, чтобы наблюдать за взаимодействием страницы с сервером и пытаться воспроизвести эту функциональность. Вы также можете попробовать использовать «безголовый браузер», который включает в себя полный движок браузера в коде, чтобы выполнять JavaScript и еще много чего на странице и отображать результат в памяти.

David 10.02.2023 13:15

@MegaPaul: «Я знаю, что API существует, но я специально хочу удалить данные из Интернета». - Почему? Для чего? Если ваша цель — получить данные, то именно так вы их и получите. Если ваша цель — попрактиковаться в очистке страницы, выберите страницу, содержащую данные.

David 10.02.2023 13:20

хорошо, как вы нашли функцию или js, которые генерируют таблицу кстати?

MegaPaul 10.02.2023 13:21

@MegaPaul: откройте инструменты разработчика/отладки вашего браузера и наблюдайте за запросами/ответами на вкладке «Сеть».

David 10.02.2023 13:26

тут вроде сотни скриптов как ты отличил нужный?

MegaPaul 10.02.2023 13:39

@MegaPaul: Если что-то генерируется динамически, то мой первый шаг — перейти на вкладку «Сеть», отфильтровать запросы AJAX (HXR) и просмотреть их, чтобы найти данные, которые выглядят так, как в этой таблице. Конечно, нет никакой гарантии, что это где-то найти. Опять же, вы зависите от того, как спроектирован тот или иной веб-сайт. И любой конкретный веб-сайт вполне может быть разработан таким образом, что его будет чрезвычайно сложно очистить.

David 10.02.2023 13:44
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
9
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я думаю, что данные загружаются асинхронно? Я имею в виду таблицу на сайте. Однажды у меня была эта проблема: я видел HTML на веб-сайте, но когда я сделал запрос через С#, я не смог найти HTML.

Что вы можете сделать, так это использовать что-то вроде Selenium. Я знаю, что это может быть не лучший ответ, потому что я не могу показать вам, как его использовать, но есть плагин Selenium, который вы можете использовать в C#. Это может работать с веб-сайтами, которые загружают данные асинхронно.

Возможно, вам поможет этот сайт: https://www.scrapingdog.com/blog/web-scraping-with-csharp/ (не мой, но выглядит многообещающе).

Другие вопросы по теме