Продолжение с 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 - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.

тегизаметки, PhantomJS, php, javascript, парсинг
Читайте также:




Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.




Урок 7. Введение в методы JavaScript
При первой загрузке не работает слайдер jCarouselLite
Установка рекапчи на сайт и несколько их на одной странице