Веб-скрапинг на Python в 2026: эффективная автоматизация сбора данных
Веб-скрапинг — это метод сбора данных с веб-сайтов. Он позволяет извлекать нужную информацию для анализа, мониторинга цен, отслеживания новостей и других различных целей. Веб-скраперы или парсеры – инструменты для осуществления веб-скрапинга. Наиболее удобным и популярным языком для написания веб-скраперов является Python, хотя для этой цели можно использовать практически любой язык. Пользователи выбирают Python по нескольким причинам: лёгкий синтаксис, множество удобных библиотек для парсинга, постоянная поддержка и обновления.
В этом руководстве мы рассмотрим основные инструменты для веб-скрапинга, предоставим пример реализации на Python. С помощью пошаговых инструкций вы сможете понять основы веб-скрапинга и парсинга, написать простой скрипт для сбора данных, а также узнаете о методах обхода различных препятствий в процессе работы.
Инструменты для работы, их характеристика
Выбор среды разработки
Для работы необходима среда разработки. Выбор подходящей среды для веб-скрапинга зависит от нескольких факторов, таких как удобство использования, поддержка нужных инструментов, личные предпочтения и требования проекта. Среди наиболее популярных инструментов для работы, которые хорошо подходят для веб-скрапинга на Python, можно отметить PyCharm и Visual Studio Code.
PyCharm
Плюсы:
Полноценная IDE с множеством функций.
Поддержка отладки, автодополнения кода и управления проектами.
Поддержка виртуальных окружений и интеграция с Git.
Минусы:
Может быть перегруженной для небольших проектов.
Требует больше ресурсов по сравнению с текстовыми редакторами.
Visual Studio Code (VS Code)
Плюсы:
Легковесная и настраиваемая среда.
Широкий выбор расширений для Python и веб-скрапинга.
Поддержка отладки, Git и терминала.
Минусы:
Может требовать настройки для полноценной работы с Python.
Возможны проблемы с производительностью при большом количестве расширений.
Установка Python
Также на вашем компьютере должен быть установлен Python. Инструкция по установке для вашей ОС:
macOS
Для установки свежей версии Python перейдите по ссылке , скачайте установщик и следуйте его указаниям:

Linux
В некоторых дистрибутивах Linux (например, в Ubuntu) Python уже предустановлен. Для проверки версии Python выполните в терминале следующую команду:
python --version Версия Python может быть устаревшей, тогда установить последнюю доступную версию поможет эта команда (пример для дистрибутива Debian):
sudo apt-get update && sudo apt-get install python3 Windows
Перейдите на страницу Python и загрузите подходящую версию. Отметьте галочку "Add python.exe to PATH". Это добавит Python в системный PATH, что облегчит его использование из командной строки.

Библиотеки и инструменты для веб-скрапинга на Python
Теперь можно обратить внимание на библиотеки и инструменты, которые сделают написание скриптов для вашего парсера более удобным. Давайте выделим лучшие из них и рассмотрим их характеристики, чтобы сделать правильный выбор для своих задач.
requests
Requests — простая библиотека для отправки HTTP-запросов и получения HTML-кода страниц. Подходит для базового веб-скрапинга и небольших проектов без высокой нагрузки.
aiohttp
Библиотека для асинхронных HTTP-запросов. Подходит для задач с большим количеством одновременных запросов и высокой скоростью обработки данных.
lxml
Быстрая библиотека для обработки XML и HTML. Поддерживает XPath и XSLT, используется для сложного парсинга структурированных данных.
BeautifulSoup
Библиотека для парсинга HTML и XML. Удобна для извлечения данных и работы с некорректной разметкой. Поддерживает разные парсеры: html.parser, lxml, html5lib.
Scrapy
Фреймворк для веб-скрапинга, позволяющий строить полноценные проекты сбора данных. Поддерживает асинхронные запросы и высокую производительность.
Selenium
Инструмент для автоматизации браузера. Позволяет имитировать действия пользователя и работать с динамическими сайтами.
Pyppeteer
Python-версия Puppeteer для управления Chromium. Подходит для автоматизации действий и работы с динамическими страницами.
Playwright
Современный инструмент автоматизации браузеров с поддержкой нескольких языков и движков (Chromium, Firefox, WebKit). Отличается стабильностью и высокой скоростью.
Примеры веб-скраперов для статических и динамических сайтов
Что такое HTML
Прежде чем приступить к написанию любого скрапера, нужно понимать основы HTML и уметь анализировать разметку сайтов и не теряться при поиске элементов. Итак, HTML (HyperText Markup Language) – это стандартный язык разметки, используемый для создания и структурирования веб-страниц. Он описывает структуру документа, включая текст, изображения, ссылки и другие элементы, которые отображаются в браузере.
Основные элементы HTML
Теги
HTML-документ состоит из различных тегов, которые определяют структуру и содержание. Например:
- <html>: корневой элемент HTML-документа.
- <head>: содержит метаданные, такие как заголовок страницы (<title>) и ссылки на стили.
- <body>: основная часть документа, содержащая видимое содержимое страницы.
Элементы
Внутри тегов могут находиться элементы:
- <h1>…<h6>: заголовки различных уровней.
- <p>: параграф текста.
- <a>: ссылка.
- <img>: изображение.
- <div>, <span>: контейнеры для группировки других элементов.
Атрибуты
Теги могут иметь атрибуты, которые предоставляют дополнительную информацию об элементе. Например:
- <a href="https://example.com">: атрибут href указывает URL для ссылки.
- <img src="image.jpg" alt="описание изображения">: атрибут src указывает путь к изображению, а alt — альтернативный текст.
Выбор сайта
Прежде чем выбрать подходящие инструменты для написания скрапера, нужно изучить целевой сайт и понять, содержит ли он динамический контент. Чтобы это понять, нужно загрузить страницу, открыть вкладку Сеть в Инструментах разработчика и посмотреть, выполняются ли Fetch/XHR-запросы (технологии, позволяющие веб-страницам динамически обновлять содержимое на основе данных, полученных с сервера):

Fetch/XHR-запросы не выполняются

Динамическая загрузка данных через JavaScript
Если сайт не содержит динамический контент, можно воспользоваться библиотеками BeautifulSoup и requests. В ином случае следует использовать загрузку веб-страниц с помощью Selenium или Playwright.
В качестве тестовой статической страницы для извлечения некоторых данных выберем https://quotes.toscrape.com/ . Давайте напишем простой скрапер для извлечения первых трёх фраз и их авторов.
Выбор инструментов для написания скрапера, установка
Для нашей цели вполне подойдут библиотеки BeautifulSoup и requests. Создадим новый файл в редакторе/среде разработки, добавим библиотеки в проект командой:
pip install beautifulsoup4 requests
BeautifulSoup осуществляет поиск и извлечение данных:
По тегам:
title_tag = soup.title
print(title_tag) # <title>Page Title</title>
По тексту. Чтобы извлечь текст из тега, используйте метод .get_text():
header_text = soup.h1.get_text()
print(header_text) # Header
По классам, идентификаторам и атрибутам:
elements = soup.find_all(class_='my-class')
element = soup.find(id='my-id')
links = soup.find_all('a', href=True)
Для более сложных запросов можно использовать CSS-селекторы с методом .select():
headers = soup.select('h1')
Поиск элементов на странице, написание скрапера
Вернёмся к целевой странице, найдём необходимые элементы и начнём писать код.
Откроем новый созданный файл, импортируем ранее установленные библиотеки:
import requests
from bs4 import BeautifulSoupПрописываем url нужной страницы, устанавливаем заголовок User-Agent для имитации работы браузера, отправляем get-запрос на страницу:
url = 'https://quotes.toscrape.com/'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36'
}
response = requests.get(url, headers=headers)
Проверяем, что запрос выполнен успешно:
if response.status_code == 200:
# Создаем объект BeautifulSoup для парсинга HTML
soup = BeautifulSoup(response.text, 'html.parser') В отдельном открытом с нужной страницей браузере ищем все блоки с цитатами, проходим по первым трём блокам цитат и извлекаем текст цитаты в нашем коде:
quotes = soup.select('.quote')
for quote in quotes[:3]:
text = quote.select_one('.text').get_text(strip=True)Извлекаем имя автора и прописываем его в консоль:
author = quote.select_one('.author').get_text(strip=True)
print(f'Цитата: {text}\nАвтор: {author}\n')
else:
print(f'Не удалось получить страницу. Статус код: {response.status_code}')
Готовый код с пояснениями:
import requests
from bs4 import BeautifulSoup
# URL страницы, которую нужно спарсить
url = 'https://quotes.toscrape.com/'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36'
}
# Отправляем GET-запрос на страницу с пользовательским агентом
response = requests.get(url, headers=headers)
# Проверяем, что запрос выполнен успешно
if response.status_code == 200:
# Создаем объект BeautifulSoup для парсинга HTML
soup = BeautifulSoup(response.text, 'html.parser')
# Ищем все блоки с цитатами
quotes = soup.select('.quote')
for quote in quotes[:3]:
# Извлекаем текст цитаты
text = quote.select_one('.text').get_text(strip=True)
# Извлекаем имя автора
author = quote.select_one('.author').get_text(strip=True)
# Выводим информацию
print(f'Цитата: {text}\nАвтор: {author}\n')
else:
print(f'Не удалось получить страницу. Статус код: {response.status_code}')
Запустим код, и наш скрапер выведет необходимую нам информацию – первые три фразы и имена их авторов:

Пример скрапера для динамического сайта
В качестве примера динамического сайта возьмём https://parsemachine.com. В частности выберем тестовую страничку https://parsemachine.com/sandbox/catalog/, на ней представлены карточки с 12 товарами. Попробуем извлечь название каждого товара и ссылку на него. Так как сайт динамический, будем использовать Playwright. Этот инструмент автоматизации браузера находит и извлекает элементы на веб-страницах с помощью CSS и XPath селекторов, текстовых и ARIA селекторов, а также поддерживает комбинирование селекторов для точного выбора.
Создадим новый проект, установим Playwright и браузер Chromium командами:
pip install playwright
playwright install chromium
Найдём интересующие нас элементы с помощью Инструментов разработчика:
Импортируем Playwright, запускаем браузер и переходим на нужную страницу:
from playwright.sync_api import sync_playwright
url = 'https://parsemachine.com/sandbox/catalog/'
def scrape_with_playwright():
with sync_playwright() as p:
browser = p.chromium.launch(headless=False)
page = browser.new_page()
page.goto(url)
Ищем все карточки продуктов, проходимся по каждой карточке, извлекаем ссылку на страницу товара:
product_cards = page.query_selector_all('.card.product-card')
for card in product_cards:
title_tag = card.query_selector('.card-title .title')
title = title_tag.inner_text() if title_tag else 'Нет названия'
Ссылка на страницу товара:
product_link = title_tag.get_attribute('href') if title_tag else 'Нет ссылки'
Если ссылка относительная, добавляем базовый URL:
if product_link and not product_link.startswith('http'):
product_link = f'https://parsemachine.com{product_link}'
Закрываем браузер, прописываем функцию для запуска:
browser.close()
scrape_with_playwright()
Готовый код полностью:
from playwright.sync_api import sync_playwright
# URL целевой страницы
url = 'https://parsemachine.com/sandbox/catalog/'
def scrape_with_playwright():
with sync_playwright() as p:
# Запуск браузера Chromium
browser = p.chromium.launch(headless=False)#Поменяйте на True, если нужен безголовый режим
# Открытие новой вкладки
page = browser.new_page()
# Переход на целевую страницу
page.goto(url)
# Ищем все карточки продуктов
product_cards = page.query_selector_all('.card.product-card')
for card in product_cards:
# Извлекаем ссылку на страницу товара
title_tag = card.query_selector('.card-title .title')
title = title_tag.inner_text() if title_tag else 'Нет названия'
# Ссылка на страницу товара
product_link = title_tag.get_attribute('href') if title_tag else 'Нет ссылки'
# Если ссылка относительная, добавляем базовый URL
if product_link and not product_link.startswith('http'):
product_link = f'https://parsemachine.com{product_link}'
# Выводим информацию о продукте
print(f'Название: {title}, Ссылка: {product_link}')
browser.close()
scrape_with_playwright()
Запустим наш скрипт, при его выполнении выведется вся нужная нам информация с названиями каждого товара, представленного на странице, и ссылками на них:

Как сохранить извлечённую информацию?
Для того, чтобы сохранять извлечённую информацию, нужно немного знать о форматах хранения результатов:
CSV – один из самых популярных форматов для хранения табличных данных. Он представляет собой текстовый файл, где каждая строка соответствует одной записи, а значения разделены запятыми. Преимущества данного формата: поддерживается большинством программ для обработки данных, включая Excel, легко читается и редактируется с помощью текстовых редакторов. Недостатки: ограниченные возможности для хранения сложных структур данных (например, вложенных данных). Проблемы с экранированием запятых и специальных символов.
JSON – это текстовый формат обмена данными, который удобно использовать для представления структурированных данных. Он широко используется в веб-разработке. Плюсы: поддерживает вложенные и иерархические структуры данных; хорошо поддерживается большинством языков программирования; легко читается и людьми, и машинами. JSON подходит для хранения данных, которые могут потребовать передачи через API. Минусы: JSON-файлы могут быть больше по размеру по сравнению с CSV; медленнее обрабатывается по сравнению с CSV из-за более сложной структуры.
XLS – предназначен для таблиц Excel, где хранятся данные о ячейках, форматировании и формулах. Он часто используется для хранения баз данных. Чтобы работать с XLS в Python, нужны сторонние библиотеки, например, pandas. Этот формат позволяет хранить данные в удобочитаемом и презентабельном виде. Основной недостаток — необходимость в дополнительных библиотеках, что увеличивает нагрузку на сервер и время обработки данных.
XML – это язык разметки, который используется для хранения и передачи данных. Он поддерживает вложенные структуры и атрибуты. Плюсы: структурированность, позволяет хранить сложные структуры данных, хорошо поддерживается различными стандартами и системами. Минусы: XML-файлы могут быть громоздкими и сложными для обработки; обработка XML может быть медленной из-за его структуры.
Базы данных используются для хранения больших объёмов структурированных данных. Примеры включают MySQL, PostgreSQL, MongoDB, SQLite. Плюсы: поддержка больших объемов данных и быстрый доступ; легко организовывать и связывать данные; поддержка транзакций и восстановления данных. Минус: требует дополнительных усилий для настройки и обслуживания.
Для наших скраперов выберем формат CSV, потому что извлечённые данные носят табличный характер (текст цитаты и автор, названия товаров и ссылки к ним) и объём данных относительно небольшой, без вложенных структур. Дополнительную информацию о том, как читать и записывать информацию в данном формате, можно узнать здесь. Добавим в наш код с цитатами импорт CSV, создадим объект writer, запишем данные цитат (сами цитаты и их авторов):
with open('quotes.csv', 'w', newline='', encoding='utf-8') as csvfile:
csvwriter = csv.writer(csvfile)
csvwriter.writerow(['Цитата', 'Автор'])
for quote in quotes[:3]:
text = quote.select_one('.text').get_text(strip=True)
author = quote.select_one('.author').get_text(strip=True)
csvwriter.writerow([text, author])
Также добавим дополнительные выводы в консоль и обработку возможных ошибок:
print("Данные успешно записаны в quotes.csv")
except requests.RequestException as e:
print(f'Ошибка при запросе страницы: {e}')
except Exception as e:
print(f'Произошла ошибка: {e}')
Код полностью:
import requests
from bs4 import BeautifulSoup
import csv
# URL целевой страницы
url = 'https://quotes.toscrape.com/'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36'
}
try:
# Отправляем GET-запрос на страницу с пользовательским агентом
response = requests.get(url, headers=headers)
response.raise_for_status() # Проверка на HTTP ошибки
# Создаем объект BeautifulSoup для парсинга HTML
soup = BeautifulSoup(response.text, 'html.parser')
# Ищем все блоки с цитатами
quotes = soup.select('.quote')
# Открываем CSV файл для записи
with open('quotes.csv', 'w', newline='', encoding='utf-8') as csvfile:
# Создаем объект writer
csvwriter = csv.writer(csvfile)
# Записываем заголовки
csvwriter.writerow(['Цитата', 'Автор'])
# Записываем данные цитат
for quote in quotes[:3]:
# Извлекаем текст цитаты
text = quote.select_one('.text').get_text(strip=True)
# Извлекаем имя автора
author = quote.select_one('.author').get_text(strip=True)
# Записываем в CSV файл
csvwriter.writerow([text, author])
print("Данные успешно записаны в quotes.csv")
except requests.RequestException as e:
print(f'Ошибка при запросе страницы: {e}')
except Exception as e:
print(f'Произошла ошибка: {e}')
Аналогичные действия проделаем и со вторым скрапером:
from playwright.sync_api import sync_playwright
import csv
# URL целевой страницы
url = 'https://parsemachine.com/sandbox/catalog/'
def scrape_with_playwright():
try:
with sync_playwright() as p:
# Запуск браузера Chromium
browser = p.chromium.launch(headless=False) # Поменяйте на True, если нужен безголовый режим
try:
# Открытие новой вкладки
page = browser.new_page()
# Переход на целевую страницу
page.goto(url)
# Ищем все карточки продуктов
product_cards = page.query_selector_all('.card.product-card')
# Открываем CSV файл для записи
with open('products.csv', 'w', newline='', encoding='utf-8') as csvfile:
# Создаем объект writer
csvwriter = csv.writer(csvfile)
# Записываем заголовки
csvwriter.writerow(['Название', 'Ссылка'])
# Извлекаем данные из карточек продуктов и записываем в CSV
for card in product_cards:
# Извлекаем название товара
title_tag = card.query_selector('.card-title .title')
title = title_tag.inner_text() if title_tag else 'Нет названия'
# Ссылка на страницу товара
product_link = title_tag.get_attribute('href') if title_tag else 'Нет ссылки'
# Если ссылка относительная, добавляем базовый URL
if product_link and not product_link.startswith('http'):
product_link = f'https://parsemachine.com{product_link}'
# Записываем данные в CSV файл
csvwriter.writerow([title, product_link])
# Выводим информацию о продукте
print(f'Название: {title}, Ссылка: {product_link}')
print("Данные успешно записаны в products.csv")
except Exception as e:
print(f'Ошибка при работе с Playwright: {e}')
finally:
# Закрытие браузера
browser.close()
print("Браузер закрыт.")
except Exception as e:
print(f'Ошибка при запуске Playwright: {e}')
scrape_with_playwright()
Препятствия при веб-скрапинге
Меняющаяся, усложнённая структура сайта: одним из самых распространённых препятствий при веб-скрапинге является изменение структуры веб-сайта и обфускация кода. Даже небольшие изменения в HTML-разметке или структуре страниц могут привести к тому, что скрипты для скрапинга перестанут работать. Это может потребовать частого обновления кода для адаптации к новым изменениям.
Ограничение запросов: многие веб-сайты имеют ограничения на количество запросов, которые можно отправить за определённый период времени. Если ваши запросы превышают установленные лимиты, ваш IP-адрес может быть временно заблокирован.
Блокировка IP: сайты могут блокировать IP-адреса, которые они определяют как подозрительные или слишком активные, и это может быть серьёзным препятствием для скрапинга. В этом случае потребуется использование качественных прокси-серверов для обхода таких блокировок.
CAPTCHA: многие веб-ресурсы внедряют защитные меры в виде капчи для предотвращения автоматизированных действий. Капча требует ручного ввода или использования специализированных сервисов для его обхода.
Одним из лучших сервисов на сегодняшний день является CapMonster Cloud – наличие API позволяет легко интегрировать его в код для обхода капчи и продолжения работы скрапера. К нему легко подключиться, он обеспечивает быстрое решение разных типов капч с минимальными ошибками – поддерживает reCAPTCHA, DataDome, Amazon CAPTCHA и другие. CapMonster Cloud может считаться оптимальным выбором в качестве вспомогательного инструмента и важной составляющей процесса веб-скрапинга.
Готовая библиотека для быстрой интеграции в Python-код
Рекомендации для успешного скрапинга
Используйте ротацию прокси и User-Agent, чтобы избежать блокировок IP-адресов и обойти ограничения на запросы, это поможет имитировать запросы от различных устройств и браузеров.
Добавляйте обработку ошибок и повторные попытки: веб-страница может быть временно недоступна, или запрос может завершиться ошибкой. Механизм повторных попыток и обработка ошибок поможет обеспечить устойчивость вашего скрипта к таким ситуациям и предотвратить прерывание процесса скрапинга.
Перед началом скрапинга обязательно ознакомьтесь с файлом robots.txt сайта. Этот файл содержит рекомендации для ботов о том, какие части сайта можно и нельзя сканировать. Соблюдение этих рекомендаций помогает избежать юридических проблем и конфликтов с владельцами сайтов.
Добавляйте случайные задержки между запросами, чтобы избежать подозрительной активности и снизить вероятность блокировки.
Эти рекомендации помогут вашему скрипту имитировать поведение реального пользователя, а значит, и снизить вероятность обнаружения.
Заключение
Итак, веб-скрапинг на Python – один из самых популярных способов эффективного сбора данных с различных веб-сайтов. Мы обсудили, как выбрать подходящие инструменты для веб-скрапинга, рассмотрели процесс установки Python и необходимых библиотек, а также написания кода для извлечения данных и сохранения результатов в удобных форматах. С помощью пошагового подхода, описанного в этой статье, даже начинающий разработчик сможет освоить основные техники веб-скрапинга и создать свои первые скрапер-скрипты. Веб-скрапинг открывает большие возможности для анализа данных, сбора информации, мониторинга рынка и многих других задач. Важно продолжать изучать новые инструменты и методики, чтобы оставаться актуальным в этой постоянно развивающейся области.
Используя такие библиотеки и инструменты, как BeautifulSoup, requests, Selenium, Playwright и другие, упомянутые в данном руководстве, можно извлекать информацию как со статических, так и с динамических сайтов. В процессе работы с веб-скрапингом важно учитывать юридические и этические аспекты, а также быть готовыми к обходу различных препятствий в виде капчи или динамической подгрузки контента.
Каждый из рассмотренных инструментов и подходов имеет свои преимущества и ограничения. Выбор подходящего инструмента зависит от специфики задачи, сложности веб-страниц и объёма данных. Для эффективного веб-скрапинга важно понимать особенности веб-страниц, с которыми вы работаете.
Надеемся, что вышеописанные инструкции помогут вам лучше понять процесс веб-скрапинга и предоставит необходимые базовые знания для создания собственных скраперов. Успехов в ваших проектах по автоматизации сбора данных и анализа информации!
NB: Пожалуйста, обратите внимание, что продукт предназначен для автоматизации тестирования исключительно ваших собственных веб-сайтов и ресурсов, к которым у вас есть законное право доступа.








