Всем привет, сегодня я вам расскажу как использовать Selenium в python для парсинга страниц.
Selenium WebDriver – это программная библиотека для управления браузерами. WebDriver представляет собой драйверы для различных браузеров и клиентские библиотеки на разных языках программирования, предназначенные для управления этими драйверами.
По сути своей программа с использованием Selenium это бот который выполняет всю ручную работу с браузером автоматически.
Иногда могут возникать проблемы с работой на некоторых браузерах ( зачастую на Windows, машины на базах Mac OS имеют меньшие проблемы)
Приступим, для начала установим нужные нам библиотеки Selenium , выполнив команду в консоли:
pip install selenium
Дальше нам нужно скачать web driver для нужного нам браузера (у меня лично на Windows очень хорошо работал firefox, для использования на Mac OS вы можете использовать Safari его web driver установлен вместе с Safari и находится /usr/bin/safaridriver). Зачастую на Windows если вы используете Firefox вам потребуется в папку с проектом добавить geckodriver.log это файл обычно загружается вместе с драйвером. Скачав нужные нам файлы поместим их для удобства в папку где будет находится наш скрипт.
Приступим к написанию самого скрипта. Будем парсить картинки из яндекса, благодаря использования selenium мы будем полностью эмулировать действия пользователя, следовательно нас не заблочат, и мы сможем безнаказанно загружать картинки.
1 - Импортируем selenium, os и time.
from selenium import webdriver
import os
import time
2 - Добавим путь до geckodriver. Я использую библиотеку os, но вы можете указать путь любым удобным для вас способом.
gecko = os.path.normpath(os.path.join(os.path.dirname(__file__), 'geckodriver'))
3 - Добавим путь до используемого браузера.
binary = FirefoxBinary(r'C:\Program Files\Mozilla Firefox\firefox.exe')
4 - Инициализируем экземпляр драйвера, передадим в него путь до загруженного нами драйвера и до браузера. Еще есть необязательный параметр, options в котором можно указать тип запуска драйвера т.е. при старте скрипта браузер не будет открываться.
driver = webdriver.Firefox(firefox_binary=binary, executable_path=gecko+'.exe')
5 - Передадим в метод get ссылку на нужную нам страницу, в нашем случае это яндекс картинки и добавим небольшую задержку в 2 секунды чтобы страница прогрузилась.
driver.get('https://yandex.ru/images')
time.time(2)
6 - Для поиска по странице в selenium есть несколько методов подробнее про каждый метод вы можете прочитать в официальной документации selenium. Мы будем искать окно поиска, оно имеет класс input__control для поиска по классам будем использовать find_element_by_class_name для строки поиска.
element = driver.find_element_by_class_name("input__control")
7 - Далее нам нужно ввести какой то текст для поиска картинки. Для этого понадобится импортировать еще один метод, который будет нажимать в нашем случае клавишу Enter
from selenium.webdriver.common.keys import Keys
8 - Введем текст и выполним поиск нажав на Enter
element.send_keys("кошка", Keys.RETURN)
9 - Получим ссылки на картинки которые показал нам поиск. Используем также поиск по классам но уже найдем все классы а не один класс как использовали выше.
images = driver.find_elements_by_class_name("serp-item__thumb")
10 - Теперь в images мы имеем данные всех тегов которые загружены на странице, теперь остается получить из них ссылки на файлы и загрузить их. Загружать будем с помощью отправки запросов по полученной ссылке и сохранение полученных данных в фал. Импортируем библиотеку request. Воспользуемся циклом, после загрузки каждого изображения добавим таймаут.
Добавим в конц скрипта метод для закрытия браузера.
driver.quit()
Запустим наш скрипт.
После запуска мы увидим как откроется браузер, откроется страница яндекс картинок, в окне поиска введется текст «кошка» и произойдёт поиск похожих картинок далее из каждой загруженной картинки мы получим ссылку и сделаем get запрос а полученный результат сохраним в файл рядом со скриптом.
Вот и все наш "мини" парсер готов.