Как парсить сайты с cloudflare на php?

Добрый день.
Стоит задача спарсить сайт, который защищен cloudflare. Желательно на php.

Первым делом я взял postman и отправил get запрос на получение нужной страницы через него. И получил нужный результат! После чего я попробовал запросить контент через file_get_contents и ожидаемо получил 403 ошибку. Значит cloudflare все таки работает. Тогда я попробовал спарсить через curl с сохранением куков. Через курл результат получился: "Just a moment... Checking if the site connection is secure".

На этом моменте я застрял и пошел гуглить как все это работает. Нагуглил информацию, что cloudflare посылает в браузер js скрипт. Отработал - значит норм, нет - бот. Решил это проверить. Запустил оперу, отключил у нее js и куки и чтобы вы думали? Сайт прекрасно открывается! Пол сайта не работает (т.к. на js) но вся нужная информация отображается, никаким cloudflare не пахнет. Я решил скопировать весь запрос как curl (чтобы и юзерагент там был такой же, и всякие прочие параметры), но у меня результат все тот же: "Just a moment".

Гуглил, что есть системы обхода на питоне, есть хедлесс браузеры. Нагуглил инфу, что мол cloudflare обойти легко, достаточно перехватить математический пример на js, решить его и вернуть. А еще кто-то сказал, что достаточно 5 секунд выждать. В итоге 5 секунд я выжидал благодаря sleep(5) - результата нет, а что за математический пример и где его взять - я не понял.

Так что я уже запутался. Скажите, на php вообще реально написать такой парсер? и если да, то что для этого надо делать? Спасибо.

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

Попросите владельца отключить Cloudflare

  • Sanes, ага, легче тогда попросить его сразу мне скинуть прайс на все, чтоб я цены не парсил))))
  • lolrofl01, может и легче. Представьтесь покупателем. Хотите ознакомиться с ценами.
  • Ответы:

    можно. но придется повозиться. cloudflare будет тригерится на любую как ему кажется подозрительную активность, как то серверный ip, частые обращения и так далее. пробуйте через headless браузеры + php-webdriver/php-webdriver или chrome-php/chrome или еще чего то подобное

    • правильно же я понимаю, что при работе с хедлесс браузерами необходимо наличие реального? Например, если используем chrome-php/chrome , то необходимо, чтобы на компе был установлен хром, верно? Как быть в случае, если на локальном компе я работаю в докере? Есть какие-то минифицированные версии без gui для alpine?
    • lolrofl01,
      1. headless браузеры это реальный браузер просто без реальной отрисовки на экране.
      2. вы можете взять селеноид - все возможные браузеры в докере. Но вообще стоит искать сборку которая прячет информацию о том что браузер запущен в режиме автоматизации, потому что некоторые по ней блочат обращения к сайту - например Imperva Incapsula

    Пробей домен по сканерам субдоменов, подсетей итд - высока возможность найти чистый ип если сервис не сильно большой

    • реальный я нашел, но по нему вылезает 403 ошибка. Видимо закрыли. Сервис большой - один из крупных онлайн маркетплейсов.
    • lolrofl01, не дураки там сидят значит. Тогда да, только хедлес

     

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

     

      • Как парсить сайты с cloudflare на php?Есть ответ
      • 07.04.2024
      Ответить

      Для парсинга сайтов, защищенных Cloudflare, с использованием PHP, можно использовать следующий подход.

      1. Используйте библиотеку GuzzleHttp для отправки HTTP-запросов. Установите ее с помощью Composer, добавив зависимость в файл composer.json:

      "require": {
          "guzzlehttp/guzzle": "^7.0"
      }

      2. Далее, создайте скрипт, который будет отправлять GET-запрос к целевому сайту. Обязательно добавьте заголовки, которые помогут обойти защиту Cloudflare. Пример кода:

      request('GET', 'https://example.com', [
          'headers' => [
              'User-Agent' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3',
              'Referer' => 'https://example.com'
          ]
      ]);
       
      $body = $response->getBody()->getContents();
       
      echo $body;

      3. После этого необходимо обработать полученный HTML-код с помощью парсера, например, библиотеки PHP Simple HTML DOM Parser. Установите ее также с помощью Composer:

      "require": {
          "sunra/php-simple-html-dom-parser": "^1.5"
      }

      4. Пример использования PHP Simple HTML DOM Parser для поиска и вывода всех ссылок на странице:

      find('a') as $element) {
          echo $element-&gt;href . '<br>';
      }

      Таким образом, используя вышеперечисленные шаги и библиотеки, вы сможете парсить сайты, защищенные Cloudflare, на PHP.

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