Список методов для поиска элементов на странице

Перечисляем все методы применяемые в Selenium для поиска элементов на странице, для их работоспособности сперва импортируем их:

from selenium.webdriver.common.by import By

Список возможных локаторов:

  1. By.CLASS_NAME — поиск по атрибуту class элемента
  2. By.TAG_NAME — поиск по названию тега
  3. By.ID — поиск по уникальному атрибуту id элемента
  4. By.XPATH — поиск по xpath элемента
  5. By.NAME — поиск по атрибуту name элемента
  6. By.CSS_SELECTOR — поиск элементов на основе CSS
  7. By.LINK_TEXT — поиск тега с указанным текстом
  8. By.PARTIAL_LINK_TEXT — поиск тега по частичному совпадению текста

Методы работы с локаторами:

  1. find_element — поиск первого найденного элемента по заданным критериям, возвращает элемент
  2. find_elements- поиск всех элементов на странице по заданным критериям, возвращает список

План выполнения дальнейших действий

Пройдемся по локаторам описанным выше, а так же применим методы send_keys, click, execute_script, element_to_be_clickable. А так же конструкцию try/except для непредвиденной ошибки работы с драйвером и его последующим закрытием quit()

Составим план, что мы хотим сделать:

  1. выбираем поле ввода поиска товара «Я ищу…», подготавливаем;
  2. отправляем название интересующего товара;
  3. из выдачи поиска выбираем первый товар и заходим на его страницу;
  4. вытаскиваем с карточки товара пару элементов;
  5. открываем список всех отзывов
  6. собираем последние 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). По этому принципу будут найдены все остальные элементы, рассмотренные в статье.

Рисунок 1. Ищем ID поиска на Wildberries через консоль разработчика

После того, как мы нашли 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.

Рисунок 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')
Рисунок 3. Пример вывода в терминал отзывов о товаре

Код целиком

Последним штрихом будет оборачивание нашего кода в конструкцию 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, проводят занятия)

Подпишитесь на рассылку

Если это было вам полезно — вы можете сказать нам спасибо!