Top.Mail.Ru

Разработка парсера аптеки

Нередко к нам об­ра­ща­ют­ся за раз­ра­бот­кой парсеров.

Что такое парсер

Парсер — это прог­рамма, которая собирает с сайтов ин­форма­цию по заданным па­рамет­рам. Это могут быть название и сто­имость товара или контакты от­ветс­твен­ных лиц. С помощью парсера собирают контент для своего ресурса, например аг­ре­гато­ра новостей, или ин­форма­цию о товарах с сайта пос­тавщи­ка. Но чаще всего парсеры за­казы­ва­ют для анализа цен кон­ку­рен­тов с целью сфор­ми­ровать собс­твен­ное, более выгодное для по­купа­телей пред­ло­жение.

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

Что нужно было сделать

Наш заказчик — владелец онлайн-аптеки — хотел получить ин­форма­цию о ценах сайта-кон­ку­рен­та.

Парсер должен был иметь сле­ду­ющие функции:

  • •  воз­можность запуска по рас­пи­санию;

  • •  защиту от од­новре­мен­но­го запуска нес­коль­ких про­цес­сов парсинга;

  • •  обход защиты сайта-донора;

  • • воз­можность ис­поль­зо­вать прокси для обхода бло­киров­ки IP-адреса, с которого от­прав­ля­ют­ся запросы;

  • •  сбор ин­форма­ции по оп­ре­делен­ным ка­тего­ри­ям товаров с воз­можностью из­ме­нения списка ка­тего­рий;

  • •  сох­ра­нение ре­зуль­та­та работы парсера в txt-файл.

Ход работ

В первую очередь были про­веде­ны работы по поиску оп­ти­маль­но­го решения для сбора ин­форма­ции с на­имень­шим ко­личес­твом запросов, так как чем меньше запросов — тем меньше ве­ро­ят­ность получить бло­киров­ку. Был найден подход, который сочетал в себе как обычный парсинг страниц через браузер, так и прямые запросы к API, который был об­на­ружен, в ходе изучения струк­ту­ры сайта-донора.

Путем оп­ре­делен­ных ма­нипу­ляций была дос­тигну­та воз­можность от­прав­лять запросы к этому API. Далее уже по по­лучен­ным из API данным со­бира­лась ин­форма­ция по заданных кри­тери­ям. Это поз­во­лило получить более быстрое и надежное решение, чем обычный парсер страниц.

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

Для обес­пе­чения работы парсера без об­на­ружения были ис­поль­зо­ваны сле­ду­ющие биб­ли­оте­ки: selenium-wire и undetected-chromedriver .

Для более легкой сборки проекта и его запуска было решено ис­поль­зо­вать кон­тей­не­риза­цию Docker. Подход обес­пе­чил воз­можность пер­во­началь­но­го запуска проекта с ис­поль­зо­вани­ем бук­валь­но двух команд без не­об­хо­димос­ти пе­режи­вать об ус­та­нов­ке всех за­виси­мых пакетов. Для этих целей мы ис­поль­зо­вали Docker image ultrafunk/undetected-chromedriver, который поз­во­ля­ет за­пус­кать браузер Chrome внутри вир­ту­аль­но­го кон­тей­не­ра без не­об­хо­димос­ти под­клю­чения внешнего экрана, что при запуске парсера на сервере является важной сос­тавля­ющей.

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

Резуль­ти­ру­ющий файл содержит список городов, ма­гази­нов, ID товара, название товара и другую тре­бу­емую ин­форма­цию.

  • Технологии:
  • Docker
  • Python
  • Selenium