//
Веб-скрапинг с помощью Python и Selenium: пошаговое руководство
Веб-скрапинг

Веб-скрапинг с помощью Python и Selenium: пошаговое руководство

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

Что такое веб-скрапинг? Этапы работы

Веб-скрапинг (web scraping) – это процесс извлечения данных с веб-страниц. Этот процесс обычно включает использование программы или скриптов, получающих представленную на веб-сайтах информацию, которая может быть использована в различных областях и для различных целей. Например, для сравнения цен и услуг конкурентов, анализа потребительских предпочтений, мониторинга разных новостей и  событий и многого другого. 

 

Этапы работы веб-скрапинга включают:

  • Определение целей: на первом этапе необходимо понять, какую информацию нужно извлечь и на каких на веб-ресурсах.
  • Анализ структуры целевой веб-страницы: изучение HTML-кода страниц, чтобы понять, где и как хранится нужная информация. Поиск и определение элементов, таких, как теги, ID, классы и др. 
  • Разработка скрипта для получения данных: написание кода (например, на языке Python с использованием библиотеки для автоматизации действий в браузере Selenium), который будет посещать веб-страницы, извлекать нужные данные и сохранять их в структурированном виде.
  • Обработка данных: извлечённые данные часто требуют преобразования для дальнейшего использования. Это может включать удаление дубликатов, исправление форматов, фильтрацию ненужных данных и т.д.
  • Сохранение данных: сохранение извлечённых и обработанных данных в удобном формате, например, в виде CSV, JSON, базы данных и т.д.

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

Начните сейчас и автоматизируйте решение hCaptcha

Работа с Python и Selenium

Почему Python и Selenium удобны для веб-скрапинга?

Язык программирования Python и библиотеку Selenium часто используют для веб-скрапинга по следующим причинам:

  • Лёгкость использования: Python прост в использовании и имеет множество библиотек для веб-скрапинга.
  • Эмуляция действий, доступ к динамическому контенту: с помощью Selenium можно автоматизировать действия пользователя в веб-браузере, включая эмуляцию прокрутки страницы и нажатия кнопок, необходимых для загрузки данных.
  • Антикраулеры: на некоторых сайтах применяются специальные защитные механизмы, и использование эмуляции действий реального пользователя помогает справиться с этими механизмами.
  • Широкая поддержка: большое сообщество и множество ресурсов облегчают работу с этими инструментами.

Установка и импорт инструментов

Давайте рассмотрим пример простого скрипта для веб-скрапинга.  Для примера возьмём страницу https://webscraper.io/test-sites/e-commerce/allinone/product/123, на которой будем искать в карточке товара цену на 128 GB объёма HDD.  

  • Если на Вашем компьютере ещё не установлен Python, перейдите на официальный сайт Python и скачайте подходящую версию для Вашей операционной системы (Windows, macOS, Linux). В терминале удобной для вас среды разработки можете проверить версию Python следующей командой: 

python --version

  • Далее необходимо установить Selenium, выполнив команду: 

pip install selenium

  • Создайте новый файл и импортируйте необходимые библиотеки:

import time

from selenium import webdriver

  • Также необходимо добавить в проект класс ‘By’, он понадобится нам для определения стратегий поиска элементов на веб-странице в Selenium: 

from selenium.webdriver.common.by import By

Параметры драйвера Chrome

Опции ChromeDriver (ChromeOptions) нужны для настройки поведения и параметров запуска браузера Chrome при автоматизации с помощью Selenium. Вот некоторые из этих опций: 

--headless: запускает Chrome без графического интерфейса

--disable-gpu: отключает использование GPU. Часто используется с --headless для предотвращения ошибок, связанных с рендерингом графики

--disable-popup-blocking: отключает блокировку всплывающих окон

--disable-extensions: отключает все расширения браузера

--incognito: запускает браузер в режиме инкогнито, который не сохраняет историю, куки и другие данные сессии

--window-size=width,height: устанавливает размер окна браузера

--user-agent=<user-agent>: устанавливает пользовательский агент браузера для эмуляции различных устройств или браузеров

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

  • В нашем примере установлен режим инкогнито. Инициализируйте драйвер Chrome и перейдите на нужную страницу с карточкой товара:  

chrome_options = webdriver.ChromeOptions()

chrome_options.add_argument('--incognito')

driver = webdriver.Chrome(options=chrome_options)

 

driver.get('https://webscraper.io/test-sites/e-commerce/allinone/product/123')

Поиск HTML-элементов страницы

В Selenium поиск элементов на веб-странице осуществляется с помощью различных методов, предоставляемых классом By. Эти методы позволяют находить элементы по различным критериям, например, идентификатор элемента (ID), имя класса (class name), имя тега (tag name), имя атрибута (name), текст ссылки (link text)), XPath или CSS-селектор. 

Пример поиска по ID:

element = driver.find_element(By.ID, 'element_id')

По имени класса: 

element = driver.find_element(By.CLASS_NAME, 'class_name')

По имени тега:

element = driver.find_element(By.TAG_NAME, 'tag_name')

По имени атрибута: 

element = driver.find_element(By.NAME, 'element_name')

По тексту ссылки:

element = driver.find_element(By.LINK_TEXT, 'link_text')

По CSS-селектору:

element = driver.find_element(By.CSS_SELECTOR, 'css_selector')

По XPath: 

element = driver.find_element(By.XPATH, '//tag[@attribute="value"]')

Если необходимо найти несколько элементов, вместо find_element используется метод find_elements

  • В нашем примере необходимо найти расположение элемента кнопки “128” и информации о цене: 
none provided

Имитация действий пользователя

В Selenium имитация действий на веб-странице осуществляется с помощью методов, предоставляемых объектом WebElement. Эти методы позволяют взаимодействовать с элементами на странице так, как это делает пользователь: кликать, вводить текст и т.д. 

Вот несколько таких методов:  

element.click() - клик на элемент

 

element.send_keys('текст для ввода') - ввод текста в элемент (поле ввода)

 

element.location_once_scrolled_into_view - прокрутка к элементу

 

submit() - отправка формы

  • Вернёмся к нашему примеру. С помощью XPath осуществляется поиск нужной кнопки, после чего нужно сделать клик по ней и найти  элемент с ценой: 

button_128 = driver.find_element(By.XPATH, "//button[@value='128']")

button 128.click()

 

# Ждём некоторое время для загрузки цены

time.sleep(3)

 

price_element = driver.find_element(By.XPATH, "//h4[@class='price float-end pull-right']")

  • Теперь остаётся вывести цену товара с нужным объёмом HDD в консоль: 

price_text = price_element.text

print("Цена товара:", price_text)

 

driver.quit()

Итак, вот как выглядит полный код:

import time

from selenium import webdriver

from selenium.webdriver.common.by import By

 

chrome_options = webdriver.ChromeOptions()

chrome_options.add_argument('--incognito')

driver = webdriver.Chrome(options=chrome_options)

 

driver.get('https://webscraper.io/test-sites/e-commerce/allinone/product/123')

 

button_128 = driver.find_element(By.XPATH, "//button[@value='128']")

button_128.click()

 

time.sleep(3)

 

price_element = driver.find_element(By.XPATH, "//h4[@class='price float-end pull-right']")

 

price_text = price_element.text

print("Цена товара:", price_text)

 

driver.quit()

Всплывающие баннеры и окна

Очень часто на сайтах появляются различные баннеры и всплывающие окна,  которые могут помешать выполнению скрипта. В таких случаях можно настроить параметры ChromeDriver таким образом, чтобы отключить эти элементы. Вот некоторые из таких параметров: 

--disable-popup-blocking: отключает блокировку всплывающих окон

 

--disable-infobars: отключает информационные панели

 

--disable-notifications: отключает все уведомления

На сайте, который мы используем в нашем примере, при загрузке страницы появляется  куки-баннер. Можно также попробовать убрать его другими способами, один из которых – использование отдельного скрипта, который блокирует такие уведомления. Для начала изучим этот элемент: 

none provided

Теперь можем скрыть этот баннер, добавив его в наш скрипт: 

import time

from selenium import webdriver

from selenium.webdriver.common.by import By

 

chrome_options = webdriver.ChromeOptions()

chrome_options.add_argument('--incognito')

driver = webdriver.Chrome(options=chrome_options)

 

driver.get('https://webscraper.io/test-sites/e-commerce/allinone/product/123')

 

# Скрипт для скрытия элемента с куки баннером

script = """

var banner = document.getElementById('cookieBanner');

if (banner) {

    banner.style.display = 'none';

}

"""

 

# Выполнение скрипта для скрытия баннера

driver.execute_script(script)

 

button_128 = driver.find_element(By.XPATH, "//button[@value='128']")

button_128.click()

 

time.sleep(3)

 

price_element = driver.find_element(By.XPATH, "//h4[@class='price float-end pull-right']")

 

price_text = price_element.text

print("Цена товара:", price_text)

 

driver.quit()

 

Ещё одним из эффективных способов является использование Chrome расширений, которые автоматически принимают или блокируют все баннеры с куки. Эти расширения можно установить в браузере, а затем подключить их в ChromeOptions. Скачайте подходящее расширение в формате .crx. Используйте его в Вашем скрипте: 

import time

from selenium import webdriver

from selenium.webdriver.common.by import By

 

# Путь к расширению .crx

extension_path = '/path/to/extension.crx'

 

chrome_options = webdriver.ChromeOptions()

chrome_options.add_argument('--incognito')

 

# Добавляем расширение

chrome_options.add_extension(extension_path)  

 

driver = webdriver.Chrome(options=chrome_options)

 

driver.get('https://webscraper.io/test-sites/e-commerce/allinone/product/123')

 

button_128 = driver.find_element(By.XPATH, "//button[@value='128']")

button_128.click()

 

time.sleep(3)

 

price_element = driver.find_element(By.XPATH, "//h4[@class='price float-end pull-right']")

 

price_text = price_element.text

print("Цена товара:", price_text)

 

driver.quit()

 

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

Решение капчи при веб-скрапинге

Часто при извлечении данных возникают препятствия в виде капчи, предназначенной для защиты от ботов. Для преодоления таких ограничений наиболее эффективны специализированные сервисы, распознающие различные виды капч. Одним из таких инструментов является CapMonster Cloud, который в кратчайшие сроки способен автоматически решать даже самые сложные капчи. Этот сервис предлагает как браузерные расширения (для Chrome, для Firefox), так и API-методы (с ними можете ознакомиться в документации), которые вы можете интегрировать в свой код для получения токенов и продолжения работы вашего скрипта. 

Пример кода для автоматического решения капчи и веб-скрапинга

 

Этот скрипт решает капчу на странице, а затем извлекает заголовок этой же страницы и выводит в консоль: 

import asyncio

from selenium import webdriver

from selenium.webdriver.remote.webdriver import WebDriver

from selenium.webdriver.common.by import By

from selenium.webdriver.chrome.options import Options

from capmonstercloudclient import CapMonsterClient, ClientOptions

from capmonstercloudclient.requests import RecaptchaV2ProxylessRequest

 

async def solve_captcha(api_key, page_url, site_key):

    client_options = ClientOptions(api_key=api_key)

    cap_monster_client = CapMonsterClient(options=client_options)

 

    recaptcha2request = RecaptchaV2ProxylessRequest(websiteUrl=page_url, websiteKey=site_key)

    responses = await cap_monster_client.solve_captcha(recaptcha2request)

    return responses['gRecaptchaResponse']

 

async def parse_site_title(driver: WebDriver, url: str) -> str:

    driver.get(url)

    

    driver.implicitly_wait(10)

 

    title_element = driver.find_element(By.TAG_NAME, 'title')

    title = title_element.get_attribute('textContent')

    

    return title

 

async def main():

    api_key = 'YOUR_CAPMONSTER_API_KEY'

    page_url = 'https://lessons.zennolab.com/captchas/recaptcha/v2_simple.php?level=low'

    site_key = '6Lcf7CMUAAAAAKzapHq7Hu32FmtLHipEUWDFAQPY'

 

    options = Options()

    driver = webdriver.Chrome(options=options)

    

    captcha_response = await solve_captcha(api_key, page_url, site_key)

    print("Решение капчи:", captcha_response)

 

    site_title = await parse_site_title(driver, page_url)

    print("Заголовок страницы:", site_title)

 

    driver.quit()

 

if __name__ == "__main__":

    asyncio.run(main())

 

Заключение

Использование Python и Selenium для веб-скрапинга открывает множество возможностей для автоматизации сбора данных с веб-сайтов, а интеграция с Capmonster Cloud помогает легко решать капчи и значительно упрощает процесс сбора информации.  Эти инструменты позволяют не только ускорить работу, но и обеспечить точность и надёжность получаемых данных. С их помощью вы можете собирать данные из самых разных источников, от интернет-магазинов до новостных сайтов, и использовать их для анализа, исследований или создания собственных проектов. И при всём этом необязательно иметь углублённые знания программирования,  — современные технологии делают веб-скрапинг доступным даже для новичков. Так что, если для вас важны простота, максимальное удобство и экономия времени в работе с данными, Python, Selenium и Capmonster Cloud — отличное сочетание для достижения этой цели! 

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