CoderCastrov logo
CoderCastrov
Selenium

Автоматизация веб-задач и парсинг с помощью Selenium

Автоматизация веб-задач и парсинг с помощью Selenium
просмотров
3 мин чтение
#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()

после нажатия кнопки поиска мы будем перенаправлены на новую страницу, и мы можем парсить данные отелей там

код:

результат:

полный код:

для видео выполнения: