Обход проверки JS на php


Dram
172

Господа, нужно спарсить пару каталогов лекарств с сайта eаптека, накидал быстро парсер через курл (заголовки меняю, куки сохраняю), но пока не смог вообще никакой ответа получить с этого сайта — пусто и все.

Подозреваю что там проверка на выполнение JS идет. Можете кто опытный в этом деле посмотреть?

Можно ли на php обойти эту проверку?


vitor

Dram :

Господа, нужно спарсить пару каталогов лекарств с сайта eаптека, накидал быстро парсер через курл (заголовки меняю, куки сохраняю), но пока не смог вообще никакой ответа получить с этого сайта — пусто и все.

Подозреваю что там проверка на выполнение JS идет. Можете кто опытный в этом деле посмотреть?

Можно ли на php обойти эту проверку?

Копай в сторону phantomjs, под пыху есть либа  https://jonnnnyw.github.io/php-phantomjs/

PHP PhantomJS

  • Jonny W
  • jonnnnyw.github.io
PHP PhantomJS is a flexible PHP library to load pages through the PhantomJS headless browser and return the page response. It is handy for testing websites that demand javascript support and also supports screen captures and PDF output. Feature List Load webpages through the PhantomJS headless browser View detailed response data including page…


drDaemon

Dram :

Господа, нужно спарсить пару каталогов лекарств с сайта eаптека, накидал быстро парсер через курл

Можно ли на php обойти эту проверку?

Вообще с этим сайтом проблем не было особых никогда. Там несколько редиректов на каждом добавляются куки прежде чем контент получишь. …
Мы его(в том числе) каждый день парсим уже несколько лет…. 

И еще, уточни на каком оборудовании запускаешь парсинг — хостинк, сервер, прокси. Это все играет роль.


Dram

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

Делаю запрос и пусто….  вот собственно и все. Прокси еще даже не покупал ибо и не успел логику парсера прописать.


function getPageByUrl ($url){
    //Инициализируем сеанс
    $curl = curl_init();
    //Указываем адрес страницы
    curl_setopt($curl, CURLOPT_URL, $url);

    curl_setopt($curl, CURLOPT_HTTPHEADER, array("X-Requested-With: XMLHttpRequest"));
    //Ответ сервера сохранять в переменную, а не на экран
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    //Переходить по редиректам
    curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
  
    $getUserAgent = getUserAgent();

    curl_setopt($curl, CURLOPT_USERAGENT, $getUserAgent);
    //если сайт https
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
    //cookie
    curl_setopt($curl, CURLOPT_COOKIEJAR, $_SERVER['DOCUMENT_ROOT'] . '/var/www/com/cookie.txt');
    //смена IP
   // $a =  file('/var/www/com/proxy.txt');
   // curl_setopt($curl, CURLOPT_PROXY, $a[array_rand($a)]);
    //Выполняем запрос:
    $result = curl_exec($curl);
    //Отлавливаем ошибки подключения
    if ($result === false) {                    echo "Ошибка CURL: " . curl_error($curl);
        return false;
    } else {
        return $result;
    }
    $result = curl_exec($curl);

    $httpcode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
    curl_close($curl);
    return $httpcode;
}


Dram

Пропустил там строку

    //cookie
    curl_setopt($curl, CURLOPT_COOKIEJAR, $_SERVER['DOCUMENT_ROOT'] . '/var/www/com/cookie.txt');
    curl_setopt($curl, CURLOPT_COOKIEFILE, $_SERVER['DOCUMENT_ROOT'] . '/var/www/com/cookie.txt');


drDaemon

Dram #:

Надо проверить, выполняется ли автоматический редирект curl-ом

но если включен safe_mode то это не сработает.

Поэтому я проверил бы возвращаемый код (301, 302, 307) и если он есть, перезапросил страницу с куками, которые устанавливает текущий запрос.

Или посмотреть что передается в отладочном прокси (Fiddler например)

Если используешь свой ВПС или сервер, то самое простое установить докер, взять контейнер с HeadlessChrome, или еще проще с puppetteer, и через него получать отрендереный html

Upd:
 Я так понял ты пытаешься сделать AJAX запрос.  Попробуй перед ним сделать обычный запрос и использовать его куки.


drDaemon

Dram #:

Все же, нужно использовать HeadlessCrome или Puppetteer. Чисто на PHP не получится с приемлемыми затратами сделать. Там добавлен js который делает разные проверки…

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *