Продолжение с PhantomJS
Давайте продолжим разбираться с «безголовым» браузером PhantomJS. Напомню, что необходимо он нам, чтобы получать картинку с веб страницы, которую иначе мы достать не можем – она подгружается с помощью JS. В этой статье мы поговорим о:
- Запуск через прокси
- Через прокси с авторизацией
- Параметры (юзер агент)
- Ожидание загрузки скриптов
- Что делать, если не работает XMLHttpRequest?
Запуск через прокси
Итак, первое, что требуется – это научить наш PhantomJS заходить на сайты и получать ответ через прокси сервер. Иными словами – скрывать ip адрес нашего сервера – при любом более-менее серьезном парсинге это требуется в первую очередь. Делается это так:
$proxy = 'ip:port'; shell_exec('phantomjs -platform offscreen --proxy='.$proxy.' Get-website.js 2>&1')С авторизацией
Это для приватных платных прокси:
$proxy = 'ip:port'; $loginpassw = ‘login:pass’; shell_exec('phantomjs -platform offscreen --proxy='.$proxy.' --proxy-auth='.$loginpassw.' Get-website.js 2>&1')Параметры
Отлично, теперь сайт, на который мы заходим не видит наш ip. Однако, есть и другие параметры, которые иногда требуется изменить. Например, userAgent:
page.settings.userAgent = 'Mozilla/5.0 (Windows NT 6.0; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/18.0.933.66 Safari/515.12';Также есть и другие параметры, например, установка кук и авторизации.
Ожидание загрузки скриптов
Получить адрес картинки несложно. Например, вот так:
function onPageReady() { var ua = page.evaluate(function () { var rect = document.getElementsByClassName('js-pravocaptcha-image')[0].src; return rect; });Однако, саму функцию необходимо вызвать через некоторое время. Например, через 5 секунд – в нашем случае этого вполне хватит:
page.open(url, function (status) { setTimeout(onPageReady, 5000); });Если необходимо, то можно в страницу встроить jQuery
page.includeJs('http://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js', function () { });Но не рекомендую, в данном случае чистый js предпочтительнее. Да иногда PhantomJS из-за этого падает.
Что делать, если не работает XMLHttpRequest?
Как я ни бился, но на одной машине не смог заставить PhantomJS отправлять запросы XMLHttpRequest – от js к php. Все флаги разрешения выставлены, даже домен один – ну ни в какую. Окей, пойдем другими путем.
В принципе, нам же что требуется от XMLHttpRequest в данном случае? Получить ответ от разгадывания капчи и нажать на кнопку. А что такое нажатие кнопки? В данном случае – это отправка гет запроса (сначала), потом POST. Вот мы просто имитируем их с куками! Получаем:
var cookies = page.cookies; console.log('"cookies" :"'); for(var i in cookies) { console.log(cookies[i].name + '=' + cookies[i].value); } console.log('"}');Ну а остальное уже к PhantomJS не относится. Имея куки и ответ капчи, с помощью курла отправляем эти запросы и получаем заветную переменную (опять же в куках), которая дает нам возможность дальше продолжить парсинг.
Автор этого материала - я - Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.
Читайте также:
Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.