перейти к содержанию

Полное руководство по парсингу веб-страниц с помощью Selenium в Python

Selenium — один из самых мощных инструментов, доступных для парсинга сайтов с большим количеством JavaScript. При использовании правильных методов он может имитировать взаимодействие людей для успешного парсинга динамических веб-страниц.

В этом подробном руководстве мы поделимся секретами и советами по эффективному парсингу веб-страниц с использованием Python Selenium.

Что Селен?

Selenium — это набор инструментов с открытым исходным кодом, используемый для автоматизации браузера и тестирования веб-приложений. Он состоит из трех основных компонентов:

Селен IDE – Плагин Firefox для записи и воспроизведения взаимодействий в браузере. Удобен для создания быстрых сценариев.

Селен веб-драйвер – Предоставляет API для управления поведением браузера на различных языках и платформах, таких как Python, Java, C# и Ruby.

Селеновая сетка – Обеспечивает распределенное тестирование путем параллельного запуска тестов на нескольких компьютерах и в браузерах.

Selenium WebDriver — наиболее широко распространенный инструмент для парсинга веб-страниц благодаря его кросс-браузерной совместимости, активной поддержке сообщества и способности обходить такие препятствия, как рендеринг JavaScript и reCAPTCHA.

Согласно опросу разработчиков Stack Overflow в 2024 году, Selenium оставался наиболее используемой веб-платформой: 55.1% респондентов сообщили, что используют ее.

[Вставьте диаграмму использования Selenium с течением времени из опросов Stack Overflow]

Благодаря привязкам Python и некоторой изобретательности Selenium предоставляет надежный набор инструментов для парсинга веб-страниц.

Настройка Selenium с помощью Python

Давайте посмотрим, как запустить Selenium для очистки веб-страниц Python.

Сначала установите selenium пакет:

pip install selenium

Вам также потребуется установить исполняемый файл драйвера браузера, например chromedriver для Chrome:

wget https://chromedriver.storage.googleapis.com/97.0.4692.71/chromedriver_linux64.zip
unzip chromedriver_linux64.zip
chmod +x chromedriver
sudo mv chromedriver /usr/local/bin/

Теперь импортируйте Selenium и запустите экземпляр браузера:

from selenium import webdriver

driver = webdriver.Chrome()

Откроется видимое окно браузера Chrome. Для безголового парсинга добавьте несколько опций:

from selenium.webdriver.chrome.options import Options

options = Options()
options.headless = True
options.add_argument("--window-size=1920,1200")

driver = webdriver.Chrome(options=options)

Безголовый режим и измененный размер окна предотвращают обнаружение.

Расположение элементов страницы

Чтобы извлечь данные со страницы, сначала необходимо найти соответствующие элементы, используя методы выбора Selenium:

find_element_by_id – Выберите элемент по его уникальному атрибуту ID.

find_element_by_name – Найти поле формы по его name параметр

find_element_by_xpath – Используйте выражение XPath для точного определения элементов.

find_element_by_link_text – Определите ссылки по их якорному тексту.

find_element_by_css_selector – Элементы запроса с использованием селекторов CSS.

find_element_by_class_name – Выбирайте элементы по именам классов.

Например, для поиска в Google:

search_bar = driver.find_element_by_name(‘q‘)
search_bar.send_keys(‘selenium python‘) 
search_bar.submit()

При этом будет найден ввод для поиска, введена поисковая фраза и отправлена ​​форма.

Несколько советов по эффективному выбору:

  • Для надежности отдавайте предпочтение селекторам CSS или XPath вместо имен/классов.
  • Используйте относительные или индексированные пути, а не абсолютные, чтобы избежать хрупкости.
  • Проверьте элементы в инструментах разработки вашего браузера, чтобы найти оптимальные селекторы.
  • Комбинируйте такие методы, как find_element(By.ID, ‘main‘).find_element_by_tag(‘p‘) для вложенного выбора

Давайте рассмотрим еще несколько примеров расположения элементов на странице:

driver.find_element_by_css_selector(‘#login-form‘) # By ID
driver.find_element_by_xpath(‘//button[text()="Submit"]‘) # By text
driver.find_element_by_name(‘email‘) # By name

results = driver.find_elements_by_class_name(‘result‘) # All result elements

Теперь, когда вы можете определять элементы, давайте посмотрим, как извлекать данные и взаимодействовать с ними.

Получение данных и взаимодействие с элементами

Селен обеспечивает веб-элемент объект с полезными методами для очистки содержимого или запуска действий на странице.

Вот некоторые распространенные методы:

  • element.text – Возвращает внутренний HTML или текст
  • element.get_attribute(‘href‘) – Получает определенный атрибут, например href
  • element.value – Получает значение полей ввода формы
  • element.send_keys() - Имитирует ввод текста в поле ввода
  • element.click() – Щелкает по элементу
  • element.submit() -Отправляет форму

Например:

search_input = driver.find_element_by_name(‘q‘)
search_input.send_keys(‘web scraping with python‘)
search_input.submit()

results = driver.find_elements_by_class_name(‘result‘)

for result in results:
   title = result.find_element_by_tag_name(‘h3‘).text
   link = result.find_element_by_tag_name(‘a‘).get_attribute(‘href‘)
   print(title, link)

При этом выполняется поиск, извлекаются результаты, а затем печатается заголовок и URL-адрес каждого из них.

Комбинируя выбор элементов и взаимодействие, вы можете автоматизировать сложные рабочие процессы очистки.

Работа с динамическим контентом

Современные сайты в значительной степени полагаются на JavaScript для динамического отображения контента.

Selenium действительно превосходно справляется с парсингом этих интерактивных страниц по сравнению с простым парсером на основе запросов.

Вот несколько советов по обработке динамического контента, отображаемого на JS, с помощью Selenium:

Используйте явные ожидания – Selenium ожидает, что условие ожидает паузы, пока не появится элемент.

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.webdriver.support import expected_conditions as EC

try:
  element = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.ID, "myDynamicElement"))
  )
finally:
  driver.quit()

Прежде чем продолжить, ожидается появление элемента в течение 10 секунд.

Прокручивать постепенно – Прокручивайте постепенно вниз, чтобы активировать отложенную загрузку контента.

Разрешить время после кликов – Используйте time.sleep(), чтобы разрешить выполнение действий перед очисткой.

Запустить JavaScript – Непосредственно запускайте JS, например window.scrollTo() с помощью driver.execute_script() прокручивать.

Гибкость Selenium помогает справиться даже с самыми сложными динамическими сайтами.

Удаление данных из форм

Еще одно преимущество Selenium — это очистка данных, заблокированных за формами и логинами.

Чтобы автоматизировать отправку формы, найдите элементы ввода, заполните значения и отправьте:

username = driver.find_element_by_id(‘username‘)
username.send_keys(‘myuser‘)

password = driver.find_element_by_id(‘password‘) 
password.send_keys(‘mypass‘)

login_form = driver.find_element_by_id(‘loginForm‘)
login_form.submit()

Это позволяет войти на сайт, введя учетные данные и отправив форму.

Несколько советов по эффективному очистке форм:

  • Проверьте поля формы в инструментах разработки, чтобы найти оптимальные селекторы.
  • Сначала очистите предварительно заполненные значения с помощью element.clear() перед заполнением
  • Используйте встроенные функции ожидания Selenium, чтобы предотвратить такие ошибки, как слишком быстрая отправка.
  • Очистите или проанализируйте полученную страницу, чтобы подтвердить успешный вход в систему.

При некоторой осторожности Selenium может автоматизировать сложные рабочие процессы, требующие отправки форм, наведения, щелчков мышью и многого другого.

Парсинг сайтов, созданных с помощью JavaScript

Одним из основных преимуществ Selenium является выполнение JavaScript для рендеринга сайтов.

Чтобы напрямую запустить JS, используйте driver.execute_script():

driver.get(‘https://example.com‘)

driver.execute_script(‘return document.title‘) # Get document title from JS

driver.execute_script(‘window.scrollTo(0, 500)‘) # Scroll down 500px

Для действительно упорных страниц вам может даже потребоваться вручную оценить отображаемый JavaScript:

const pageData = driver.execute_script(function() {

  return {
    title: document.querySelector(‘title‘).innerText,
    content: document.querySelector(‘.content‘).innerText
  }

});

print(pageData[‘title‘]) // Print title scraped from JS

Здесь мы возвращаем очищенные данные непосредственно из исполняемой функции.

Доступно execute_script(), вы можете парсить даже самые упрямые JS-сайты.

Очистка данных с нескольких URL-адресов

Чтобы парсить несколько страниц, просто передайте список URL-адресов:

urls = [‘page1.html‘, ‘page2.html‘,...]

for url in urls:
  driver.get(url)

  # Insert scraping logic

driver.quit()

Один и тот же экземпляр браузера будет повторно использоваться для навигации и очистки каждой страницы по очереди.

Вы также можете очистить нумерацию страниц, задав параметр URL-адреса:

for page in range(1, 11):
  url = f‘https://example.com/results?page={page}‘
  driver.get(url)

  # Scrape each page

Это позволяет очищать произвольное количество результатов с разбивкой на страницы.

Лучшие практики парсинга селена

Вот несколько советов, как избежать обнаружения и повысить надежность при парсинге с помощью Selenium:

  • Используйте рандомизированные задержки, чтобы имитировать человеческую дисперсию
  • Реалистично прокручивайте и щелкайте элементы
  • Отключите изображения и CSS для повышения производительности.
  • Ограничьте одновременные потоки, чтобы избежать перегрузки серверов.
  • Обрабатывайте ошибки HTTP и корректно повторяйте попытки.
  • Меняйте IP-адреса и прокси-серверы, чтобы предотвратить блокировку.
  • Используйте режим безголового браузера, чтобы скрыть отпечатки пальцев Selenium

При осторожности и терпении Selenium может надежно извлекать данные в любом масштабе.

Альтернативные инструменты

Несмотря на свою мощь, Selenium имеет и недостатки: он медленнее и сложнее, чем другие варианты.

кукольник – Обеспечивает более компактное решение для парсинга Chromium без управления, но поддерживает только Chrome.

Драматург – Создано Microsoft для улучшения кросс-браузерной поддержки безголового парсинга.

Скребок API – Размещенные API, такие как Apify или Oxylabs, для аутсорсинга операций очистки.

Запросы/КрасивыйСуп – Легкое парсинг простых сайтов без JavaScript. Избегайте головной боли, поддерживая накладные расходы Selenium.

Оцените свой вариант использования, чтобы определить, подходит ли Selenium или лучше подойдет альтернативный инструмент.

Заключение

Selenium предоставляет универсальный набор инструментов для парсинга даже самых современных сайтов с большим количеством JavaScript. С помощью Python он может автоматизировать сложные рабочие процессы, такие как вход в форму и нумерация страниц.

Ответственный парсинг требует некоторой осторожности и изящества, но Selenium предоставляет решение для парсинга на основе браузера. Чтобы глубже изучить возможности Selenium, ознакомьтесь с официальная документация.

Дайте мне знать, если у вас есть еще вопросы по умным методам парсинга Selenium! Я всегда рад помочь коллегам-разработчикам овладеть искусством парсинга веб-страниц.

Присоединяйтесь к беседе

Ваш электронный адрес не будет опубликован. Обязательные поля помечены * *