CoderCastrov logo
CoderCastrov
Selenium

Автоматизация парсинга изображений Google с использованием Selenium

Автоматизация парсинга изображений Google с использованием Selenium
просмотров
6 мин чтение
#Selenium

Метод парсинга веб-страницы: с использованием Selenium

Код доступен по ссылке: https://github.com/dianoctaviani/selenium_img_scraper

Парсинг с использованием Selenium

В этом блоге рассматривается метод парсинга изображений Google с использованием Selenium в сочетании с Python и Chrome Web Driver. Предоставляется практический пример применения Selenium. В этом посте также объясняются основы Selenium и его работа.


Описание

Для контекста, у нас есть набор данных, содержащий 118 пар ключевых слов для поиска, состоящих из общих и научных ботанических названий съедобных овощей и фруктов. Используя список научных названий, нам нужно создать 1 визуальное представление для каждого овоща или фрукта, чтобы создать базу знаний.

Примечание: Мы используем научное название вместо общего названия, чтобы исключить возможность получения изображений на основе фруктовых торговых марок, таких как Apple Inc.

Для списка названий я создал еще один скрипт для парсинга (не включен в этот учебник), чтобы получить список общих и научных ботанических названий съедобных овощей и фруктов.

Я собрал набор данных в .csv и сделал его доступным для скачивания в папке input в предоставленном репозитории GitHub, а также на Kaggle: https://www.kaggle.com/dianoctaviani/scientific-botanical-names-of-fruits-vegetables

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

Основы Selenium

Что такое Selenium? Selenium - это инструмент для управления веб-браузерами через программы и выполнения автоматизации браузера. Он в основном используется в качестве тестового фреймворка для платформ с поддержкой разных веб-браузеров. Однако Selenium также является очень мощным инструментом для общей автоматизации веб-сайтов, так как мы можем программировать его для выполнения того, что пользователь может делать в браузере (в данном случае, программно загружать изображения с Google).

Для автоматизации работы мы будем использовать комбинацию Selenium, Python и Chrome Web Driver.

Стратегии поиска элементов

Итак, как именно работает Selenium? Selenium предоставляет механизмы для поиска элементов на веб-странице, которые могут быть последовательно объединены для имитации взаимодействия пользователя на веб-странице.

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

1. find_element_by_id - **ID**
2. find_element_by_name - **Имя** 
3. find_element_by_link_text - **Текст ссылки**
4. find_element_by_partial_link_text - **Частичный текст ссылки**
5. find_element_by_tag_name - **Тег**
6. find_element_by_class_name - **Имя класса**
7. find_element_by_css_selector - **CSS (Каскадные таблицы стилей)**
8. find_element_by_xpath - **XPath (XML Path)**9. **DOM (Моделирование объектов данных)**

Эти элементы могут быть идентифицированы с помощью функции Inspector, доступной из Инструментов разработчика в браузере.

Инструмент разработчика браузера Выбран элемент веб-страницы с помощью инспектора

После выбора элемента веб-страницы мы можем скопировать его в различных форматах, таких как XPath, outerHTML, JS Path и т.д., и проанализировать необходимые идентификаторы, имена, теги или пути, которые нам нужны для выполнения необходимых действий.

Браузер без графического интерфейса (Headless Browser)

Прежде чем мы перейдем к коду, давайте поговорим о том, что такое браузер без графического интерфейса и почему нам нужно его использовать. Вкратце, браузеры без графического интерфейса - это веб-браузеры без графического пользовательского интерфейса (GUI), которые обычно управляются программно или через командную строку (CLI).

Автоматизация управления Chrome с включенным GUI может увеличить использование ЦП и/или памяти. Оба этих показателя связаны с необходимостью отображения браузера с отрисованными графиками с запрошенного URL-адреса. Это увеличивается еще больше, когда одновременно запускаются несколько окон или вкладок.

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

Метод автоматизации

Установка

Код доступен по ссылке: https://github.com/dianoctaviani/selenium_img_scraper

Теперь давайте установим необходимые библиотеки, необходимые для работы скрипта.

Установите Selenium с помощью PyPi:

$ pip3 install selenium

Установите WebDriver Manager с помощью PyPi:

$ pip3 install webdriver_manager

Последовательность действий

Чтобы получить изображения каждого фрукта или овоща, мы создадим скрипт для итерации по списку имен, которые нужно искать в Google, а затем перейдем к загрузке первого изображения, которое появляется в каждом результате поиска (изображения будут сохранены в исходном размере и разрешении).

Я разделил указанные выше действия на два отдельных скрипта .py:

1. selenium_img_src_crawler.py
2. selenium_img_downloader.py

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

Первый скрипт (selenium_img_src_crawler.py) используется для поиска и получения ссылок на источники изображений в пакетном режиме и выводит их в файл img_src_links.csv. Второй скрипт позже обработает ссылки и выполнит массовую загрузку.

Вот пошаговое объяснение того, что включено в первый скрипт.

2. Чтение и сохранение списка научных названий фруктов и овощей в столбце scientific_names в файле input/scientific_botanical_names_veggies_fruits.csv.

Примечание: Поисковые запросы можно настроить, просто измените файлы, чтобы включить список поисковых запросов и измените названия столбцов.

3. ChromeDriverManager установит драйвер веб-браузера Chrome и пропустит его, если уже найден существующий драйвер в кэше. Функция с названием search_google будет итеративно искать список научных названий через Google Images, динамически назначая ключевое слово для search_url.

Также внутри функции включены несколько опций, таких как отключение графического процессора и режим headless.

4. Расширение функции search_google позволяет щелкнуть на первом блоке изображения, который появляется в результате поиска, найдя элемент через XPath.

5. Следующий фрагмент внутри функции search_google получает ссылку на источник оригинального изображения, получая атрибут, содержащий источник (src).

Здесь возникают некоторые сложности. По умолчанию в миниатюрных блоках Google не хранит атрибут src изображения в виде обычного URL. Вместо этого он хранится как хэш в кодировке base64 (например, начинается с data:image/jpeg:base64./…..), но после множества тестов я нашел способ обойти это.

Решение заключается в том, чтобы щелкнуть на блоке изображения и сохранить ссылку на источник изображения из боковой панели вместо миниатюр изображения. Мы должны добавить функцию time sleep, чтобы иметь достаточно времени для выполнения этого действия, и в большинстве случаев это вернет прямые URL-ссылки на источники изображений.

Вот фрагмент кода:

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

6. Следующий фрагмент вызывает функцию search_google внутри цикла for и добавляет список искомых ключевых слов и URL-адресов источников изображений в файл с именем img_src_links.csv, расположенный в output/links:

  • используя вертикальную черту (|) в качестве разделителя
  • заменить пробелы на подчеркивания (_) в поисковых запросах

Вот полный первый скрипт (selenium_img_src_crawler.py)

Теперь, когда у нас есть список ссылок на источники изображений, мы теперь обработаем ссылки и загрузим серию изображений во втором скрипте (selenium_img_downloader.py)

2. Следующий фрагмент читает список источников изображений, полученных из предыдущего скрипта.

3. Создана функция check_for_b64, чтобы обработать содержимое источника изображения, содержащее кодировку base64.

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

  2. Функция download_img() была написана для обработки запроса и выполнения загрузки. Она проходит по списку src из img_src и определяет, является ли он кодированным в base64 или прямым URL-адресом. Если это кодированный в base64 хэш, то он будет декодирован, иначе будет выполнен веб-запрос для получения изображения по URL-адресу источника изображения.

Она также динамически назначает имя выходного файла с использованием поисковых запросов и сохраняет изображение с расширением .png.

Могут возникать ошибки 403 Forbidden из-за серии вызванных веб-запросов, и это связано с неавторизованными запросами, которые неизбежны. Блок try-catch пропустит любые неудачные запросы и регистрирует ошибки в файле logging/logging.log.

  1. Проверьте путь output/images, чтобы увидеть список загруженных изображений, и мы закончили!

Вот полный второй скрипт (selenium_img_downloader.py)

Спасибо за чтение!

Код доступен по ссылке: https://github.com/dianoctaviani/selenium_img_scraper

Просто склонируйте его и установите необходимые модули, он должен запуститься сразу. Вы можете настроить входной набор данных и изменить пути к файлам по своему усмотрению! :)