Парсинг сайтов любой сложности (обучаемый парсер-бот)

Author Автор: Роман Чернышов    Опубликовано: 2 апреля 2018

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

Что умеет парсер?

Для того, чтобы парсер собирал данные его нужно настроить с учетом структуры сайта донора и его HTML разметки. Новый алгоритм работы парсера позволяет настроить его для работы практически с любым сайтом и сбора любых данных. Вот перечень того, с какими данными и сайтами он может работать:

  1. Парсинг форумов (форумы, темы, топики, посты), в том числе сбор данных пользователей и аватаров;
  2. Парсинг каталогов, магазинов;
  3. Парсинг досок объявлений (авито, авто.ру и многое другое), сбор любых данных;
  4. Парсинг информационных сайтов, текстов статей, изображений;
  5. Работает со всеми типами сетей в том числе TOR (.onion);
  6. Полностью отпадает решение проблем с авторизацией на сайте, обходом систем анти-бот и капчи;
  7. Функции бота. Куда надо нажмет, что надо напишет, сколько надо подождет. Работа с динамическим контентом;
  8. Сравнительно высокая скорость работы, работа в несколько потоков.

Какие были проблемы у предыдущих решений?

Все предыдущие версии моего парсера была написаны с использование PHP и только. Для получения контента с сайтов использовалась библиотека Curl с имитацией работы реального браузера (user-agent, socks5, cookie, выжидания интервалов). Для работы с DOM деревом использовалась PHP библиотека domDocument, а для навигации по нему  библиотека DomXPath.

Принцип работы предыдущих версий парсера:

  1. Парсер(скрипт на PHP) заходил на сайт и если нужно было авторизировался (тут проблемы с капчами и анти бот системами);
  2. Получал с сайта ссылки на разделы, страницы, статьи, помещал их в базу;
  3. Проходил по всем ссылкам собирал нужный контент и помещал его в базу, раскладывая данные в отдельные поля, отмечал пройденные ссылки.

Решение работало, но проблем которые приходилось решать, с каждым новым донором, было достаточно. Ниже список некоторых их них:

  1. Парсер не работал с JavaScript, он его попросту не интерпритировал;
  2. Парсер не работал с динамическим контентом подгружаемым по средствам Ajax;
  3. Сложности с авторизацией на сайте, обход капчи, защиты от ботов;
  4. Сложности с настройкой. Для каждого донора требовалось настраивать парсер не только учитывая архитектуру сайта, но и имитировать POST запросы к тем или иным целевым страницам с учетом всех заголовков и переменных, где это требовалось;
  5. Сложность работы с DOM деревом. Библиотеки domDocument и DomXPath могут некорректно работать с некорректной HTML структурой;
  6. Медленная скорость работы;
  7. Высокая стоимость настройки парсинга, для конкретного целевого сайта.

Новый парсер всех этих недостатков не имеет из-за совершенно иного принципа работы.

Как устроен новый парсер?

Новый парсер состоит из нескольких частей, клиентская часть — написанная на JavaScript и работающая в браузере пользователя и серверная часть — в виде командного центра, написанного на PHP. Для парсинга используется браузер пользователя, в окне которого и работает сам парсер, от сюда первый очевидный и единственный недостаток — для работы парсера нужно задействовать компьютер с браузером.  Но, данный недостаток можно устранить перенеся клиентскую часть на сервер, где можно запустить браузер или PhantomJS. Я не стал, т.к. мне приятно наблюдать за работой парсера прямо на своем рабочем ПК.

Клиентская часть

Скрипт написанный на JavaScript, который подгружается в браузере пользователя по средствам User Scripts и принимает от удаленного сервера(командного центра) команды на совершение тех или иных действий. Тут полностью отпадают проблемы с авторизацией на сайте, её попросту совершает сам пользователь, а не скрипт. Скрипт работает под учетной записью уже будучи авторизированного пользователя.

Отпадает необходимость имитации работы реального браузера, работы с куки, рендерингом страницы и интерпритации JavaScript на сайте. Парсер работает уже с готовым контентом, с таким каким его видит пользователь. Нет проблем при работе с динамическим контентом и Ajax данными.

Для работы клиентской части используется вся мощь jQuery.

Клиентская часть может получать от командного центра следующие команды: сбор данных со страницы(содержимого html тегов, их атрибутов или сам html код), переход по ссылкам, клик, работа с формами, обработка событий, выжидание определенных интервалов времени, отправка POST и GET запросов(также отправка данных в командный центр) в том числе Ajax. Все полученные команды хранятся в LocalStorage браузера, после их выполнения парсер снова обращается за получением новой порции команд и сохраняет их там же. Достаточный функционал для реализации любого бота.

Серверная часть

На сервере размещается так называемый командный центр, который отдает клиентской части парсера команды на совершения тех или иных действий, на сбор данных и переход на следующие страницы. Командный центр также принимает данные от клиентской части и сохраняет их в базу данных(как вариант сохранение сразу в базу данных CMS).

Командный центр сообщает клиентской части с какими и как элементами DOM дерева работать, используя  всю мощь селекторов и способов обработки событий, встроенных в библиотеку jQuery.

Команды передаются в виде массивов данных, где каждая запись является следующей командой для выполнения.

При необходимости командный центр можно снабдить админпанелью.

Заключение

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

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

Автор блога
Роман Чернышов
Веб-разработчик,
Full Stack
Senior, Architect
PHP, JavaScript, Node.JS, Python, HTML 5, CSS 3, MySQL, Bash, Linux Admin
Заказать работу
предложить оффер

Моя книга
Книга. Веб-разработчик. Легкий вход в профессию
Печатная книга
Веб-разработчик.
Легкий вход в профессию
Купить за 159₽
Последние вопросы
Список вопросов
Последние комментарии
Меню

Archive

Мои проекты
Insurance CMS Love Crm CMS Совместные покупки Мой PHP Framework Хостинг для моих клиентов Лицензии на мой софт и поддержка