Программа (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
Комментарии
Здравствуйте, Всеволод.
Да, действительно, установка региона перестала работать несколько месяцев назад.
Что-то, видимо, поменялось на сайте Яндекса.
Переделывать эту часть кода - достаточно сложно, поэтому я этим не занимался.
(обычно всем достаточно поиска по одному региону, который можно выставить вручную 1 раз в настройках Internet Explorer - просто зайдя на сайт Яндекс Маркета, и указав своё месторасположение)
По какой-то причине не срабатывает установка региона.
Например:
если в яндекс маркете по умолчанию выставлена "Пермь", а в модуле modYandex строчка
YM.SetRegionByName "Москва"
То региональные настройки яндекс-маркета не меняются.
В меру своего понимания поизучал код.
Видимо сбой происходит где-то в модуле YandexMarket
в процедуре SetRegionByCode
Буду благодарен, если подскажите причину сбоя и возможность её устранения.
Спасибо, задержка работает. Буду проверять более 250 товаров.
Есть еще один вопрос, не могу преобразовать макрос так, чтобы в поле, где сейчас парт. номер, можно было вставлять ссылку на товар.
Нужно это для того, чтобы по запросу допустим на телефон не выдавал различные аксессуары, в названии которых фигурирует название самого телефона.
Самый простой способ сделать паузу в макросе - добавить такую строчку кода:
То же самое:
Добрый день. Как сделать задержку между запросами 6-7 секунд?
Ничего не работает, сканирование проходит нормально, а результат не выдает!
Как обратил внимание один из пользователей, макрос не работает в Excel 2010.
Специально проверил - всё работает, как и в любой другой версии Excel:
Отлично, спасибо!
Ну так пропишите - в чем проблема?
Сделайте по аналогии с первой лучшей ценой:
' берем вторую из самых дешевых позиций
Set MinimalPricePosition = Results.Items(2)
...
все отлично работает по 200 запросов без блокировки) а вот еще:
можно ли прописать в макросе -
1. лучшая цена (есть)
2. вторая цена после лучшей, соответственно с названием магазина ?
Дело в том, что после 200-250 запросов Яндекс понимает, что обращения к сервису выполняются автоматически (программой), и блокирует их, требуя ввести капчу (буквы с картинки).
Поскольку макрос не в состоянии распознать код на картинке, код перестаёт работать.
Вариантов решения есть несколько:
В этом случае при обработке больших объёмов данных окно с кодом будет появляться несколько раз.
(добавить в макрос список прокси-серверов, и подключаться через них)
(этот способ я не проверял - но, говорят, что в некоторых случаях помогает)
Первые 2 варианта - сложнореализуемые, третий же способ заметно увеличивает время работы макроса.
я несколько раз запускал макрос, и он перестал искать цены. В чем дело?
К чему привязываться, я не знаю (моя задача - код написать под требования заказчика, а не генерировать идеи, как и к чему привязаться)
Оптимальный вариант исходных данных для этого макроса - это ссылка на страницу результатов поиска конкретного товара на Яндекс.Маркете
Тогда, какой бы из результатов поиска вы не скормили макросу - он выведет вам и минимальную цену, и среднюю.
(но это потребует небольшой переделки кода)
У заказчика этой программы в качестве исходных данных были PartNumber - соответственно, макрос "заточен" под работу с этими данными (через поиск по Яндекс.Маркету)
Если вы имеете под PartNumber код производителя. то поиск не даст нужных результатов, тк по названию "Canon FC-108" ищется больше магазинов, чем по коду производителя "8461A014", тк не все его указывают в title. Может можно к чему-то другому привязаться? на сколько понял у каждого товара есть свой ID - может к нему, если можно. то подскажите пож как.
Хорошо. если PartNumber, то говорите. что всё будет ок. но как его узнать не подскажите?
PS: Бан сняли примерно через час.
Вместо какого названия? Какую ссылку? Я не телепат...
Если вы будете запрашивать цену на принтер (указав его PartNumber) - то макрос вернёт цену именно на принтер, а не на картридж.
Можно, конечно, упростить макрос, если есть готовые ссылки на конкретные товары - тогда макрос не будет выполнять поиск на Яндекс.Маркете, а будет сразу заходить по нужной ссылке, и загружать данные.
PS: Хочу отметить, что у этого макроса есть ограничение - около 200 запросов за один запуск.
После этого Яндекс требует ввести капчу (т.к. запросы идут часто, Яндекс понимает, что работает программа, и блокирует дальнейшие запросы)
Выход - использовать прокси-сервер, или поставить задержку между запросами.
Спасибо!!!!
Вопрос - а можно как-то вместа названия, вставлять ссылку, а то например хочу цену на принтер, а грабится цена на картридж?
Cпасибо большое.
Большое спасибо.
Отправить комментарий