Парсинг сайтов любой сложности (обучаемый парсер-бот)
Привет Друзья! В течении долго-го времени я работал над своим новым парсером-ботом, да именно так парсом который умеет собирать данные с сайтов любой сложности и при этом имеющего функционал бота, т.е. его можно обучить совершать на сайте те или иные действия: кликать, вставлять и копировать текст, работать с формами, работать с динамическим контентом и многое другое. В этой статье я расскажу про функцию парсинга и о принципах работы моего нового решения, в следующей статье подробнее поговорим про функционал бота.
Что умеет парсер?
Для того, чтобы парсер собирал данные его нужно настроить с учетом структуры сайта донора и его HTML разметки. Новый алгоритм работы парсера позволяет настроить его для работы практически с любым сайтом и сбора любых данных. Вот перечень того, с какими данными и сайтами он может работать:
- Парсинг форумов (форумы, темы, топики, посты), в том числе сбор данных пользователей и аватаров;
- Парсинг каталогов, магазинов;
- Парсинг досок объявлений (авито, авто.ру и многое другое), сбор любых данных;
- Парсинг информационных сайтов, текстов статей, изображений;
- Работает со всеми типами сетей в том числе TOR (.onion);
- Полностью отпадает решение проблем с авторизацией на сайте, обходом систем анти-бот и капчи;
- Функции бота. Куда надо нажмет, что надо напишет, сколько надо подождет. Работа с динамическим контентом;
- Сравнительно высокая скорость работы, работа в несколько потоков.
Какие были проблемы у предыдущих решений?
Все предыдущие версии моего парсера была написаны с использование PHP и только. Для получения контента с сайтов использовалась библиотека Curl с имитацией работы реального браузера (user-agent, socks5, cookie, выжидания интервалов). Для работы с DOM деревом использовалась PHP библиотека domDocument, а для навигации по нему библиотека DomXPath.
Принцип работы предыдущих версий парсера:
- Парсер(скрипт на PHP) заходил на сайт и если нужно было авторизировался (тут проблемы с капчами и анти бот системами);
- Получал с сайта ссылки на разделы, страницы, статьи, помещал их в базу;
- Проходил по всем ссылкам собирал нужный контент и помещал его в базу, раскладывая данные в отдельные поля, отмечал пройденные ссылки.
Решение работало, но проблем которые приходилось решать, с каждым новым донором, было достаточно. Ниже список некоторых их них:
- Парсер не работал с JavaScript, он его попросту не интерпритировал;
- Парсер не работал с динамическим контентом подгружаемым по средствам Ajax;
- Сложности с авторизацией на сайте, обход капчи, защиты от ботов;
- Сложности с настройкой. Для каждого донора требовалось настраивать парсер не только учитывая архитектуру сайта, но и имитировать POST запросы к тем или иным целевым страницам с учетом всех заголовков и переменных, где это требовалось;
- Сложность работы с DOM деревом. Библиотеки domDocument и DomXPath могут некорректно работать с некорректной HTML структурой;
- Медленная скорость работы;
- Высокая стоимость настройки парсинга, для конкретного целевого сайта.
Новый парсер всех этих недостатков не имеет из-за совершенно иного принципа работы.
Как устроен новый парсер?
Новый парсер состоит из нескольких частей, клиентская часть — написанная на JavaScript и работающая в браузере пользователя и серверная часть — в виде командного центра, написанного на PHP. Для парсинга используется браузер пользователя, в окне которого и работает сам парсер, от сюда первый очевидный и единственный недостаток — для работы парсера нужно задействовать компьютер с браузером. Но, данный недостаток можно устранить перенеся клиентскую часть на сервер, где можно запустить браузер или PhantomJS. Я не стал, т.к. мне приятно наблюдать за работой парсера прямо на своем рабочем ПК.
Клиентская часть
Скрипт написанный на JavaScript, который подгружается в браузере пользователя по средствам User Scripts и принимает от удаленного сервера(командного центра) команды на совершение тех или иных действий. Тут полностью отпадают проблемы с авторизацией на сайте, её попросту совершает сам пользователь, а не скрипт. Скрипт работает под учетной записью уже будучи авторизированного пользователя.
Отпадает необходимость имитации работы реального браузера, работы с куки, рендерингом страницы и интерпритации JavaScript на сайте. Парсер работает уже с готовым контентом, с таким каким его видит пользователь. Нет проблем при работе с динамическим контентом и Ajax данными.
Для работы клиентской части используется вся мощь jQuery.
Клиентская часть может получать от командного центра следующие команды: сбор данных со страницы(содержимого html тегов, их атрибутов или сам html код), переход по ссылкам, клик, работа с формами, обработка событий, выжидание определенных интервалов времени, отправка POST и GET запросов(также отправка данных в командный центр) в том числе Ajax. Все полученные команды хранятся в LocalStorage браузера, после их выполнения парсер снова обращается за получением новой порции команд и сохраняет их там же. Достаточный функционал для реализации любого бота.
Серверная часть
На сервере размещается так называемый командный центр, который отдает клиентской части парсера команды на совершения тех или иных действий, на сбор данных и переход на следующие страницы. Командный центр также принимает данные от клиентской части и сохраняет их в базу данных(как вариант сохранение сразу в базу данных CMS).
Командный центр сообщает клиентской части с какими и как элементами DOM дерева работать, используя всю мощь селекторов и способов обработки событий, встроенных в библиотеку jQuery.
Команды передаются в виде массивов данных, где каждая запись является следующей командой для выполнения.
При необходимости командный центр можно снабдить админпанелью.
Заключение
Вот такой получился парсер, но самое интересное это то, что он может работать как бот, большинство преград, которые встречались парсерам прежних версий, ему не помеха. В связи с чем, его применение выходит за рамки простого парсинга данных, о чем и поговорим в следующих моих статьях.
Похожие записи
Оставить комментарий
Full Stack
Senior, Architect
предложить оффер
- jQuery: как получить значение атрибута?
- PHP работа с изображением, класс SimpleImage
- Интеграция с API ОСАГО сайта sravni.ru
- Комментарии на PHP, Ajax, mySQL
- PHP: Категории бесконечного уровня вложенности.
- Nginx редирект на другой сервис с сохранением URL спросил (а) Сергей
- Исполнитель пропал, почему такое случается и понять с кем работать? спросил (а) Артем
- Можно ли WordPress считать универсальным движком? спросил (а) Андрей
- Что такое самописный скрипт или CMS? спросил (а) Антон
- Как при поиске в linux используя grep, добавить исключения? спросил (а) Алексей
- Обзор Insurance CMS — платформы для сайтов по страхованию к записи
- Консольный скрипт(JavaScript) для автоматических заказов на OZON к записи
- Консольный скрипт(JavaScript) для автоматических заказов на OZON к записи
- Как создать Telegram-бота с авторизацией через сайт к записи
- PHP скрипт: каталог закладок на сайты к записи
- Валидация на PHP к записи
- Сколько зарабатывают в бизнесе на совместных покупках к записи
Archive
- +2025 (1)
- Январь 2025 (1)
- +2024 (35)
- Декабрь 2024 (7)
- Ноябрь 2024 (13)
- Октябрь 2024 (8)
- Сентябрь 2024 (1)
- Август 2024 (5)
- Май 2024 (1)
- +2023 (27)
- Ноябрь 2023 (1)
- Октябрь 2023 (13)
- Сентябрь 2023 (10)
- Апрель 2023 (1)
- Март 2023 (1)
- Февраль 2023 (1)
- +2022 (21)
- Декабрь 2022 (11)
- Ноябрь 2022 (1)
- Май 2022 (2)
- Апрель 2022 (2)
- Март 2022 (3)
- Февраль 2022 (1)
- Январь 2022 (1)
- +2021 (17)
- Декабрь 2021 (5)
- Ноябрь 2021 (2)
- Июль 2021 (1)
- Июнь 2021 (2)
- Май 2021 (5)
- Апрель 2021 (1)
- Март 2021 (1)
- +2020 (20)
- Декабрь 2020 (6)
- Сентябрь 2020 (2)
- Август 2020 (1)
- Июль 2020 (2)
- Май 2020 (2)
- Апрель 2020 (2)
- Март 2020 (2)
- Февраль 2020 (1)
- Январь 2020 (2)
- +2019 (18)
- Декабрь 2019 (3)
- Ноябрь 2019 (2)
- Октябрь 2019 (2)
- Сентябрь 2019 (1)
- Август 2019 (2)
- Июль 2019 (1)
- Июнь 2019 (1)
- Апрель 2019 (2)
- Март 2019 (1)
- Февраль 2019 (3)
- +2018 (44)
- Декабрь 2018 (4)
- Ноябрь 2018 (7)
- Октябрь 2018 (8)
- Сентябрь 2018 (1)
- Август 2018 (4)
- Июль 2018 (5)
- Май 2018 (3)
- Апрель 2018 (7)
- Март 2018 (1)
- Февраль 2018 (2)
- Январь 2018 (2)
- +2017 (19)
- Декабрь 2017 (2)
- Ноябрь 2017 (1)
- Октябрь 2017 (1)
- Сентябрь 2017 (2)
- Июль 2017 (1)
- Июнь 2017 (1)
- Май 2017 (2)
- Апрель 2017 (3)
- Март 2017 (2)
- Февраль 2017 (1)
- Январь 2017 (3)
- +2016 (36)
- Декабрь 2016 (3)
- Ноябрь 2016 (3)
- Октябрь 2016 (2)
- Сентябрь 2016 (3)
- Август 2016 (7)
- Июнь 2016 (3)
- Май 2016 (3)
- Апрель 2016 (3)
- Февраль 2016 (1)
- Январь 2016 (8)
- +2015 (36)
- Ноябрь 2015 (5)
- Октябрь 2015 (4)
- Сентябрь 2015 (1)
- Август 2015 (8)
- Июнь 2015 (1)
- Май 2015 (4)
- Апрель 2015 (8)
- Март 2015 (3)
- Февраль 2015 (2)
- +2014 (26)
- Ноябрь 2014 (2)
- Октябрь 2014 (5)
- Сентябрь 2014 (6)
- Июль 2014 (1)
- Июнь 2014 (2)
- Май 2014 (3)
- Апрель 2014 (6)
- Февраль 2014 (1)
- +2013 (27)
- Декабрь 2013 (2)
- Ноябрь 2013 (1)
- Октябрь 2013 (1)
- Август 2013 (1)
- Июль 2013 (3)
- Июнь 2013 (10)
- Май 2013 (1)
- Апрель 2013 (2)
- Февраль 2013 (3)
- Январь 2013 (3)
- +2012 (41)
- Декабрь 2012 (2)
- Ноябрь 2012 (3)
- Октябрь 2012 (7)
- Сентябрь 2012 (2)
- Август 2012 (1)
- Июль 2012 (3)
- Июнь 2012 (2)
- Май 2012 (6)
- Апрель 2012 (2)
- Март 2012 (7)
- Февраль 2012 (5)
- Январь 2012 (1)
- +2011 (57)
- Декабрь 2011 (6)
- Ноябрь 2011 (2)
- Октябрь 2011 (3)
- Сентябрь 2011 (5)
- Август 2011 (4)
- Июль 2011 (3)
- Июнь 2011 (3)
- Май 2011 (3)
- Апрель 2011 (4)
- Март 2011 (10)
- Февраль 2011 (5)
- Январь 2011 (9)
- +2010 (43)
- Декабрь 2010 (7)
- Ноябрь 2010 (21)
- Октябрь 2010 (14)
- Сентябрь 2010 (1)
Свежие записи
- Флаги Apache при переадресации RewriteRule 02.01.2025
- Интеграция сайта(ресторана) с API сервиса Quick Resto 23.12.2024
- Шифрование в PHP и расшифровка в JavaScript по ключу 15.12.2024
- Объединить несколько PDF в один документ (linux, php) 14.12.2024
- Восстановление работы служб сервера в случае ошибки Mysql —upgrade 12.12.2024