Поиск цен на Яндекс.Маркете

Результат поиска цен на ноутбуки на Яндекс.Маркете по PartNumber

Программа (3 модуля класса + примеры их использования) предназначена для поиска товаров в Яндекс.Маркете, с последующей загрузкой результатов поиска.

Исходными данными является название (или модель, PartNumber, и т.п.) товара.

 

На выходе код выдаёт информацию о результатах поиска - 10 (или более) позиций искомого товара,
где для каждой позиции указаны следующие характеристики:

  • цена (в рублях)
  • наименование продавца (название организации)
  • название товара у этого продавца
  • ссылка на страницу с описанием товара (цена, наличие, условия поставки, описание)

В настройках можно задавать регион для поиска (код региона, или название города \ области \ страны \ континента)

Возвращаемые позиции отсортированы по цене - в порядке её возрастания
(сначала идут самые дешевые товары)

Смотрите также расширенную версию программы поиска цен на Яндекс.Маркете,
с возможностью загрузки цен как по названиям товаров, так и по ссылкам на Яндекс.маркет

Во время запроса данных с сайта Яндекса отображается прогресс-бар.

Во вложении (пароль на проект VBA - 1 (единица)) - пример запроса цен на ноутбуки (исходными данными являются их парт-номера)

Пример использования:

Sub ПримерПоискаЦенНаЯндексМаркете()
    ' создаём объект YM типа YandexMarket
    Dim YM As New YandexMarket, Results As YandexMarketResults
    ' устанавливаем регион для поиска
    YM.SetRegionByName "Москва"
 
    ИскомаяПозиция = "LX.ND701.001"    ' PartNumber или модель товара (в примере - это ноутбук)

    ' производим поиск заданной позиции на Яндекс.Маркете
    ' (позиции отсортированы по цене - начиная с минимальных)
    Set Results = YM.ExecuteQuery(ИскомаяПозиция)
 
    ' вычисляем среднюю цену первых 5 позиций
    СредняяЦенаПервыхПятиПозиций = Results.AveragePrice(5)
 
    MsgBox "Средняя цена: " & СредняяЦенаПервыхПятиПозиций & " руб.", _
           vbInformation, "Искомая позиция: " & ИскомаяПозиция
 
    Dim MinimalPricePosition As YandexMarketResult
    ' берем самую первую (самую дешевую) позицию
    Set MinimalPricePosition = Results.Items(1)
 
    ' выводим информацию об этой позиции
    msg = "Дешевле всего """ & ИскомаяПозиция & """ можно купить в """ & MinimalPricePosition.shop & """" & _
          "- по цене " & MinimalPricePosition.price & " руб." & vbNewLine & vbNewLine & _
          "Товар там называется """ & MinimalPricePosition.product & """"
    MsgBox msg, vbInformation, "Поиск самого дешевого " & ИскомаяПозиция
 
    Set YM = Nothing    ' уничтожаем объект YM
End Sub

Вложения:

Комментарии

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".

Антон, на основе этого макроса сделана универсальная программа:
http://excelvba.ru/programmes/YandexMarket

Там и таймаут реализован, и вывести можно любые данные в любые столбцы, и много других возможностей.
А макрос из этой статьи дорабатывать не планирую.

Добавка к 3-му пункту. Столбцы с Ценой и Продавцом, как это реализовано для самой низкой цены.
Спасибо огромное за Вашу работу)

Спасибо большое за оперативность. Мне тоже идея с минус словами пришла.
Очень хочется у вас еще спросить вот о чем:
1. Я не спец в макросах, но кое что понимаю. Отредактировать самостоятельно Ваш файл не получается. Вы закрыли возможность редакции Ваших макросов?
2. Был разговор о тайауте. Вы его добавили в свой файл?
3. Был разговор о выводе отдельными столбиками первых десяти позиций по цене. Очень полезная вещь. Вы могли бы добавить эти данные?
4. И я столкнулся с тем, что в столбике наименования товара у Вас на название стоит ограничение. После определенного количества знаков, дальнейшие символы заменены на троеточие. Не могли бы Вы убрать ограничение?
Я понимаю, что многовато...но я очень полезна Ваша работа. Я долго сам бился над тем, что бы сделать то, что сделали Вы...но не хватает компетенции. Помогите...если нет времени и желания ковыряться, хотя бы объясните, как отредактировать Ваши макросы. Редакция неактивна.

Надо просто немного точнее формулировать поисковый запрос, - тогда чехлов, скорее всего, не будет в выдаче.
Например, вместо «iPhone 6 Plus» попробовать поискать «Apple iPhone 6 Plus 64Gb»

Мой макрос просто подставляет в поисковую строку Яндекс.Маркета то, что у вас в ячейке
Так что вы можете вместо запроса «iPhone» написать «iPhone -чехол»
(т.е. яндекс сам увидит минус-слова в поисковой строке, - макрос для этого дорабатывать необязательно)

Спасибо за труд. Отличная идея. Вот только с товаром вроде мобильных телефонов очень сложно работать. Там подтягиваются чехлы, аксессуары всякие и т.п. А можно ли реализовать как-то минус слова. Что бы сразу зашить их, и если они встречаются отсеивать ненужные позиции

Здравствуйте, Максим.
Регион можно задать в универсальной версии этой программы:
http://excelvba.ru/programmes/YandexMarket
А чтобы перебирать разные регионы - можно написать дополнительный макрос, управляющий программой, типа такого:
http://excelvba.ru/programmes/YandexMarket/macro

Добрый день!
Подскажите пожалуйста, как для выгрузки первых десяти цен из яндекс маркета задать регион?
И желательно получить выгрузку вообще по всем регионам.
Заранее спасибо!

Объясните пожалуйста механизм поиска парт-номера на Яндекс.Маркете а именно какая функция осуществляет этот поиск и как работает функция

Function RussianStringToURLEncode

прошу ответ на e-mail

У меня вопрос по-поводу работы скрипта. Забиваю позицию в поле "Парт-номер" - Ballu BPPC-12НD. Показывает, что самая низкая цена на маркете 15503р. Перехожу по ссылке, если сортировать по цене, то это цена занимает 14 место. С чем связано такое поведение скрипта? Потому что с остальными товарами все в порядке.
P.S. Спасибо за скрипт. Очень нужная вещь. Жаль, что не все ценят.

что самое интересное, Вы всегда говорите что можно сделать лучше, но не делаете.
По оплате.... Вы этот модуль делали бесплатно ? Я думаю, Вы догадываетесь почему Я задал этот вопрос.....
Сделать сайтик и впаривать ниже среднего услуги по ценам профи, да это современно

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

Если реализация, на ваш взгляд, так уж слаба, - предложите свою. Критиковать каждый может - тут много ума не надо...
Я знаю, что можно реализовать программу несколько иначе, - но пока не вижу смысла переделывать её (вы же не заплатите за переделку)
К тому же, программа работает (загружает с Яндекса необходимые цены) - а от неё больше ничего не требуется.

реализация крайне слабая, да идея не Ваша

Здравствуйте, Всеволод.
Да, действительно, установка региона перестала работать несколько месяцев назад.
Что-то, видимо, поменялось на сайте Яндекса.
Переделывать эту часть кода - достаточно сложно, поэтому я этим не занимался.
(обычно всем достаточно поиска по одному региону, который можно выставить вручную 1 раз в настройках Internet Explorer - просто зайдя на сайт Яндекс Маркета, и указав своё месторасположение)

По какой-то причине не срабатывает установка региона.
Например:
если в яндекс маркете по умолчанию выставлена "Пермь", а в модуле modYandex строчка
YM.SetRegionByName "Москва"
То региональные настройки яндекс-маркета не меняются.

В меру своего понимания поизучал код.
Видимо сбой происходит где-то в модуле YandexMarket
в процедуре SetRegionByCode

Буду благодарен, если подскажите причину сбоя и возможность её устранения.

Спасибо, задержка работает. Буду проверять более 250 товаров.

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

Нужно это для того, чтобы по запросу допустим на телефон не выдавал различные аксессуары, в названии которых фигурирует название самого телефона.

Самый простой способ сделать паузу в макросе - добавить такую строчку кода:

Application.Wait Now + 7 / 86400 ' пауза 7 секунд

То же самое:
Application.Wait Now + TimeSerial(0, 0, 7) ' пауза 7 секунд

Добрый день. Как сделать задержку между запросами 6-7 секунд?

Ничего не работает, сканирование проходит нормально, а результат не выдает!

Как обратил внимание один из пользователей, макрос не работает в Excel 2010.

Специально проверил - всё работает, как и в любой другой версии Excel: 

 

Отлично, спасибо!

Ну так пропишите - в чем проблема?

Сделайте по аналогии с первой лучшей ценой:

...
    ' берем вторую из самых дешевых позиций
   Set MinimalPricePosition = Results.Items(2)
...

все отлично работает по 200 запросов без блокировки) а вот еще:
можно ли прописать в макросе -
1. лучшая цена (есть)
2. вторая цена после лучшей, соответственно с названием магазина ?

Дело в том, что после 200-250 запросов Яндекс понимает, что обращения к сервису выполняются автоматически (программой), и блокирует их, требуя ввести капчу (буквы с картинки).

Поскольку макрос не в состоянии распознать код на картинке, код перестаёт работать.

Вариантов решения есть несколько:

  • при появлении капчи сделать вывод диалогового окна с картинкой, чтобы пользователь ввёл запрашиваемый Яндексом код.
    В этом случае при обработке больших объёмов данных окно с кодом будет появляться несколько раз.
  • организовать работу с Яндекс.Маркетом через прокси-серверы
    (добавить в макрос список прокси-серверов, и подключаться через них)
  • поставить паузу между запросами (должно хватить 6-7 секунд)
    (этот способ я не проверял - но, говорят, что в некоторых случаях помогает)

 

Первые 2 варианта - сложнореализуемые, третий же способ заметно увеличивает время работы макроса.

я несколько раз запускал макрос, и он перестал искать цены. В чем дело?

К чему привязываться, я не знаю (моя задача - код написать под требования заказчика, а не генерировать идеи, как и к чему привязаться)

Оптимальный вариант исходных данных для этого макроса - это ссылка на страницу результатов поиска конкретного товара на Яндекс.Маркете
Тогда, какой бы из результатов поиска вы не скормили макросу - он выведет вам и минимальную цену, и среднюю.
(но это потребует небольшой переделки кода)

У заказчика этой программы в качестве исходных данных были PartNumber - соответственно, макрос "заточен" под работу с этими данными (через поиск по Яндекс.Маркету)

Если вы имеете под PartNumber код производителя. то поиск не даст нужных результатов, тк по названию "Canon FC-108" ищется больше магазинов, чем по коду производителя "8461A014", тк не все его указывают в title. Может можно к чему-то другому привязаться? на сколько понял у каждого товара есть свой ID - может к нему, если можно. то подскажите пож как.

Хорошо. если PartNumber, то говорите. что всё будет ок. но как его узнать не подскажите?

PS: Бан сняли примерно через час.

Вместо какого названия? Какую ссылку? Я не телепат...
Если вы будете запрашивать цену на принтер (указав его PartNumber) - то макрос вернёт цену именно на принтер, а не на картридж.

Можно, конечно, упростить макрос, если есть готовые ссылки на конкретные товары - тогда макрос не будет выполнять поиск на Яндекс.Маркете, а будет сразу заходить по нужной ссылке, и загружать данные.

PS: Хочу отметить, что у этого макроса есть ограничение - около 200 запросов за один запуск.
После этого Яндекс требует ввести капчу (т.к. запросы идут часто, Яндекс понимает, что работает программа, и блокирует дальнейшие запросы)
Выход - использовать прокси-сервер, или поставить задержку между запросами.

Спасибо!!!!
Вопрос - а можно как-то вместа названия, вставлять ссылку, а то например хочу цену на принтер, а грабится цена на картридж?

Cпасибо большое.

Большое спасибо.

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

Содержание этого поля является приватным и не предназначено к показу.
CAPTCHA
Подтвердите, пожалуйста, что вы - человек:
 __     __  _                  ____     ___  
\ \ / / / | __ _ ___ / ___| ( _ )
\ \ / / | | / _` | / _ \ \___ \ / _ \
\ V / | | | (_| | | __/ ___) | | (_) |
\_/ |_| \__, | \___| |____/ \___/
|_|
Введите код, изображенный в стиле ASCII-арт.

Не получается применить макрос? Не удаётся изменить код под свои нужды?

Оформите заказ у нас на сайте, не забыв прикрепить примеры файлов, и описать, что и как должно работать.