На нашем сайте мы используем cookie для сбора информации технического характера и обрабатываем IP-адрес вашего местоположения. Продолжая использовать этот сайт, вы даете согласие на использование файлов cookies. Здесь вы можете узнать, как мы пользуемся файлами cookies.
Я согласен
логотип upread.ru

Продолжение с 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, парсинг

Читайте также:



Почему бан на фейсбуке и как избежать его повторно
Урок 2. Параллельный цикл for C#


© upread.ru 2013-2023
При перепечатке активная ссылка на сайт обязательна.
Задать вопрос
письмо
Здравствуйте! Вы можете задать мне любой вопрос. Если не получается отправить сообщение через эту форму, то пишите на почу up777up@yandex.ru
Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.