CefSharp парсинг маркетплейсов

Здравствуйте. Чередная задачка по парсингу сайтов.
Теперь надо достать информацию с маркетплейсов.
Скачал CefSharp Offscreen … Как то с ним работал он давал нормальные результаты сейчас же какой то шлак получается.

Тестовый код взял с официального примера: https://github.com/cefsharp/CefSharp.MinimalExample/blob/master/CefSharp.MinimalExample.OffScreen/Program.cs

Написал проверочную функцию

     //string loadURL = "https://www.wildberries.ru/catalog/46256008/detail.aspx?targetUrl=XS";
            string loadURL = "https://www.dns-shop.ru/product/4225595802efc823/operativnaa-pamat-hynix-hy5ps1g831bfp-s6c-1-gb/";
            using (ChromiumWebBrowser browser = new ChromiumWebBrowser(loadURL))
            {
                var initialLoadResponse = await browser.WaitForInitialLoadAsync();
                if (!initialLoadResponse.Success)
                {

                }
                //browser.ViewSource();
                string text = await browser.GetSourceAsync();

                // блок для wildberries
                string findBlock = "price-block__final-price\">";
                string data = text.Replace(" ", "");
                int idx = data.IndexOf(findBlock);
                if (idx != -1)
                {
                    data = data.Substring(idx + findBlock.Length);
                    Match prc = Regex.Match(data, "((\\d+)([\\.\\,]\\d+)?)");
                    if (prc.Success && double.TryParse(prc.Value, out double Price))
                    {
                        return;
                    }
                }

                return;
            }

И тут началась песня…
Для ссылко с ДНС по какой то причине получаю

initialLoadResponse.Success = false

Почему так происходит - хз. ((

Для ягоды вообще магия …
Если в хроме на сайте открыть код страниы то можно увидеть три блока стилей:

Если же в том же хроме нажать ctrl+U чтобы открыть в отдельном окне код страницы то эти стили исчезают куда то.
И в итоге весь блок с данными по продукту исчезает.
И cefsharp также загрузив этот блок ничего не видит там.

Что это за бредовая технология то?? Может быть есть способ побороть то эту фигню?? Может какой то параметр нужен секретный?

Но больше интересует почему днс отфутболивает меня?

Selenium лучше брать.
c# - How to start ChromeDriver in headless mode - Stack Overflow

там как минимум можно нормально искать элементы, а не так

Да взял я его сначала … но он заемучил меня какими то ошибками … то версия не та … то скачайте драйвер … то драйвер какой то не такой … то еще чего то … То либу нато на nuget скачать какую то неведомую … я не линуксоид для таких игр.

А что не так в этом ?? класс устойчивый. Не меняется. блок во всем документе единственный. Или нормально это перебирать полторы тысячи элементов и искать в них число??? А что если в 500 будет число?? Сортировать и применять какие нибудь интеллектуальные сети для определения правильной цены??
Вот хоть убей не пойму что в этом методе не так … к тому же 8 маркетплейсов и во всех этот подход нормально работает… у каждого есть статичный класс который содержит цену.
В общем требую чтобы объяснили что не так и что значит “нормально искать элементы” … )))

Тут получился поиск подстроки, а не класса.
Более вероятно, что это сломается (или даже сейчас не поддерживает все страницы).
Например,

  • добавили класс супер-мега-скидки
  • добавили атрибут
  • переформатировали код, появился пробел/перенос строки и т.д.
  • поменялся порядок классов
  • если поиск price", то может найтись какой-нибудь no-vat-price".

Ну и сложно будет если класса самого элемента мало и надо искать через родителей и т.д.

И велосипедить все эти циклы, легче допустить ошибку. И когда надо будет обновить условия поиска, то придется сильнее напрягаться, чем просто селектор поменять.

Ну допустим. А селениум каким образом сможет решить эти проблемы?

Там можно искать по CSS селекторам или XPath.

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

Ну так …
И тут можно сделать вот так:

var wildberries = await browser.GetMainFrame().EvaluateScriptAsync("document.getElementsByClassName(\"price-block__final-price\")[0].innerText");

Но все равно не понятно каким образом это решит проблемы:

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

К тому же сам факт того что в коде не отображаются блоки стиля по какой то причине так и остается загадкой. Я думаю что и селениум даст тот же самый эффект.

А как все таки побороть проблему ConnectionReset ?? Почему некоторые магазины футболят сразу на стадии подключения??

Потому что он не сломается во всех этих случаях, где просто что-то добавили, переформатировали код и т.п.
Сломается только если вдруг класс переименовали (обычно это не делают) или какие-то серьезные изменения, но и в этом случае проще, не надо думать как переделать свои велосипеды, просто поменять селектор, можно даже в конфиг перенести.

Может подождать надо? Если просто паузу поставить не появятся? И GetSourceAsync это точно текущий код, а не изначальный исходник от сервера?

В Селениуме кстати удобнее ждать пока что-то появится с WebDriverWait.

Так это даже в хроме работает. В обычном браузере. Там то времени куча проходит.

Вообще как я понял что селениум что сеф это обертки для драйверов для популярных движков. По функционалу они так или иначе предоставляют одинаковый доступ и возможности к движку.

С блокировкой основного кода?? Так вроде не хорошо так делать.

Так судя по

дело в этом


Так там же не обязательно работать с ним в UI потоке приложения, можно вынести всё в любой другой поток (каждый экземпляр).

Разница в том, что Селениум предназначен для автоматизации, а CefSharp – для встраивания в интерфейс приложения. Поэтому логично, что задачи по автоматизации проще решать на том, что предназначено для этого )