Парсинг сайтов- магазинов. Личный опыт и немного how- to / Хабрахабр. Parser — объектно-ориентированный скриптовый язык программирования, созданный. Язык специально спроектирован и оптимизирован для того, чтобы было удобно создавать простые сайты. Работа с формами, cookies, . Парсер может сканировать сайт на ссылки по указанному фильтру, чтобы затем обрабатывать страницы только по найденным ссылкам. Есть поддержка авторизации пользователей и работы через прокси. Разделим парсинг (скраппинг) сайтов на две подзадачи. Собственно сам парсинг – поиск данных, которые нам интересны на страницах. Осмысливание полученных данных. Вначале опишем приложения: Парсер «постоянной» информации о товарах с сайта. Этот парсер будет запускаться редко (исключительно для проверки наличия новых товаров), будет разбирать страницы и извлекать из них информацию о товаре: наименование, фотографии, свойства. Парсер условно переменной информации. Это приложение будет запускаться часто и автоматически, будет разбирать страницы сайта для поиска цен и наличия на складе для обновления этой информации в БД (мы его рассматривать не будем, тут нет ничего необычного). Универсальный парсер имеет следующие возможности: 1. Самое главное - парсить! Сохранять награбленное в разных форматах: WPT, Zebrum lite, Sat-x и абсолютно любой другой формат! Официальный сайт: Sjs-soft. Админка, структурирование полученных данных. Это приложения будет запускаться после парсера «постоянной» информации и позволяет админу разобрать/структурировать полученные данные. Итак, поговорим о парсерах. Методов парсинга много, это и регулярные выражения и банальный поиск подстроки. Все эти способы имеют один большой недостаток – при небольших изменениях на сайте необходимо править сам парсер.
А дальше вступает в дело вся мощь XPATH запросов. При правильно написанных XPATH запросах нет необходимости править парсер при изменениях на сайте. Пример: Для ориентации в DOM часто используются классы, но еще чаще минорные изменения в дизайне сайта выполняются добавлением соответствующих классов к элементам (было class=”product. Info” стало class=”product. Info clearfix”). Поэтому в XPATH лучше написать: div. Универсальность кода – важнее. Точно также при ориентации в дереве при помощи id элементов я, как правило, использую «//» (т. Это спасает в ситуациях, когда дизайнер обертывает какие- либо тэги (как правило, для фикса какого- нибудь бага отображения): div. Полученные данные мы будем хранить в БД с примитивной структурой: Т. Для этого нам нужно структурировать данные. Структурирование данных. Создадим еще пару таблиц в БД для хранения структурированных данных. Dict. Всего у них 4. Если сгруппируем по названию получим всего 5. Сгруппируем свойства по названиям и по значениям, получим табличку (свойство, значение, сколько раз встречается) и отсортируем их по частоте появления. Всю таблицу приводить смысла нет, отметим несколько моментов: Первые 1. Очень много свойств и значений, отличающихся друг от друга только регистром или/и пробелами/опечатками. Цифровые данные – как правило в одном формате – например вес, габариты, объем оперативной памяти. Введем 2 типа правил: Точное совпадение. Например: свойство «Color», значение «Black»Совпадение по регулярному выражению. Например: свойство Weight, значение (?\d*\.?\d+)g. Пишем парсер на Node. JS / Хабрахабр. Раньше основной библиотекой для парсинга был JSDOM, который страдал излишней тяжеловесностью и на самом деле тормозил скорее процесс парсинга. Но время изменились и пришел cheerio. Он делает почти все то же самое, и отбрасывает лишние из процесса, при этом сам реализует какую- то часть j. Query(а именно ту, которая нам нужна для парсинга). И за счет этого позволяет наконец написать не тормозящий парсер, при этом не используя regexp'ы ради увеличения производительности. Он справляется и с xml, только нужно вызвать его с . О том как можно легко парсить на node. JS под катом. Технологии. Мы будем использовать Q — для создания Defered и построения асинхронной очереди, request — для добычи контента, и cheerio для уже самого парсинга. Пример в вакууме ? У нас появятся 2 проблемы если мы будем решать в лоб не используя Promise. Первая — уход в stack, вторая — уход в память через дублирование scope. Корень всего зла конечно рекурсивная функция, которая нам не сильно подходит при парсинге, соотвественно нам нужно построить асинхронную очередь без увеличения уровня скопа. Для этого делим нашу программу на 2 этапа: Этап 1: взятие страницы с пагинатором и узнавание количества страниц всего. Этап 2: создание асинхронной очереди, в которую мы цепляем нашу парсящую функцию. Функция которая будет выполнятся в асинхронной очереди может быть сделана 2мя способами. Первый: мы порождаем подскопы на каждый из вызовов заранее(код ниже требует доработки прежде чем войти в production): for(var i = 0; i< l; i+=).
0 Comments
Leave a Reply. |
AuthorWrite something about yourself. No need to be fancy, just an overview. Archives
November 2017
Categories |