Как стать автором
Обновить

Комментарии 43

Цитата с https://fetch.ee/ru/developers/

Product API извлекает данные о товарах из любого интернет-магазина в любой стране.
Получает название, изображение, цену, валюту и другие характеристики.
Поддерживает любую валюту и язык интернет-магазина, а так же географическое положение.


По факту имеем
url: http://m.finn.no/car/used/ad.html?finnkode=15254566

Вот что мы нашли.

{
«id»: «58257ccb65ef60477b39338f»,
«url»: «http://m.finn.no/car/used/ad.html?finnkode=15254566»,
«title»: «Mercedes-Benz C-Klasse»,
«img_url»: «https://images.finncdn.no/dynamic/1280w/6/152/545/66_287309295.jpg»,
«created_at»: «2016-11-11T08:09:47.474Z»,
«last_track_at»: «2016-11-11T08:09:57.440Z»,
«unprocessed»: true
}

И ладно, что отсутствует цена, валюта и другие характеристики. Смешнее всего id взятый с потолка.

ID не с потолка, а, судя по его виду, из MongoDB в которой хранятся результаты парсинга. Посмотрите на примеры в статье, там тоже нет "локальных" ID. Я вообще сомневаюсь в возможности "вытащить" "локальный" ID с помощью "универсального" парсера.


Да и по поводу цены сложно товарищей винить — "89 900,-" это очень необычный формат обозначения валюты.

Про ID из MongoDB Вы правы. В формате, кстати, нет проблем (хотя если глянуть на HTML, дизайнерам можно руки оторвать). А вот валюта подвела для этой страницы.
Спасибо, что решили попробовать. ID в ответе — это идентификатор запроса, к товару он не имеет отношения. Система вернула unprocessed: true, что говорит о невозможности получит все данные. Валюту для этой страницы автоматически определить будет сложно, т.к. нет знака валюты у цены. Именно для таких диковинных сайтов и затеяли публичный API. Цену научимся обрабатывать и дам Вам знать.
На мой взгляд, было бы честнее предоставить список магазинов, где API работает, вместо утверждения о «любых».
Однако, если расчет был на то, что множесто людей ринутся проверять, действительно ли любых, то решение верное =)

Цену научимся обрабатывать и дам Вам знать.


Вопрос из любопытства — обучение распознаванию происходит в автоматическом, полуавтоматическом или ручном режиме?
У нас есть автомат по распознаванию паттернов. Он может давать сбои, поэтому ему нужно периодически подкидывать новы сайты. Чем их больше, тем он надёжней срабатывает. Процесс обучения простой: получили автоматический результат, проверили на корректность, если есть ошибка, добавили правило, прогнали тесты не рушит ли правило предыдущие верные срабатывания.

API на самом деле автоматически работает со всеми магазинами, которыми пользуется 95% покупателей в интернете. Но верстальщики самые находчивые люди, иногда пользователи добавляют такие сайты, где в коде идёт борьба бессмысленности с глупостью. В этом случае мы вытираем скупую слезу и делаем ручную настройку. Интересно, что товары из этого магазина интересуют, как правило, только одного пользователя.

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

Прошу простить любопытство (это неуемная тяга к тестированию всего и вся).

На примере, указанном в одном из комментариев ниже
«title»: «370 руб. нет в наличии»,

Насколько я понимаю, парсер не воспринял это как ошибку и, следовательно, не будет самообучаться на данном примере, верно?
Воспринял и обучился. Вот этот URL уже правильный http://dietjust.ru/products/14061117. API закешировало ошибочный ответ. Новые запросы отрабатывают правильно.

P.S. Я ценю Ваше любопытство.
Ниже сказано
Подкрутили алгоритм

Отсюда я сделал выводы, что автоматический режим не сработал, что было бы вполне логично, т.к. парсер извлек эти (некорректные) данные как title, что подразумевает, что с его точки зрения это title и есть. Т.е. причин для парсера искать другой title (срабатывания некого триггера) я не вижу.
Или он подвергает сомнению все собранные данные?
Возможно, я не правильно выразился где-то по тексту. Парсер учится, а указывать на его ошибки — задача человека. Сейчас реализован метод кнута, когда мы не даём систему права на вторую ошибку, принудительно заставляя обрабатывать данные правильно. В идеале, конечно, реализовать полноценную систему машинного обучения, когда от человека будет требоваться только проверка результатов и команды: Верно / Не верно, иди ещё подумай.
Огромное спасибо за содержательные ответы! Весьма и весьма занимательная система. Очень интересно, во что она вырастет и какими возможностями обзаведется. Желаю успехов!
Product API извлекает данные о товарах из любого интернет-магазина в любой стране.
Получает название, изображение, цену, валюту и другие характеристики.
Поддерживает любую валюту и язык интернет-магазина, а так же географическое положение.

Попробовал несколько ссылок указать, тот же ссылка. В начале несколько минут было «Ваш запрос обрабатывается..», а потом что превышено время ожидания.
Со второй попытки все же нашлось, но без цены, описания и т.п.:
{
    "id": "5825801c65ef60477b393545",
    "url": "http://www.tehnosila.ru/catalog/tovary_dlja_sporta/velosipedy_i_aksessuary/velosipedy/-/284900",
    "created_at": "2016-11-11T08:23:56.599Z",
    "last_track_at": "2016-11-11T08:28:20.869Z",
    "unprocessed": true
}
Хаброэффект, не иначе. Всё-таки API в бете, может и призадуматься. Попробуйте ещё раз, цена Техносиле теперь в норме.
А с сайтами, которые динамически собирают страницу (spa и т.п.), каким образом вы собираете информацию (если не секрет)? На своей стороне полностью рендерите html и потом ее парсите?
Я думаю, что таких сайтов-продавцов меньшинство, т.к. большинство продающих сайтов заинтересованы, чтобы в поисковики попадало как можно больше страниц товаров, и spa для магазина — очень неудачное решение
На западе их очень много. Значение SEO сильно преувеличено для магазинов. Т.е. запросы на конкретную модель, которая через 4-5 месяцев уже уйдёт из продажи, скорее всего будут перехвачены агрегаторами типа Яндекс.Маркет. Магазины сосредотачиваются на привлечении трафика на посадочные страницы. Ну а сделал пререндер и закешировать посадочную на SPA вообще не проблема.
По необходимости полностью рендрим страницу вместе с JS. По понятным причинам время ожидания обработки для SPA сайтов немного выше.
Есть интернет магазины, где важна авторизация, что бы видеть цену со скидкой (присвоенной пользователю). У вас есть/в планах решение?
В рамках Fetchee для пользователей такое решение есть. Оно не во всех случаях работает, правда. Как реализовать его для API пока не знаю, если только в запросе будет указываться логин/пароль или активная авторизационная кука.
странный парсинг.

url:
http://dietjust.ru/products/23748692

Вот что мы нашли.
{
    "id": "58258e53b25795f760078d1b",
    "url": "http://dietjust.ru/products/23748692",
    "title": "370 руб. нет в наличии",
    "price": 370,
    "currency": "RUB",
    "img_url": "http://i.siteapi.org/G0mzV92ignFZHjq4iNhLNTfk0DE=/113x0:602x377/fit-in/156x120/filters:fill(transparent):format(png)/ea331f79b074863.ru.s.siteapi.org/img/e3d2f43973a2f83ec36641997f935d5f1ae972bc.jpg",
    "created_at": "2016-11-11T09:24:35.586Z",
    "last_track_at": "2016-11-11T09:24:47.417Z"
}


По какому принципу в данном случае он выбирал title для меня осталось загадкой.
Спасибо, что написали. Новые товары в этого сайта будут определяться верно. Подкрутили алгоритм.
url:
https://www.computeruniverse.ru/products/90659981/palit-geforce-gtx1060-dual.asp

Как я понял, с двойной валютой парсер не справился:
{
    "id": "58259b6740b895da69e0a2d6",
    "url": "https://www.computeruniverse.ru/products/90659981/palit-geforce-gtx1060-dual.asp",
    "title": "Palit GeForce GTX1060 Dual 6.0 GB High End видеокарта",
    "price": 234.37,
    "currency": "RUB",
    "img_url": "https://fetch.ee/assets/item-images/5825/9b9322ae47d46976383b.jpg",
    "created_at": "2016-11-11T10:20:23.492Z",
    "last_track_at": "2016-11-11T10:21:07.712Z"
}
Спасибо за информацию. Сайт не простой, но система ошибается, а потом учится.
Имеется ли в планах апи колл, которому можно передать ошибку парсинга, например, url, который не распарсил.
Чтобы инфу не через хабр сообщать, а апишкой?
Я надеюсь, что к моменту запуска полноценного API эта функция не понадобится, ведь это наша забота проверять качество парсинга. Но такой вызов будет, в пользовательском приложении функция жалобы на товар есть.
У Стима блокировка по возрасту. Можно обойти, но проще с ними по API интегрироваться, если кому-то понадобится следить за ценами на игры.

Можете описать ситуацию, когда понадобится получить данные и следить за ценой на бесплатный товар?
Сначала игра была платной, а позже стала бесплатной.
Я так понял — данный сервис нужен для автоматического отслеживания цены/наличия на отдельный товар.
Извлечение списка товаров со страницы каталоге не планируется?
Совершенно верно, мы используем технологию для слежения за ценами. Но кто-то может встроить Product API в свой сервис закладок, например. Или любое другое приложение, где пользователи хотят видеть базовую информацию о товаре. Например, модуль предпросмотра ссылок на интернет магазины для форумов или блогов.

Если коллеги-разработчики скажут, что нужна функция по URL списка товаров пройтись и обработать все ссылки на вещи, да ещё принять в учёт пагинацию — сделаем. Главное, чтоб были кейсы, которые упростят жизнь и окажутся востребованными.
Ваше API хотелось бы видеть для использования в приложениях, для создания мобильных клиентов сайтов, не имеющих API.
Т.е. не только для одного выбранного товара, а для получения каталога (всех данных товара со страницы) с сайта.
Спасибо за идею! В теории можно так использовать API, но где сейчас движок магазина, который не поддерживает мобильные шаблоны? У нас в приоритете сбор данных о товаре, а не краулинг. Т.е. в принципе, уже сейчас можно использовать Product API совместно с Вашим краулером.
Пожалуйста, жду доп. скидку, когда будет API готово :)
Дело не в краулинге (я верно понял — хождение по страницам сайта ?) — а в получении данных о всех товарах с открытой страницы. Хотя по одному товару — согласен, что и сейчас будет работать.
Записал ;-) Выше в комментариях уже просили научить API обрабатывать страницы с со списком товаров. Начали уже тренировать систему.
Цена не пришла, описание тоже

http://www.superdrug.com/Bourjois/Bourjois-Healthy-Mix-Foundation-Light-Vanilla-51/p/626461

{
«id»: «5828bfa540b895da69e1e038»,
«url»: «http://www.superdrug.com/Bourjois/Bourjois-Healthy-Mix-Foundation-Light-Vanilla-51/p/626461»,
«title»: «Bourjois Healthy Mix Foundation Light Vanilla 51»,
«img_url»: «http://www.superdrug.com/medias/custom-content/microsites/starbuys/popup/2016/wk46/starbuys_wk46.jpg»,
«created_at»: «2016-11-13T19:31:49.615Z»,
«last_track_at»: «2016-11-13T19:31:59.686Z»,
«unprocessed»: true
}
Спасибо за наводку. Обновили правила парсера, теперь корректно работает с сайтом.
Это же хабр. Хочется немного и технических подробностей. На каком стеке работает, каких сил стоила разработка, какой размер команды. Потому как крутость решения можно оченить только по сумму всех этих показателей.
В следующей заметке расскажу больше про команду (спасибо, что спросили ;-). И по технике будет чем поделиться, уже тестируем определение бренда производителя.
Мы использовали свои технологии от и до. А за наводку на Томита-Парсер — спасибо! Хотя, он сущности находит в тексте, немного не то, чем мы занимаемся. Кстати, похожая технология есть у ABBYY.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий