Как реализовать загрузку изображений на гугл картинки с помощью Selenium Python

Рейтинг: 3Ответов: 1Опубликовано: 26.04.2023

Возникла проблема с поиском похожих изображений из Гугл картинок, так как api для него нет, пытался сделать поиск ихображений с помощью selenium. Но когда я загружаю свою картинку, то браузер будто ничего не принимает и не происходит переход, на страницу с картинками. Вот пример как я пытался сделать (код корявый, так как только начал). За использование полного пути XPATH не бейте :)

import os

from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options

option = Options()

option.add_argument("--disable-infobars")
option.add_argument("start-maximized")
option.add_argument("--disable-extensions")

option.add_experimental_option("prefs", {
    "profile.default_content_setting_values.notifications": 2
})

driver = webdriver.Chrome(chrome_options=option)
driver.implicitly_wait(20)
driver.get("https://images.google.com/")
# driver.find_element(By.CSS_SELECTOR, "#uniq1682412409505158658").send_keys('ffff')
clickable = driver.find_element(By.XPATH, "/html/body/div[1]/div[3]/form/div[1]/div[1]/div[1]/div/div[3]/div[4]")
ActionChains(driver) \
    .click(clickable) \
    .perform()
driver.find_element(By.CLASS_NAME, "DV7the").send_keys('/ex1.jpg')

print(driver.current_url)

Сам вопрос как сделать загрузку картинки и перейти на страницу с результатом. А дальше распарсить будет не так сложно. Версия selenium 4.9.0 webdriber 3.8.6

Ответы

▲ 1Принят

Вопрос неоднозначный т.к. реализация загрузки у google идет через скрипты. Основной элемент в составе страницы, в который визуально загружается файл - span, но всю обработку делают js-скрипты.

Пройдемся по вариантам реализации загрузки изображения.

  1. Самый плохой вариант с точки зрения универсальности, но самый простой - использовать библиотеку pyautogui. Для использования такого варианта - не должно быть дополнительных задач на ПК, т.к. библиотека имитирует реального пользователя. Код - как пример указал.
import time
import pyautogui as pg
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options

options = webdriver.ChromeOptions()

options.add_argument("--disable-infobars")
options.add_argument("start-maximized")
options.add_argument("--disable-extensions")

driver = webdriver.Chrome(chrome_options=options)
driver.implicitly_wait(10)
driver.get("https://images.google.com/")
driver.find_element(By.XPATH, "/html/body/div[1]/div[3]/form/div[1]/div[1]/div[1]/div/div[3]/div[4]").click()
driver.find_element(By.XPATH, "/html/body/div[1]/div[3]/form/div[1]/div[1]/div[3]/c-wiz/div[2]/div/div[3]/div[2]/div/div[2]/span").click()

time.sleep(3)
pg.write(r"C:\path\to\test.png")
pg.press('enter')

time.sleep(10)
  1. Следующий вариант реализации - использовать класс Robot. Подробнее узнать можно тут: https://stackoverflow.com/questions/11256732

  2. Ещё один вариант реализации - загрузить все на свой сервер и вводить в форму ссылку на фото. Самый практичный и простой вариант (только затраты на сервер :)

В любом случае - универсального решения через код нет, т.к. проще всего было бы сделать через api данного сервиса, но при поиске не смог найти вариант загрузки.

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

Сам сталкивался с вопросом такой загрузки на другой сервис, но это все, что я в тот момент мог использовать.