0

Нужно получить номер последной страницы для парсинга.

Классификация:

1)Когда можно получить номер последной страницы,как она есть сайте как в теге a kinoprofi.vip/.

То есть если спарсить все теги а из блока div можно получить номер последной страницы.

Код html

<div class="navigation-block">
<div class="navigation">
    <span>Назад</span> <span>1</span> <a href="https://kinoprofi.vip/page/2/">2</a> <a href="https://kinoprofi.vip/page/3/">3</a> <a href="https://kinoprofi.vip/page/4/">4</a> <a href="https://kinoprofi.vip/page/5/">5</a> <span class="nav_ext">...</span> <a href="https://kinoprofi.vip/page/1017/">1017</a> <a href="https://kinoprofi.vip/page/2/" class="next">Далее</a>
</div>

2)Когда нужно нажать номер последной страницы тогда получаем другие страницы ekb.zarplata.ru.

Тут мы получим следующие номера страниц только после нажатия последнюю,то есть 5ст и так далее.

Как тогда получить последнюю страницу,думаю не вариант клацать на сайте в поисках последний страницы ?! Думаю такой парсер никому не нужен.

Код html

введите сюда описание изображения

3)Когда нажата кнопка получаем следующую страницу prom.ua,тут тоже не понятно как получить номер последной страницы.

Код html

<div class="ek-box ek-box_padding_xs"><button data-qaid="load-more-button" type="button" class="ek-button ek-button_theme_yellow ek-button_width_1-1"><div>Показати ще</div></button></div>
Vladimir
  • 403
  • 2
    Варварский способ - отсылать запросы на сервер (с получением лишь заголовков) до тех пор, пока он не выдаст переадресацию, либо 404, это вам и даст нужные цифры. Далее способ с подсчетом - простая математика всего / сколько выводит=кол-во страниц, но тут бывает ряд проблем, например не все сайты дают точное число того, сколько данных он отобразить нам хочет. Ну и последний способ - парсинг UI, просто берете из HTML нужную цифру (если она есть) и все. Вот, собственно, и все способы получения страниц с сайта, если тот не предоставляет такую инфу. открыто. – EvgeniyZ Nov 05 '20 at 23:14
  • Ничего не понял. 3 разных сайта, какие-то страницы, у меня все голове перепуталось. А что сервер отвечает? Вы уверены, что сервер не присылает данных о страницах? Что в сетевых логах в ответах от сервера? А код покажете? Конкретизируйте роврос до пошагового сценария с указанием на шаг, который у вас не полкчается, и предоставьте код, который реализует все предыдущие шаги. – aepot Nov 05 '20 at 23:35
  • @aepot 3 cайта специально влял для выявления проблем парсинга страниц. 1) Могу получить номер последной страницы как он есть коде html(1017). 2)Проблема в том полученые последущих страниц только тогда когда выбрал последний номер страницы. 3)При нажатии на кнопку получаю следующую страницу(тут тоже проблема полученным последней страницы).В итоге в коде должен получить номер последней страницы чтобы понимал сколько мне страниц нужно парсить. – Vladimir Nov 06 '20 at 00:40
  • @EvgeniyZ суть понял как правильно реализовать я от веба долек,если вас есть пример буду благодарен.Изучаю сейчас javascript чтобы до конца понять как работает anglesharp.Как понял anglesharp был написан подобию javascript. – Vladimir Nov 06 '20 at 00:46
  • 2
    А при чем тут js и anglesharp? У вас 3 разных сайта, по которым вы можете заметить то, что каждый сайт требует индивидуальный подход, определенных стандартов тут попросту не может быть. Вам надо подумать просто логически, как можно решить ту или иную задачу и написать под конкретный сайт свой алгоритм. – EvgeniyZ Nov 06 '20 at 00:51
  • 1
    Вот представьте, что у вас на столе есть стопка листов, вы не знаете сколько их там и вот надо узнать номер последней, как будете поступать? Лично я вижу только один вариант - начать подсчет листов с самого начала. А если допустим вам дали эту стопку, но еще и сказали, что там 200 листов, то ваша задача имеет уже 2-ой вариант решения, где последний лист будет равен числу листов. А если допустим, что эти листы хранятся в некой базе, где за вас уже все посчитали, то опять вы получаете +1 способ к решению задачи, просто спросить базу) Так что мой вам совет, не ищите универсальных методов, их нет! – EvgeniyZ Nov 06 '20 at 00:53
  • 1
    А по поводу В итоге в коде должен получить номер последней страницы чтобы понимал сколько мне страниц нужно парсить - обычно на страницы не завязывают парсеры, ибо это динамичное значение. Проверяйте ответ от сервера, если он успешный, то скорей всего страница существует, а значит можно делать просто бесконечный цикл до тех пор, пока сервер не выдаст ошибку. Некоторые серверы дают успешный статус даже, если страница не найдена (злодеи!), то в таком случае найдите некий "якорь", некую метку, по которой вы определите, что на странице нет данных и просто ее проверяйте. – EvgeniyZ Nov 06 '20 at 00:59
  • @EvgeniyZ спасибо вам мыслил не в правильном направлении. Теперь хоть я знаю что нужно гулить и учить. – Vladimir Nov 06 '20 at 01:05
  • 1
    Невозможно написать универсальный парсер. Потому что унифицировать нечего. 1) сайты все разные настолько, что выявить какие-либо логические общие моменты просто очень мало шансов. 2) сайты меняются со временем, вариант с написание шаблонов логики для парсера тоже отпадает. 3) задачи, которые надо решить - тоже совершенно разные. Один пользователь может хотеть найти все вилки в интернет магазинах, второй посчитать буквы "ы" в подвальной странице какого-то сайта, но только так, чтобы не считать буквы в ссылках, и заголовках. Можно конечно создать свой язык программирования, но тогда смысл где? – aepot Nov 06 '20 at 06:35
  • @aepot согласин с вами,как понимаю бывает такое нужны разные методы обхода защиты(если она есть). – Vladimir Nov 06 '20 at 07:50

1 Answers1

0

Ответ на мой вопрос перебор всех страниц пока есть данные. Спасибо за помощь EvgeniyZ

            int numpage = 1;
            while (true)
            {
                Console.WriteLine(numpage);
                string correntpage = $"{Url}{numpage}&tags={ArtistName}";
            HttpResponseMessage responce = await client.GetAsync(correntpage); //Получаем ответ с сайта.
            string source = default;

            if (responce != null &amp;&amp; responce.StatusCode == HttpStatusCode.OK)
            {
                source = await responce.Content.ReadAsStringAsync();//Помещаем код страницы в переменную.
            }

            HtmlParser domParser = new HtmlParser();
            IHtmlDocument document = await domParser.ParseDocumentAsync(source);
            var fileslinks = document.QuerySelectorAll(&quot;article.post-preview&quot;).Select(el =&gt; el.GetAttribute(&quot;data-file-url&quot;)).ToArray();
            Console.WriteLine($&quot;Количиство ссылок{fileslinks.Length}&quot;);
            if (fileslinks.Length == 0)
            {
                Console.WriteLine(&quot;Нет больше страниц&quot;);
                break;
            }
            numpage++;
        }

Нашел реализацию многопоточного парсера Многопоточный парсинг на C# и работа с базой данных.

Vladimir
  • 403
  • 1
    Если собрались по той ссылке следовать, то очень сильно советую брать оттуда логику, но не то, чем она реализована, ибо xNET уже давно является бесполезной утилитой, которая иногда бывает даже "опасной", а всякие Zenno попросту лишние будут. Научитесь использовать стандартные возможности языка c#. – EvgeniyZ Nov 07 '20 at 12:52
  • @EvgeniyZ Мне интересно одно из того кода там многопоточность правильно реализована? – Vladimir Nov 07 '20 at 17:04
  • 1
    Как базовый вариант можете взять это. Это довольно простая задача асинхронности. – EvgeniyZ Nov 07 '20 at 17:28
  • @EvgeniyZ да тут код выглядет очень простим на базе linq,и как понял он будет брать столько данных из страниц сколько есть. – Vladimir Nov 07 '20 at 17:56