Всем привет!
Почти уверен, что нужный мне сервис существует, но не могу понять, как его найти.
Суть: есть сайты, выдача которых разбита на страницы (google.com, livelib.ru).
Нужно собрать содержимое всех страниц в одну кучу.
Чем это сделать?
Я почти уверен, что я видел такой сервис. Но найти не могу 🙁

Дополнительно:

Пишем скрипт. С циклом. По страницам. Ваш Кэп.

  • Ну, я в общем так и сделал.
    После чего и обнаружил, что страничка сначала показывает "подождите, сайт скоро откроется", и только потом делает переадресацию в правильное место.
    Моих навыков общения с питоном не хватило, чтобы это побороть.

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

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

    Тут есть два базовых подхода:

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

    2. Использовать полноценный браузер с автоматизацией работы через Selenium. Более надёжно, но запущенный браузер сожрёт дополнительной памяти. И тоже в принципе может детектиться (но сложнее и есть всякие методы обмана).

    Также на многих сайтах придётся бороться с капчами и банами, как собственными сайтовыми, так и Cloudflare/DDOS-Guard/итд. Прыгать с бубном с пачками прокси...

    Гугл - советую отказаться от парсинга сразу. Этих парсить любят так сильно, что они защитами обвешаны по самые уши. Нет смысла даже возиться.

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

  • shurshur, "Правда, я не очень понимаю, какой толк парсить книжный магазин." - сейчас новые законы принимают... каждый день. И книжки активно выпиливают с сайтов. Хочется иметь некий бекап.
  • Вова, тогда интереснее парсить библиотеки и иные сайты с книжным контентом, а не просто магазины, где обложка и описание.
  • Вова, с другой стороны немного странно, я вроде раньше набредал на книги которые на livelib.ru были выложены с текстом, а сейчас куда ни ткнёшь - там везде "бумажная". И непонятно, есть ли там вообще тексты хоть каких-то книг?
  • shurshur, У лайвлиба вроде нет текстов. Зато там отличные подборки 🙂
  • Вова, общее решение малореально, так как реализации у всех очень разные. У кого-то подгрузка через ajax, у кого-то в ссылку передаётся номер страницы, у кого-то ещё и размер страницы может настраиваться. Плюс может быть так, что, например, число страниц в принципе ограниченно (пример: nyaa.si принципиально показывает не больше 100 страниц по любому запросу или фильтру).

    Также и полученный контент страницы надо парсить индивидуально. Например, там может быть блок рекомендаций, рекламный блок и блок основного контента, оформленные одинаковыми или похожими тэгами. И всё это надо индивидуально учитывать.

    Я довольно много всяких разных парсеров писал. Пагинаторы очень разные бывают. Некоторые показывают общее число страниц, некоторые нет (тогда приходится идти по страницам вслепую). У кого-то нумерация с 0, у кого-то с 1. Где-то страница отдаётся по номеру, где-то - по смещению. Бывает так, что первая страница отдаётся в теле, а последующие отдаются ajax, причём в ответе может быть как кусок html для вставки в страницу, так и структурированные данные в json/xml/txt/ещёкакомнитьвиде. Могут быть вставки каких-нибудь странных вещей типа вопроса "а вам действительно 18+ лет для показа последующего контента?" Ещё можно встретить сайты с вебсокетами.

    А ещё сайты бывают просто овербольшими. Уверяю, скачать 10000 страниц в один файл это не только медленно, но и неудобно.

    У меня налажен подход с готовыми функциями, которые кладут все файлы в кэш, умеют delay между запросами или expiration по времени файла. Парсить сайты с тысячами страниц (иногда ещё и тормознутые) намного удобнее, если не перекачивать уже накопленные данные. Вот, например, у меня тут кэш одного книжного сайта - 72 тыс. файлов.

    И как я уже говорил, многие сайты вяло или активно борются с качальщиками. Поэтому приходится с каждым разбираться отдельно. Кому-то достаточно полусекундные задержки, кому-то надо куки из браузера, а кому-то решать капчу каждые 1000 запросов...

  • shurshur, Оу. Большое спасибо за подробности! Это было неочевидно. И очень интересно!

    Попробую решать тогда одну конкретную частную задачу 🙂

  • Ответы:

    Где взять анти-паджинатор?

    Не кислая "куча" получится...

    • То, что мне нужно - это сотня страниц по 20 элементов на странице. Руками собирать не хочется, а для "робота"... это не куча 😉
    • Вова, для робота - не куча, а для гугля - нежелательная активность.

    Называется Метапоиск.

    • Так ему ж не надо собрать разные сайты на одну страницу.
      Ему надо собрать всего один сайт на одну страницу.
      Правда, этот сайт - Гугль 😉
    • Adamos, Именно. Один сайт. В одну страницу! 🙂

    Нужно собрать содержимое всех страниц в одну кучу.

    Поисковики правильно делают оптимизируя доступ. И если ты будешь качать все 5 млн результатов
    - это дорогой response получается для ресурсов гугла.

    У гугла есть custom search JSON API который просто предоставляет стандартный API на базе REST
    где тоже pagination но уже парсить ничего не надо и можно заниматься склейкой коллекций в один
    поток.

    • Да, спасибо, что сказали про API (я забыл).
      Но я ищу некое общее решение, ибо совсем не хочу изобретать велосипед.
      (И честно говоря, я не думаю, что хоть кто-то сможет создать значительную нагрузку для гугла... даже если будет давать сотню запросов за раз).
    • Вова, общего решения нет и не будет. Что-то работающее в 80 - 99% случаев сделать реально.
      Кто-то воюет с роботами, кто-то ставит бесконечную ленту, у кого-то по три пагинации на странице, кто-то ставит кривые next/prev в метатегах.

     

    Для решения данной проблемы вы можете воспользоваться услугами фрилансеров. Мы выполним необходимую работу быстро и качественно.

     

      • Где взять анти-паджинатор?Есть ответ
      • 07.04.2024
      Ответить

      Для получения анти-паджинатора, который позволит вам вывести все элементы без ограничения по количеству страниц, вам необходимо создать специальный запрос к базе данных с использованием LIMIT и OFFSET.

      Вот пример использования анти-паджинатора в PHP:

      // Количество элементов на странице
      $perPage = 10;
       
      // Текущая страница
      $page = isset($_GET['page']) ? (int)$_GET['page'] : 1;
       
      // Рассчитываем смещение
      $offset = ($page - 1) * $perPage;
       
      // Запрос к базе данных
      $query = "SELECT * FROM table_name LIMIT $offset, $perPage";
      $result = mysqli_query($connection, $query);
       
      // Вывод данных
      while ($row = mysqli_fetch_assoc($result)) {
          // Вывод данных
      }

      В данном примере $perPage - количество элементов на странице, $page - текущая страница, $offset - смещение для LIMIT. Вы можете изменить значения переменных в соответствии с вашими потребностями.

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

    Оставить комментарий