Автоматизация веб-задач и парсинг с помощью Selenium
Что такое Selenium?
Selenium - это инструмент автоматизации, который чаще всего используется для тестирования веб-приложений, но не только для этого. Selenium позволяет открывать браузер и выполнять задачи, подобные действиям человека, такие как:
- Нажатие кнопки
- Ввод текста в форму
- Поиск определенной информации на веб-страницах
- Ожидание загрузки
Почему использовать Selenium?
Парсинг веб-страниц с использованием Python обычно выполняется с помощью BeautifulSoup или scrapy, которые позволяют обходить DOM (Document Object Model) для статического парсинга. Однако, если вам нужны данные, которые появляются после нажатия кнопки, ввода текста в форму или даже если вам нужны данные после ожидания загрузки, то Selenium - лучший способ получить эти данные.
Что мы будем создавать?
В этой статье мы создадим программу, которая будет парсить доступные отели с указанием количества гостей, даты заселения и продолжительности пребывания, и получать название, цену и местоположение с веб-сайта под названием traveloka.
Начало работы
Сначала нам нужно установить selenium с помощью команды:
pip install selenium
Затем импортируем все необходимые модули
import os
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
Нам нужно выбрать путь к драйверу и создать новый экземпляр
os.environ['PATH']+=os.pathsep+r"C:\Users\faisal\Documents\chromedriver_win32"
driver = webdriver.Chrome()
Затем получаем сайт в драйвере
driver.get("https://www.traveloka.com/")
И нам нужно получить поле ввода местоположения
Мы можем выбрать элемент по селектору CSS и сохранить его в переменную, а затем ввести текст в форму, например "Джакарта"
form = driver.find_element(By.CSS_SELECTOR, 'input[placeholder="Город, отель, место для поездки"]')
form.send_keys("Джакарта")
И Selenium откроет драйвер Chrome и перейдет на сайт, а затем введет "Джакарта" в форму
И нам нужно выбрать первый элемент после поиска, но поиск занимает время, и Selenium может ждать до выполнения ожидаемого условия, в данном случае ожидаемое условие - это видимость всех элементов
код:
WebDriverWait(driver, 30).until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, 'div[data-testid="dropdown-menu-item"]')))[0].click()
После получения местоположения нам нужно открыть календарь и выбрать дату
Для открытия календаря мы можем нажать на значок календаря
код
open_calendar = driver.find_element(By.CSS_SELECTOR, 'svg[data-id="IcSystemCalendar"]').click()
Для даты есть div, который всегда имеет атрибуты и значения в формате даты
поэтому мы просто можем нажать и выбрать элемент
например:
check_in = driver.find_element(By.CSS_SELECTOR, 'div[data-testid="date-cell-17-2-2022"]')
check_in.click()
и это выберет 17 февраля 2022 года
далее выбираем продолжительность пребывания
для продолжительности мы можем выбрать родительскую продолжительность и найти продолжительность с помощью nth child, например, если вы хотите 3 ночи, то выберите с помощью css селектора nth:child(3)
код:
duration = driver.find_element(By.CSS_SELECTOR, 'div.css-1dbjc4n[style="max-height: 325px;"]')
duration_value = duration.find_element(By.CSS_SELECTOR, f'div[data-testid="dropdown-menu-item"]:nth-child(3)').click()
далее добавляем гостей, нам нужно открыть поле гостей и добавить гостей, нажимая на значок плюса (+)
open_guest_field = driver.find_element(By.CSS_SELECTOR, 'input[data-testid="occupancy-field"]').click()
add_adult = driver.find_elements(By.CSS_SELECTOR, 'div[data-testid="stepper-plus"]')[0]
for i in range(1, 3):
add_adult.click()
и нажимаем кнопку поиска
click_search = driver.find_element(By.CSS_SELECTOR, 'div[data-testid="search-submit-button"]').click()
после нажатия кнопки поиска мы будем перенаправлены на новую страницу, и мы можем парсить данные отелей там
код:
результат:
полный код:
для видео выполнения: