Как создать бесплатный парсер своими руками

Бесплатный PHP парсер сайтов на PhantomJS

Опубликовано: 08.06.2016 13:38
Просмотров: 11985

Решил Вам предоставить информацию, которая поможет спарсить ЛЮБОЙ сайт. Теперь КАЖДЫЙ сможет парсить всё, что душе угодно. К тому же написать бесплатный грабер сайтов не составит никакого труда...

Как я решил спарсить Авито, или PhantomJS + PHP как идеальный способ сбора информации

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

Для тех, кто в танке и не в теме. Парсер (или парсинг, т.е. процесс) - это программный продукт, который помогает собирать в автоматическом режиме информацию с площадок. Я таким образом смог насобирать несколько тысяч песен с кучи сайтов. Я уже писал об этом в моей статье Пишем php парсер сайтов с нуля, но я пользовался немного другой библиотекой и был далёк от совершенства.

Все основные проблемы  моего прошлого подхода заключались в том, что в старом методе сбора не было эмуляции работы пользователя. Т.е. к серверу приходили запросы в автоматическом режиме, и более-менее умные сайты (я сейчас говорю про злополучный Avito)  быстро распознавали меня как робота и блокировали доступ к сайту. ну сделал я 5-10 обращений к сайту и что дальше? Бан на полчаса или на весь день. После такого жить просто не хотелось. Тогда я всё бросил и решил уйти в монахи, но через год понял. что это не моё. И нашёл для себя PhantomJS.

PhantomJS сделает из машины - человека

Фантом - это такой webkit-браузер, который можно запускать без графического интерфейса и бегать по страницам других сайтов без боязни быть заблокированным. Если попроще, то это оболочка, которая придаёт жизнь Вашему парсеру, помогает дать ему душу. Т.е. с использованием PhantomJS вы сможете представиться каждому порталу как Настоящий пользователь!

Сейчас я опишу подробную инструкцию по тому, с чего начать, опишу несколько интересных фишек, которые я смог обнаружить на просмотрах интернета + часть я вывел опытным путём. Поехали!

1. Скачать программу

В начале нам нужно идти на сайт разработчиков. На главной странице скачиваем библиотечку и радуемся, теперь у нас есть свой Фантом! 

Заходим в папку bin и видим файл под названием phantomjs.exe Именно этот файл и будет играть основную роль в нашем создании бесплатном парсере (Вы тратите только своё время, не более того). 

2. Переходим к PHP коду

Давайте в начале создадим код на PHP, который будет обращаться к нашему фантому и выводить полученные результаты. Кстати, это вариант под номером 1.

Я написал вот такую функцию:

1
2
3
4
5
6
7
8
9
10
11
blic function parser() {
        try {
            echo(shell_exec('W:\OpenServer\domains\realty\phantomjs\bin\phantomjs.exe W:\OpenServer\domains\realty\phantomjs\bin\script2.js'));
            flush();
        } catch (Exception $exc) {
            echo('Ошибка!');
            echo $exc->getTraceAsString();
        }
    }

 

В функцию shell_exec я передаю Путь, где лежит фантом и Путь к исполняемому JavaScript-коду. Да да, весь парсинг будет на JavaScript, т.е любой из Вас сможет безболезненно использовать JQuery и JS и легко работать с DOM-моделью (блоками сайта).

 3. Пришла пора JavaScript

А теперь давайте изучим код, на примере которого я смог легко спарсить страничку с Avito. Вот пример:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
// Example using HTTP POST operation
 
"use strict";
 
//Тут объявляю несколько юзерагентов, типа мы под разными браузерами заходим постоянно
var useragent = [];
useragent.push('Opera/9.80 (X11; Linux x86_64; U; fr) Presto/2.9.168 Version/11.50');
useragent.push('Mozilla/5.0 (iPad; CPU OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5355d Safari/8536.25');
useragent.push('Opera/12.02 (Android 4.1; Linux; Opera Mobi/ADR-1111101157; U; en-US) Presto/2.9.201 Version/12.02');
 
//Здесь находится страничка, которую нужно спарсить
var siteUrl = 'https://m.avito.ru/komsomolsk-na-amure/kvartiry/1-k_kvartira_29_m_45_et._665423964';
var page = require('webpage').create();
 
//Это я передаю заголовки 
//Их можно посмотреть в браузере на закладке Network (тыкайте сами, ищите сами)
page.customHeaders = {
    ":host": "m.avito.ru",
    ":method": "GET",
    ":path": "/komsomolsk-na-amure/kvartiry?user=1&hist_back=1",
    ":scheme": "https",
    ":version": "HTTP/1.1",
    "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
    "accept-language": "ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4",
    "cache-control": "max-age=0",
    "upgrade-insecure-requests": "1",
    "user-agent": useragent[Math.floor(Math.random() * useragent.length)]
};
 
//Здесь я отключаю загрузку сторонних скриптов для ускореняи парсинга
page.onResourceRequested = function (requestData, request) {
    if ((/http:\/\/.+?\.css$/gi).test(requestData['url'])) {
        request.abort();
    }
    if (
            (/\.doubleclick\./gi.test(requestData['url'])) ||
            (/\.pubmatic\.com$/gi.test(requestData['url'])) ||
            (/yandex/gi.test(requestData['url'])) ||
            (/google/gi.test(requestData['url'])) ||
            (/gstatic/gi.test(requestData['url']))
            ) {
        request.abort();
        return;
    }
};
 
//Этот код выводит ошибки, дебаг так сказать
page.onError = function (msg, trace) {
    console.log(msg);
    trace.forEach(function (item) {
        console.log('  ', item.file, ':', item.line);
    });
};
 
String.prototype.stripTags = function() {
  return this.replace(/<\/?[^>]+>/g, '');
};
 
//Объявим переменные для инф-и об объекте
var href, json, price, adress, fio, descriptionShort, descriptionFull;
 
//Здесь мы открываем страничку
page.open(siteUrl, function (status) {
    if (status !== 'success') {
        console.log('Unable to access network');
    } else {
      	//Получим ценник квартирки
        var price = page.evaluate(function () {
            return [].map.call(document.querySelectorAll('.price-value'), function (span) {
                return span.innerText;
            });
        });
      //Выведем
      console.log(price);
    }
});

С помощью такого небольшого кода я смог зайти на страницу Авито и спарсить цену квартиры. А на что способны Вы?) Я собирал таким образом всю информацию с практически ЛЮБОГО сайта. Здесь нет предела возможностям.

А теперь давайте ка покажу несколько фишечек при работе с PhantomJS.

Фишечки для работы с Фантомом

1.Ожидание происхождения какого-то события

1
2
3
4
5
6
7
8
9
10
11
waitFor(
  function() {
    return page.evaluate(function() {
      // Кликаем на кнопку
      $('.button').trigger('click');
      // Ждём, пока элемент не станет скрытым
      return $('.button').is(':hidden');
    });
  }, function() {
    // Выполняем действия после того, как необходимый элемент появился на экране
  });

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

2. Подключение JQuery к сайту (вдруг нет, а вот вдруг)

1
2
3
4
5
6
7
page.open(siteUrl, function(status) {
  if (status === 'success') {
    // Инклудим jQuery
    page.injectJs('//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js');
    //и что-то там другое
  }
});

Просто вставляем в загруженную страницу свою библиотеку и начинаем работать!

3. Выключаем всё CSS и картинки

А вот такой простейший код поможет отключить загрузку всех CSS-стилей и картинок, дабы ускорить работу сайта.

1
2
3
4
5
6
7
8
9
10
11
//Отключение картинок
page.settings = {
  loadImages: false
};
 
// Отключение CSS
page.onResourceRequested = function(requestData, request) {
  if ((/http:\/\/.+?\.css$/gi).test(requestData['url'])) {
    request.abort();
  }

Остальные идеи и прелести Вы сможете подсмотреть в моём верхнем коде. Просто посмотрите функции и возьмите себе на заметку какие-то нужные вещи.

Выводы

Могу сказать, что с помощью PhantomJS можно написать бесплатный PHP парсер сайтов всего лишь за пару дней. Любая площадка будет подвластна Вам, только если Вы сможете привлечь свою светлую голову в этот процесс.

На деле всё это не так уж и просто, так что школьничкам не советую писать кучу недопарсеров, которые будут засорять мировую паутину. Пробуйте подойти к делу с умом и у Вас всё обязательно получится!

Скоро будет новый подгончик по материалам! Всем огромное спасибо за посещение моего сайта!

  • Гость - Андрей

    Спасибо , отличная статья !
    А если нужно парсить все цены на 3х комнатные квартиры ? парсить все варианты на текущей страницы и переходить дальше пока не конец пагинатора.
    Есть ли какие то универсальные функции которые проходятся по всему каталогу товаров?

  • Получаете все странички пагинации и начинаете в цикле их обходить. Если нужны трёшки - находите нужные url и парсите его. Адрес отличается GET-параметрами, почитайте.

  • Гость - Олег

    С такой проблемой не сталкивались для phantomjs "You will be redirected to Robot Checker. Please enable Javascript in browser."?
    т.е. на сервере выдает такую ошибку на компе все без проблем заходит и получает нужную инфу

    из Kharkiv Oblast, Ukraine
  • Написано, что надо включить JS в браузере. Погугли про это, либо какие-то настройки другие на серваке, даже сказать пока не могу, с такой проблемой не сталкивался.

Оставьте свой комментарий

Оставить комментарий от имени гостя

0 / 2000 Ограничение символов
Ваш текст должен быть в пределах 10-2000 символов
Ваш комментарий будет отправлен на модерацию