Модуль Selenium

Selenium — модуль управляющий браузером под пилотированием кода Python путем программной имитации действий кожаного пользователя на сайтах. Модуль предоставляет более гибкий функционал, нежели requests и bs4, а так же снижает вероятность того, что скрипт будет распознан и заблокирован при работе на сайтах с серьезной защитой, так как строка user-agent в HTTP запросе не будет содержать палевной информации, как например ‘python-reports/2.21.0’ при использовании модуля requests. Т.е. при использовании Selenium строка user-agent будет такой же, как у используемого браузера.

Установка модуля Selenium: pip install selenium

Запуск браузера под управлением Selenium

Для запуска какого-либо браузера под управлением Selenium необходимо импортировать webdriver, входящий в его состав, и создать объект браузера, выбрав необходимый после точки, как на примере ниже. После чего передать методу get созданного объекта путь к необходимому для посещения ресурсу.

from selenium import webdriver

browser = webdriver.Chrome()
browser.get('https://bednyakov.ru')

Поиск элементов на веб-странице
Кроме метода get, объект обладает и огромным разнообразием других, необходимых для работы методов. Подробнее можете узнать в официальной документации модуля.

А сейчас интересуют методы find_element() и find_elements(), возвращающие одиночный искомый элемент или список элементов, соответственно. Для демонстрации их работы сначала руками, используя инструменты разработчика, найдем какой-либо объект на моей странице, а потом найдем его же с помощью find_element(). Как показано на скриншоте ниже, я нашел объект класса ‘entry-title’.

Чтобы найти его же при помощи Selenium, исполните следующий код:

from selenium import webdriver
from selenium.webdriver.common.by import By

browser = webdriver.Chrome()
browser.get('https://bednyakov.ru')

try:
    content = browser.find_element(By.CLASS_NAME, 'entry-title')
    print(f'Контент класса {content.tag_name} найден.')
except:
    print('Искомый элемент не обнаружен.')

В метод мы передаем два параметра — тип искомого элемента и его название. И еще мы отдельно импортировали ‘By’, как это указано в документации, которая к прочтению обязательна. А результат оцените самостоятельно.

Щелчок на веб-странице

У объектов, которые возвращают обозначенные выше поисковые методы, имеются свои методы, например click(). Не сложно догадаться, что метод имитирует щелчок мыши по элементу, а использовать его можно, например, для перехода по ссылке и т.д. Для клика по уже обнаруженном ранее элементу просто добавьте в скрипт строку «content.click()«. И самостоятельно поэкспериментируйте с кликами по различным элементам. Конечный код, на всякий случай, выглядит так:

from selenium import webdriver
from selenium.webdriver.common.by import By

browser = webdriver.Chrome()
browser.get('https://bednyakov.ru')

try:
    content = browser.find_element(By.CLASS_NAME, 'entry-title')
    print(f'Контент класса {content.tag_name} найден.')
except:
    print('Искомый элемент не обнаружен.')

content.click()

Заполнение и отправка веб-форм

Для заполнения форм на различных ресурсах, например для авторизации (заполнения полей с логином и паролем) можно использовать поисковый метод по CSS селектору или XPath. Найти их весьма просто: находим нужный элемент с помощью инструментов разработчика, щелкаем правой кнопкой мыши на нем -> copy -> выбираем «Copy selector» или «Copy XPath».

Для заполнения полей к объектам нужно применить метод ‘send_keys(‘нужное значение’)’. Пример кода:

from selenium import webdriver
from selenium.webdriver.common.by import By

browser = webdriver.Chrome()
browser.get('https://bednyakov.ru/contacts/')

try:
    user_name = browser.find_element(By.CSS_SELECTOR, '#wpcf7-f134-p9-o1 > form > p:nth-child(2) > label > span > input')
    password = browser.find_element(By.CSS_SELECTOR, '#wpcf7-f134-p9-o1 > form > p:nth-child(4) > label > span > input')
    user_name.send_keys('Тёма')
    password.send_keys('12345')
    print('Поля заполнены')
except:
    print('Искомые элементы не обнаружены.')

Нажатия на кнопки

Интересно, что в озвученный выше метод ‘send_keys()’ можно передавать и объекты, например класса Keys. В таком случае будут имитироваться нажатия заданных кнопок клавиатуры. К примеру, если курсор не будет находиться в поле ввода, с помощью клавиш Home и End можно прокрутить страницу от начала до конца. Именно это мы и сделаем, просто следуйте примеру и обратите внимание на импорт.

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys

browser = webdriver.Chrome()
browser.get('https://bednyakov.ru')

content = browser.find_element(By.NAME, 'html')
content.send_keys(Keys.END)
content.send_keys(Keys.HOME)

Кнопки браузера

Последнее, что стоит отметить, это управление кнопками самого браузера. Для перехода по кнопкам «назад», «вперед», «обновить» или «закрыть» нужно использовать методы объекта браузера: browser.back(), browser.forward(), browser.refresh(), browser.quit().

Эта небольшая статья является лишь каплей в море информации о возможностях модуля Selenium, которая описана в документации. Поэтому, чтобы сделать приличный проект, читать нужно именно её. Успехов!