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

D
На сайте с 28.06.2008
Offline
1108
422

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

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

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

vitor
На сайте с 16.05.2009
Offline
237
#1
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...
DD
На сайте с 16.05.2012
Offline
82
#2
Dram :

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

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

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


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

Разработка систем сбора данных на Python/Golang/NodeJs
D
На сайте с 28.06.2008
Offline
1108
#3

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;
}
D
На сайте с 28.06.2008
Offline
1108
#4

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

    //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');
DD
На сайте с 16.05.2012
Offline
82
#5
Dram #:


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

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


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

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

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


Upd:
 Я так понял ты пытаешься сделать AJAX запрос.  Попробуй перед ним сделать обычный запрос и использовать его куки.
DD
На сайте с 16.05.2012
Offline
82
#6
Dram #:


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

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий