mail mail

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

Результат поиска цен на ноутбуки на Яндекс.Маркете по 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

ВложениеРазмер
YandexMarket.xls205 КБ

Комментарии

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

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

Здравствуйте, Всеволод.
Да, действительно, установка региона перестала работать несколько месяцев назад.
Что-то, видимо, поменялось на сайте Яндекса.
Переделывать эту часть кода - достаточно сложно, поэтому я этим не занимался.
(обычно всем достаточно поиска по одному региону, который можно выставить вручную 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
Подтвердите, пожалуйста, что вы - человек:
6 + 5 =
Решите эту простую математическую задачу и введите результат. Например, для 1+3, введите 4.