
Всем привет! Сегодня разберем по-настоящему «боевую» задачу. Представьте: вы увидели крутые кроссовки или редкую видеокарту на фото, но не знаете ни модели, ни названия. Или вы перекуп и хотите найти, где товар выставили дешевле, имея только скриншот. Искать текстом долго и неэффективно. Нам нужен скрипт, который возьмет файл изображения, «скормит» его поисковику и вернет нам прямые ссылки на объявления. Мы уже обсуждали клик по координатам в Python, но сегодня мы разберем как сделать с помощью python поиск объявления по картинке, это реализовать можно несколькими способами, и мы разберем самые эффективные из них, которые реально работают в 2026 году.
Оглавление
Логика работы: Как искать товары в интернете по фото?
Большинство крупных площадок вроде Avito или AliExpress тратят огромные бюджеты на защиту от ботов. Попытка напрямую загружать фото в их внутренний поиск часто заканчивается капчей. Поэтому самый надежный путь — использовать поисковые системы (Google Images, Yandex Images или Bing Visual Search). Эти гиганты уже проиндексировали все объявления в мире. Наша задача сводится к трем этапам:
- Загрузить ваше изображение на сервер поисковика.
- Получить страницу с результатами поиска, где указаны сайты (домены досок объявлений).
- Отфильтровать ссылки, оставив только те, что ведут на нужные нам маркетплейсы.
Такой подход позволяет реализовать в python поиск объявления по картинке максимально стабильно. Вам не нужно писать отдельный парсер под каждый магазин — поисковик сделает всю грязную работу за вас. Главное здесь — правильно автоматизировать процесс загрузки файла, чтобы это не выглядело как атака бота. Для этого мы будем использовать Selenium, о котором подробно я писал в Selenium на Python: полное руководство.
Метод 1: Автоматизация через Selenium (Yandex Images)
Почему именно Yandex? На текущий момент поиск по картинкам у Яндекса работает на порядок точнее для СНГ-рынка и лучше находит конкретные лоты на досках объявлений, чем Google. Скрипт будет имитировать действия человека: откроет страницу поиска, нажмет на иконку фотоаппарата, загрузит файл и соберет ссылки на найденные сайты. Чтобы код был надежным, мы используем поиск элемента в java скрипте python, так как интерфейс поисковиков перегружен динамическими элементами.
📚 Документация:Selenium WebDriver — Инструменты автоматизации «WebDriver позволяет программно управлять поведением браузера, имитируя действия реального пользователя. Это необходимо для задач, где контент формируется динамически или требуется взаимодействие с формами загрузки файлов.»
Ниже пример кода, который автоматизирует этот процесс. Для работы вам понадобится библиотека selenium и установленный драйвер браузера. Для управления зависимостями лучше использовать uv — менеджер пакетов, чтобы избежать конфликтов версий.
import os
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
def search_product_by_image(file_path):
# Настройка браузера
options = webdriver.ChromeOptions()
# options.add_argument("--headless") # Можно запустить в фоновом режиме
driver = webdriver.Chrome(options=options)
try:
# 1. Переходим в Яндекс Картинки
driver.get("https://yandex.ru/images/")
# 2. Ждем появления кнопки поиска по фото и кликаем
wait = WebDriverWait(driver, 10)
camera_icon = wait.until(EC.element_to_be_clickable((By.CLASS_NAME, "search-form__icon_type_camera")))
camera_icon.click()
# 3. Находим скрытый input для загрузки файла
file_input = driver.find_element(By.CSS_SELECTOR, "input[type='file']")
# Отправляем абсолютный путь к картинке
file_input.send_keys(os.path.abspath(file_path))
print("Файл загружен, ждем результаты...")
# 4. Ждем загрузки результатов и ищем ссылки на объявления
# Обычно они находятся в блоке "Кажется, на изображении..." или "Сайты, где встречается"
time.sleep(5) # Даем время на рендеринг JS
links = driver.find_elements(By.CSS_SELECTOR, "a.CbirSites-ItemTitleLink")
results = []
for link in links:
url = link.get_attribute("href")
# Фильтруем только нужные площадки
if "avito.ru" in url or "youla.ru" in url or "ozon.ru" in url:
results.append(url)
return results
finally:
driver.quit()
# Запуск
found_ads = search_product_by_image("my_item.jpg")
print(f"Найдено объявлений: {len(found_ads)}")
for ad in found_ads:
print(f"Ссылка: {ad}")
Разбор кода:
- os.path.abspath(file_path): Selenium требует полный путь к файлу для корректной загрузки. Никогда не используйте относительные пути в методе
send_keys. - By.CSS_SELECTOR: Мы ищем скрытый элемент
input. Это стандартный трюк для автоматизации загрузки файлов — мы не кликаем по кнопке «Выбрать файл», а сразу «скармливаем» путь инпуту. - Фильтрация по доменам: Это самая важная часть. Поисковик выдаст сотни ссылок, включая соцсети и блоги. Нам же нужны только торговые площадки, поэтому мы проверяем вхождение строк
avito.ru,ozon.ruи т.д.
Метод 2: Использование API (SerpApi) для стабильной работы
Если вам нужно делать сотни поисковых запросов в день, Selenium станет узким местом: браузер ест много памяти, а Яндекс начнет выдавать капчу. Для профессиональных задач в python для поиска объявлений по картинке, лучше реализовывать через платные API-шлюзы, такие как SerpApi. Они предоставляют готовый JSON со всеми результатами поиска Google или Yandex, взяв на себя обход блокировок.
Это гарантирует, что ваш скрипт не упадет в самый ответственный момент. Вы получаете структурированные данные: заголовок сайта, ссылку и даже цену, если она отобразилась в сниппете. Это позволяет писать чистый код на Python, не тратя время на бесконечные правки селекторов, которые поисковики меняют раз в месяц.
import requests
def search_via_serpapi(image_url, api_key):
# Параметры запроса к SerpApi (движок Google Images)
params = {
"engine": "google_reverse_image",
"image_url": image_url,
"api_key": api_key
}
response = requests.get("https://serpapi.com/search", params=params)
data = response.json()
# Ищем блок с похожими страницами
image_results = data.get("image_results", [])
ads_links = []
for item in image_results:
link = item.get("link")
if any(market in link for market in ["ebay.com", "amazon.com", "avito.ru"]):
ads_links.append(link)
return ads_links
Объяснение кода:
- requests: Мы используем стандартную библиотеку для HTTP-запросов. Это намного легче и быстрее, чем запускать целый браузер через Selenium.
- JSON-структура: В отличие от парсинга HTML, работа с JSON исключает ошибки из-за изменения дизайна сайта. Вы просто берете значение по ключу
link. - image_url: Обратите внимание, что API чаще всего просит прямую ссылку на фото в интернете, а не локальный файл. Если фото у вас на диске, его нужно сначала загрузить на любой хостинг (например, Imgur).
Подводные камни: почему товар может не найтись?
Даже если вы идеально настроили в python поиск объявления по картинке, результаты могут быть пустыми. Вот основные причины:
- Уникальность фото: Если продавец сделал фото сам на фоне ковра, а вы ищете по студийному снимку из каталога — поисковик может не связать их.
- Свежесть объявления: Поисковым роботам нужно от нескольких часов до пары дней, чтобы проиндексировать новый лот. Совсем свежие объявления (выставленные 5 минут назад) через картинки найти почти невозможно.
- Водяные знаки: Авито и другие площадки часто накладывают свои логотипы. Это сбивает алгоритмы сравнения.
Чтобы повысить точность, опытные разработчики сначала обрезают картинку, удаляя лишний фон с помощью OpenCV, и только потом отправляют её на поиск. Избегайте ошибок новичков в Python — не пытайтесь искать по слишком маленьким или размытым изображениям.
Финальный код: Мощный парсер объявлений по фото
Этот скрипт объединяет всё вышесказанное. Он берет картинку, ищет её через Яндекс и выводит список всех найденных объявлений, очищенный от мусора. Это готовое решение для мониторинга рынка.
import os
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
class AdFinder:
def __init__(self):
# Автоматическая загрузка драйвера
self.driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
self.markets = ["avito.ru", "youla.ru", "olx.ua", "ebay.com", "aliexpress.com"]
def find_ads_by_photo(self, photo_path):
driver = self.driver
driver.get("https://yandex.ru/images/")
try:
# Открываем панель загрузки
wait = WebDriverWait(driver, 15)
btn = wait.until(EC.presence_of_element_located((By.CLASS_NAME, "search-form__icon_type_camera")))
btn.click()
# Загружаем файл
input_file = driver.find_element(By.CSS_SELECTOR, "input[type='file']")
input_file.send_keys(os.path.abspath(photo_path))
# Ждем перехода на страницу результатов
wait.until(EC.url_contains("cbir"))
print("Анализируем результаты...")
# Собираем все найденные сайты
# Класс может меняться, поэтому ищем широким селектором по заголовкам
time.sleep(3)
site_elements = driver.find_elements(By.XPATH, "//a[contains(@class, 'link')]")
final_links = set() # Используем set для уникальности
for el in site_elements:
href = el.get_attribute("href")
if href and any(m in href for m in self.markets):
final_links.add(href)
return list(final_links)
except Exception as e:
print(f"Ошибка поиска: {e}")
return []
finally:
driver.quit()
if __name__ == "__main__":
finder = AdFinder()
links = finder.find_ads_by_photo("product_photo.jpg")
print(f"\nНайдено {len(links)} релевантных объявлений:")
for l in links:
print(f"[+] {l}")
Почему этот код — «универсальный»?
- WebDriverManager: Вам не нужно скачивать chromedriver.exe вручную. Скрипт сам найдет и установит нужную версию.
- Использование Set: Мы автоматически удаляем дубликаты ссылок, которые часто возникают на странице поиска.
- Гибкий XPATH: Поиск ссылок через
containsпозволяет находить объявления даже если Яндекс изменит названия CSS-классов.
Заключение
Мы разобрали с вами, как можно реализовать с помощью python, поиск объявления по картинке, превратив обычный браузер в мощный инструмент детективной работы. Помните: поиск по фото — это не магия, а работа с индексами поисковых гигантов. Комбинируйте этот метод с парсингом текста, используйте качественные исходные изображения и не забывайте про задержки, чтобы ваш бот не выглядел подозрительно. Теперь вы можете найти любой товар, просто «показав» его своему коду.
• Selenium на Python: полное руководство — база для работы с браузером
• Поиск элементов через JavaScript — как кликать по «хитрым» кнопкам поисковиков
• Как писать чистый код на Python — чтобы ваши парсеры было легко поддерживать
📢 Подписывайтесь на Telegram-канал PythonAuto, чтобы не пропустить новые гайды по автоматизации, парсингу и разные трюки на Python.
👉 Ваш интерес — лучшая мотивация для новых статей!