Список методов для поиска элементов на странице
Перечисляем все методы применяемые в Selenium для поиска элементов на странице, для их работоспособности сперва импортируем их:
from selenium.webdriver.common.by import By
Список возможных локаторов:
- By.CLASS_NAME — поиск по атрибуту class элемента
- By.TAG_NAME — поиск по названию тега
- By.ID — поиск по уникальному атрибуту id элемента
- By.XPATH — поиск по xpath элемента
- By.NAME — поиск по атрибуту name элемента
- By.CSS_SELECTOR — поиск элементов на основе CSS
- By.LINK_TEXT — поиск тега с указанным текстом
- By.PARTIAL_LINK_TEXT — поиск тега по частичному совпадению текста
Методы работы с локаторами:
- find_element — поиск первого найденного элемента по заданным критериям, возвращает элемент
- find_elements- поиск всех элементов на странице по заданным критериям, возвращает список
План выполнения дальнейших действий
Пройдемся по локаторам описанным выше, а так же применим методы send_keys, click, execute_script, element_to_be_clickable. А так же конструкцию try/except для непредвиденной ошибки работы с драйвером и его последующим закрытием quit()
Составим план, что мы хотим сделать:
- выбираем поле ввода поиска товара «Я ищу…», подготавливаем;
- отправляем название интересующего товара;
- из выдачи поиска выбираем первый товар и заходим на его страницу;
- вытаскиваем с карточки товара пару элементов;
- открываем список всех отзывов
- собираем последние 30 отзывов на товар и выводим на печать
Дополнительно использовали:
- отправка текста send_keys(‘text’)
- имитация нажатия клавиши ENTER (send_keys(Keys.ENTER))
- неявные ожидания WebDriverWait
- проверка на кликабельность элемента — element_to_be_clickable
Имитация работы пользователя через Selenium. На примере сайта торговой площадки Wildberries
И так, приступим к практике, импортируем нужные библиотеки, пропишем url сайта wildberries, укажем путь к нашему драйверу, который мы установили и запустили в прошлой статье «Selenium webdriver в python. Установка и начало работы«
from selenium import webdriver
from selenium.webdriver import Keys
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
import time
url = 'https://www.wildberries.ru/'
service = Service(executable_path='C:/chromedriver/chromedriver') # указываем путь до драйвера
browser = webdriver.Chrome(service=service)
browser.get(url)
time.sleep(2)
# наш код
time.sleep(10)
browser.quit()
При запуске кода выше, просто откроется главная страница Вайлдберриз и через 10 секунд выполнение скрипта завершится.
Приступаем к выполнению нашего плана. Ищем элемент поиска. Для этого перейдем в браузер на главную страницу wildberries. Для этого откроем консоль разработчика, нажмем «Выбрать элемент…» (пункт 1 Рис. 1), далее выберем сам поиск Вайлдберриса (пункт 2 Рис. 1), найдется html код этого элемента (пункт 3 Рис. 1), найдем атрибут, к которому можно зацепиться, в данном случае это ID id=»searchInput» (Пункт 4, Рис. 1). По этому принципу будут найдены все остальные элементы, рассмотренные в статье.

После того, как мы нашли ID на странице Wb, напишем код поиска этого элемента, через локатор By.ID
wb_search = browser.find_element(By.ID, 'searchInput')
Далее, чтобы отправить в поисковую строку Вайлдберриса воспользуемся методом send_keys, введем в поисковик «iphone»
wb_search.send_keys('iphone')
Теперь имитируем нажатие клавиши Enter, что бы запустить процесс поиска, для этого предварительно импортируем from selenium.webdriver import Keys
wb_search.send_keys(Keys.ENTER)
Код на данный момент:
finder = browser.find_element(By.ID, 'searchInput')
finder.send_keys('iphone')
finder.send_keys(Keys.ENTER)
После этого откроется страница с айфонами, найдем все айфоны на странице. Для примера возьмем только 1 товар из всех найденных. Кликнем на первый из списка goods, выждем 5 секунд для загрузки страницы
goods = browser.find_elements(By.CLASS_NAME, 'product-card')
goods[0].click()
time.sleep(5)
Сбор данных со страницы товара Wildberries
После открытия карточки с товаром, будем извлекать данные о нем. Со страницы соберем название, артикул товара, количество продаж и отзывов, для наглядности выводим все в терминал
good_name = browser.find_element(By.CLASS_NAME, 'product-page__header')
good_id = browser.find_element(By.ID, 'productNmId')
good_sells = browser.find_element(By.CLASS_NAME, 'product-order-quantity')
review = browser.find_element(By.CLASS_NAME, 'product-review__count-review')
print(f'Название: {good_name.text}\nАртикул: {good_id.text}\n{good_sells.text} {review.text}')
Пример вывода информации в терминале на Рисунке 2.

Парсим отзывы на товар с Wildberries
После того, как извлекли нужную информацию, и если есть на данный товар отзывы, то пролистаем страницу до появления на ней кнопки «Смотреть все отзывы» и нажмем на нее. Пролистывание происходит благодаря выполнению метода execute_script(«window.scrollBy(0,575)») где 0 пикселей — это пролистывание по горизонтали, 575 пикселей по вертикали, пролистываем до тех пор пока элемент на странице «Смотреть все отзывы» не будет нажат, достигается это благодаря методу element_to_be_clickable. Для работоспособности их нужно сперва импортировать:
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
После импорта применим их:
if int(review.text.split(' ')[0]) > 0: # если отзывов более 0, то пролистываем страницу
while True:
browser.execute_script("window.scrollBy(0,575)")
try:
"""применим неявные ожидания, будем пролистывать, пока элемент не станет кликабельным"""
WebDriverWait(browser, 1).until(EC.element_to_be_clickable((By.LINK_TEXT, 'Смотреть все отзывы'))).click()
break # как нажали элемент выходим с цикла
except:
continue
else:
print('У данного товара нет отзывов')
Сами не явные ожидания, будут подробно рассмотрены в будущей статье. Что бы не упустить новую статью, подпишитесь на наш паблик ВКонтакте: Happy Python
После перехода на страницу с отзывами, найдем все элементы загруженных комментариев, методом find_elements, который нам вернет список. Проходя по этому списку вытащим autor (имя автора, дата публикации), text_review (текст отзыва) и vote (рейтинг лайков и дизлайков отзыва) и выведем в терминал для наглядности. Рисунок 3
feedbacks_list = browser.find_elements(By.CLASS_NAME, 'comments__item')
for feedback in feedbacks_list:
autor = feedback.find_element(By.CLASS_NAME, 'feedback__info').text.replace('\n', ' ')
text_review = feedback.find_element(By.CSS_SELECTOR, 'p[itemprop="reviewBody"]').text
vote = feedback.find_element(By.CLASS_NAME, 'vote__wrap').text.split('\n')
print(f'{autor}\nОтзыв:\n{text_review}\nОценка отзыва:\nположительно: {vote[0]}\nотрицательно: {vote[-1]}\n')

Код целиком
Последним штрихом будет оборачивание нашего кода в конструкцию try/except
from selenium import webdriver
from selenium.webdriver import Keys
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
import time
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
url = 'https://www.wildberries.ru/'
service = Service(executable_path='C:/chromedriver/chromedriver') # указываем путь до драйвера
browser = webdriver.Chrome(service=service)
try:
browser.get(url)
time.sleep(2)
wb_search = browser.find_element(By.ID, 'searchInput')
wb_search .send_keys('iphone')
wb_search .send_keys(Keys.ENTER)
time.sleep(5)
goods = browser.find_elements(By.CLASS_NAME, 'product-card') # находим все товары на странице
goods[0].click() # выбор 1 элемента из списка товаров на странице
time.sleep(5)
"""Вытаскиваем название, артикул, количество продаж и отзывов"""
good_name = browser.find_element(By.CLASS_NAME, 'product-page__header')
good_id = browser.find_element(By.ID, 'productNmId')
good_sells = browser.find_element(By.CLASS_NAME, 'product-order-quantity')
review = browser.find_element(By.CLASS_NAME, 'product-review__count-review')
print(f'Название: {good_name.text}\nАртикул: {good_id.text}\n{good_sells.text} {review.text}')
time.sleep(1)
if int(review.text.split(' ')[0]) > 0: # если отзывов более 0, то пролистываем страницу
while True:
browser.execute_script("window.scrollBy(0,575)")
try:
"""применим неявные ожидания, будем пролистывать, пока элемент не станет кликабельным"""
WebDriverWait(browser, 1).until(EC.element_to_be_clickable((By.LINK_TEXT, 'Смотреть все отзывы'))).click()
break # как нажали элемент выходим с цикла
except:
continue
else:
print('У данного товара нет отзывов')
time.sleep(3)
feedbacks_list = browser.find_elements(By.CLASS_NAME, 'comments__item')
for feedback in feedbacks_list:
autor = feedback.find_element(By.CLASS_NAME, 'feedback__info').text.replace('\n', ' ')
text_review = feedback.find_element(By.CSS_SELECTOR, 'p[itemprop="reviewBody"]').text
vote = feedback.find_element(By.CLASS_NAME, 'vote__wrap').text.split('\n')
print(f'{autor}\nОтзыв:\n{text_review}\nОценка отзыва:\nположительно: {vote[0]}\nотрицательно: {vote[-1]}\n')
browser.quit()
except Exception as ex:
print(ex)
browser.quit()
browser.quit()
От автора
В данной статье рассмотрели поиск и взаимодействие с элементами на странице, через Chromewebdriver Selenium на примере сайта Wildberries, откуда мы собрали отзывы на товары.
Кстати если вас интересует парсер Wildberries, то мы его писали ранее, можете ознакомится в статье: Парсер Wildberries на python 2022 год, он основан на взаимодействии с API сайта
Подписывайтесь на нас Telegram канале.
Пишите предложения в группе ВКонтакте Happy Python или Ваши отзывы и предложения мне в ВКонтакте.
Telegram каналы наших партнеров:
Backend development — все о бэкенде на python и не только (полезные статьи, гайды, шпаргалки , переводы книг)
EasyPy — о языке программирования python простым языком (интересные статьи, тесты для языка Python, проводят занятия)
Подпишитесь на рассылку
Хороший урок, спасибо.
Не могли бы Вы продолжить его и описать, каким образом нужно открывать вкладки с описанием остальных товаров на страничке.
Заранее, благодарен.