Веб-скрапинг на Python: извлечение данных из сайтов за 5 шагов
Для кого эта статья:
- Новички, желающие изучить программирование и веб-скрапинг
- Студенты и профессионалы, заинтересованные в автоматизации сбора данных
Исследователи и аналитики, нуждающиеся в обработке больших объемов информации для анализа
Представьте, что вы открываете сайт с погодой, чтобы узнать прогноз на неделю. Теперь представьте, что вам нужны данные о погоде за последние 5 лет для научного исследования — вручную скопировать это невозможно! Именно здесь на помощь приходит веб-скрапинг с Python. Это не просто модный навык — это суперспособность, которая позволяет автоматически извлекать огромные объемы данных из интернета, анализировать тренды и принимать решения на основе реальных цифр. 🐍 Готовы научиться собирать информацию, как профессионал, даже если вы никогда раньше не писали код?
Хотите всего за 9 месяцев освоить Python и получить реальные навыки веб-скрапинга под руководством экспертов? Обучение Python-разработке от Skypro включает не только теоретическую базу, но и практические кейсы по автоматическому сбору и анализу данных. Студенты создают настоящие скраперы уже на втором месяце обучения, а к выпуску имеют в портфолио проекты, демонстрирующие владение Beautiful Soup, Scrapy и другими инструментами. Ваша первая работа программистом может начаться раньше, чем вы думаете! 🚀
Основы веб-скрапинга с Python: что нужно знать новичку
Веб-скрапинг — это процесс автоматического извлечения данных с веб-сайтов. Представьте, что вместо ручного копирования информации вы создаёте программу, которая делает это за вас: собирает цены, новости, отзывы или любую другую информацию, представленную на веб-страницах.
Python стал золотым стандартом для веб-скрапинга благодаря своей простоте и богатой экосистеме библиотек. Даже если вы только начинаете изучать программирование, Python позволит вам создать эффективный скрапер быстрее, чем любой другой язык.
Алексей Петров, Lead Python Developer
Когда я только начинал свой путь в программировании, мне поставили задачу собрать базу данных товаров с нескольких интернет-магазинов для анализа конкурентов. Я был новичком и думал, что придётся неделями вручную копировать данные. Коллега посоветовал попробовать Python и Beautiful Soup. Первый скрипт я написал за вечер — всего 40 строк кода! На следующее утро у меня была таблица Excel с 5000 товаров, включая названия, цены и характеристики. Руководитель был в шоке, думая, что я не спал всю ночь. Именно тогда я понял, что веб-скрапинг — это не просто техническая задача, а настоящий профессиональный суперпауэр.
Прежде чем приступить к коду, важно понимать три ключевых элемента веб-скрапинга:
- HTTP-запросы — механизм, позволяющий вашей программе "посещать" веб-страницы
- HTML-парсинг — процесс извлечения конкретных данных из веб-страницы
- DOM-структура — иерархическое представление элементов страницы, которое нужно понимать для точного извлечения данных
Для успешного скрапинга необходимо базовое понимание HTML и CSS селекторов. Не беспокойтесь, если вы не эксперт — достаточно понимать основы тегов, атрибутов и как элементы вложены друг в друга.
| Навык | Уровень необходимости для новичка | Где применяется в веб-скрапинге |
|---|---|---|
| Python (основы) | Высокий | Написание скрипта, обработка данных |
| HTML/CSS | Средний | Понимание структуры страницы и селекторов |
| HTTP-протокол | Базовый | Понимание запросов и ответов сервера |
| JavaScript | Опционально | Скрапинг динамических сайтов |
Основной инструментарий для веб-скрапинга на Python включает следующие библиотеки:
- Requests: Отправляет HTTP-запросы и получает ответы
- Beautiful Soup: Парсит HTML и XML документы
- Scrapy: Полноценный фреймворк для создания масштабных скраперов
- Selenium: Автоматизирует браузер для скрапинга динамических сайтов
- Pandas: Обрабатывает и анализирует собранные данные
Каждый проект по веб-скрапингу включает четыре основных этапа: получение HTML-страницы, парсинг для извлечения нужных данных, сохранение результатов и обработка ошибок. Для начала мы сосредоточимся на первых двух.

Настройка окружения и установка библиотек для скрапинга
Прежде чем приступить к написанию кода, необходимо правильно настроить рабочее окружение. Python делает этот процесс максимально простым, особенно если вы используете виртуальные окружения — они позволяют изолировать зависимости проекта и избежать конфликтов версий. 🛠️
Вот пошаговая инструкция для настройки окружения:
- Установите Python (рекомендуется версия 3.8 или выше) с официального сайта
- Создайте виртуальное окружение в терминале или командной строке:
# Windows
python -m venv scraping_env
scraping_env\Scripts\activate
# macOS/Linux
python3 -m venv scraping_env
source scraping_env/bin/activate
После активации виртуального окружения установите основные библиотеки с помощью pip:
pip install requests beautifulsoup4 scrapy pandas
Для работы с динамическими сайтами может потребоваться Selenium:
pip install selenium webdriver-manager
Важно также установить правильные версии драйверов для Selenium, если вы планируете автоматизировать браузер. Библиотека webdriver-manager делает этот процесс намного проще.
| Библиотека | Описание | Когда использовать | Сложность освоения |
|---|---|---|---|
| Requests | Отправка HTTP-запросов | Для любого проекта скрапинга | Низкая |
| Beautiful Soup | HTML-парсер | Небольшие проекты, статические страницы | Низкая |
| Scrapy | Фреймворк для скрапинга | Крупные проекты, множественные страницы | Средняя |
| Selenium | Автоматизация браузера | Динамический контент, JavaScript | Средняя-высокая |
| Pandas | Обработка данных | Анализ и экспорт данных | Средняя |
Для эффективной разработки рекомендую использовать IDE с поддержкой Python, например:
- VSCode с расширением Python (легкий и гибкий вариант)
- PyCharm (полноценная IDE с большим количеством функций)
- Jupyter Notebook (удобен для экспериментов и анализа данных)
Удобный инструмент для изучения структуры веб-страниц — инспектор элементов в браузере. Он позволяет увидеть HTML-код, CSS-селекторы и определить, какие элементы нужно извлечь. Просто нажмите F12 в большинстве браузеров или щелкните правой кнопкой мыши на элемент и выберите "Просмотреть код".
Дополнительно я рекомендую установить расширения для браузера, которые облегчают выбор селекторов:
- SelectorGadget для Chrome и Firefox
- CSS Selector Tester для проверки селекторов
Не забудьте также создать файл requirements.txt с перечислением всех зависимостей. Это упростит воспроизведение вашего окружения на других компьютерах:
requests==2.28.1
beautifulsoup4==4.11.1
scrapy==2.7.1
pandas==1.5.1
selenium==4.5.0
webdriver-manager==3.8.4
Python + Beautiful Soup: извлечение данных с HTML-страниц
Beautiful Soup — это Python-библиотека, которая превращает даже самую запутанную HTML-страницу в структурированный объект, с которым легко работать. Она позволяет навигировать по документу, искать элементы и извлекать нужные данные с минимумом кода. Это идеальный инструмент для новичков благодаря своей простоте. 🔍
Мария Соколова, Data Scientist
Мой первый коммерческий проект с использованием веб-скрапинга был связан с анализом рынка недвижимости. Клиент хотел понять, как меняются цены на квартиры в разных районах города, но API у сайтов недвижимости отсутствовали. Используя Python и Beautiful Soup, я создала скрипт, который ежедневно собирал информацию о новых объявлениях. Через месяц у нас была база данных с тысячами записей, которая позволила выявить недооцененные объекты и районы с наибольшим потенциалом роста. Клиент использовал эти данные для инвестиций и за год увеличил капитал на 27%. Самое удивительное — весь скрипт занимал меньше 100 строк кода и работал полностью автоматически на небольшом сервере. Именно тогда я поняла, что веб-скрапинг — это не просто технический навык, а мощный инструмент для бизнес-аналитики.
Начнем с простого примера — скрапинга заголовков новостей с веб-сайта. Вот базовый код с использованием Requests и Beautiful Soup:
import requests
from bs4 import BeautifulSoup
# Отправляем GET-запрос к сайту
url = 'https://news-site.com/'
response = requests.get(url)
# Проверяем успешность запроса
if response.status_code == 200:
# Создаем объект Beautiful Soup
soup = BeautifulSoup(response.text, 'html.parser')
# Находим все заголовки новостей по CSS-селектору
headlines = soup.select('.article-title')
# Выводим текст каждого заголовка
for headline in headlines:
print(headline.text.strip())
else:
print(f"Ошибка при запросе: {response.status_code}")
Beautiful Soup предлагает несколько способов поиска элементов:
- find() и find_all() — поиск по тегу, атрибутам или тексту
- select() и select_one() — поиск по CSS-селекторам
- Навигация по дереву с помощью свойств .parent, .children, .next_sibling и т.д.
Рассмотрим более сложный пример — извлечение информации о товарах из интернет-магазина:
import requests
from bs4 import BeautifulSoup
import pandas as pd
def scrape_products(url):
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}
response = requests.get(url, headers=headers)
if response.status_code != 200:
return "Ошибка при запросе"
soup = BeautifulSoup(response.content, 'html.parser')
products = []
# Находим все карточки товаров
product_cards = soup.find_all('div', class_='product-card')
for card in product_cards:
# Извлекаем название
name = card.find('h3', class_='product-title').text.strip()
# Извлекаем цену
price_element = card.find('span', class_='price')
price = price_element.text.strip() if price_element else 'Нет данных'
# Извлекаем рейтинг
rating_element = card.find('div', class_='rating')
rating = rating_element.get('data-rating', 'Нет рейтинга') if rating_element else 'Нет рейтинга'
# Извлекаем URL изображения
img_element = card.find('img')
img_url = img_element.get('src') if img_element else 'Нет изображения'
# Добавляем информацию о товаре в список
products.append({
'name': name,
'price': price,
'rating': rating,
'image_url': img_url
})
# Создаем DataFrame из собранных данных
df = pd.DataFrame(products)
return df
# Пример использования
url = 'https://example-shop.com/products'
product_data = scrape_products(url)
print(product_data.head())
# Сохранение в Excel
product_data.to_excel('products.xlsx', index=False)
Когда вы работаете с Beautiful Soup, важно учитывать следующие практические советы:
- Всегда добавляйте User-Agent в заголовки — это делает ваш запрос более похожим на запрос реального браузера и снижает вероятность блокировки.
- Обрабатывайте исключения — сайты могут изменить структуру, быть недоступными или блокировать ваши запросы.
- Используйте try-except блоки при извлечении данных, чтобы скрипт не останавливался при отсутствии какого-либо элемента.
- Добавляйте задержки между запросами (с помощью time.sleep()) для снижения нагрузки на сервер.
Beautiful Soup идеально подходит для статических сайтов, но для страниц с динамическим контентом (загружаемым через JavaScript) может потребоваться дополнительный инструментарий, например, Selenium.
Автоматизация сбора информации с Requests и Scrapy
Хотя Beautiful Soup отлично подходит для простых задач скрапинга, для масштабных проектов более эффективными инструментами являются библиотека Requests (для контроля HTTP-запросов) и фреймворк Scrapy (для создания полноценных пауков-скраперов). Эти инструменты позволяют автоматизировать сбор данных с тысяч страниц, обрабатывать пагинацию и эффективно управлять сетевыми запросами. 🕸️
Начнем с расширенного примера использования Requests для скрапинга сайта с пагинацией:
import requests
import time
from bs4 import BeautifulSoup
def scrape_pages(base_url, max_pages=5):
all_data = []
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
}
for page in range(1, max_pages + 1):
# Формируем URL текущей страницы
page_url = f"{base_url}?page={page}"
print(f"Обработка страницы {page}...")
# Делаем запрос
try:
response = requests.get(page_url, headers=headers)
response.raise_for_status() # Проверяем статус ответа
except requests.exceptions.RequestException as e:
print(f"Ошибка при запросе к странице {page}: {e}")
continue
# Парсим страницу
soup = BeautifulSoup(response.text, 'html.parser')
# Извлекаем данные (пример: список новостей)
items = soup.select('.news-item')
for item in items:
title = item.select_one('.title').text.strip()
date = item.select_one('.date').text.strip()
summary = item.select_one('.summary').text.strip()
all_data.append({
'title': title,
'date': date,
'summary': summary
})
# Делаем паузу между запросами
time.sleep(2) # 2 секунды
return all_data
# Пример использования
news_data = scrape_pages('https://example-news.com/articles', max_pages=3)
print(f"Собрано {len(news_data)} новостных статей")
Теперь перейдем к Scrapy — мощному фреймворку для создания полноценных краулеров. Scrapy использует асинхронное программирование, что делает его быстрым и эффективным. Создадим проект и первого "паука":
# Создание проекта Scrapy
# В командной строке: scrapy startproject product_scraper
# cd product_scraper
# scrapy genspider products example-shop.com
# Пример паука (spiders/products.py)
import scrapy
class ProductsSpider(scrapy.Spider):
name = 'products'
allowed_domains = ['example-shop.com']
start_urls = ['https://example-shop.com/products']
def parse(self, response):
# Извлекаем все карточки товаров
for product in response.css('div.product-card'):
yield {
'name': product.css('h3.product-title::text').get().strip(),
'price': product.css('span.price::text').get().strip(),
'rating': product.css('div.rating::attr(data-rating)').get('N/A'),
'image_url': product.css('img::attr(src)').get('')
}
# Находим ссылку на следующую страницу и следуем по ней
next_page = response.css('a.next-page::attr(href)').get()
if next_page:
yield response.follow(next_page, self.parse)
# Запуск паука в командной строке:
# scrapy crawl products -o products.json
Scrapy предоставляет множество преимуществ для масштабных проектов:
- Встроенная поддержка пагинации и следования по ссылкам
- Обработка HTTP-запросов и параллельное выполнение
- Автоматическое соблюдение правил robots.txt
- Механизмы предотвращения блокировки (ротация User-Agent, прокси и т.д.)
- Различные форматы экспорта данных (JSON, CSV, XML и др.)
Сравнение подходов к веб-скрапингу:
| Характеристика | Requests + BeautifulSoup | Scrapy |
|---|---|---|
| Кривая обучения | Низкая (идеально для начинающих) | Средняя-высокая |
| Производительность | Хорошая для небольших проектов | Отличная для масштабных проектов |
| Асинхронность | Требует дополнительных библиотек | Встроенная |
| Обработка ошибок | Ручная реализация | Встроенные механизмы |
| Архитектура | Простые скрипты | Структурированные проекты |
Для более сложных сценариев, таких как обработка AJAX-запросов или взаимодействие с элементами страницы, можно комбинировать Scrapy с Selenium:
# pip install scrapy-selenium
# В settings.py добавляем:
from shutil import which
SELENIUM_DRIVER_NAME = 'chrome'
SELENIUM_DRIVER_EXECUTABLE_PATH = which('chromedriver')
SELENIUM_DRIVER_ARGUMENTS = ['--headless']
DOWNLOADER_MIDDLEWARES = {
'scrapy_selenium.SeleniumMiddleware': 800
}
# В пауке используем SeleniumRequest:
from scrapy_selenium import SeleniumRequest
def start_requests(self):
yield SeleniumRequest(
url='https://dynamic-site.com',
callback=self.parse,
wait_time=3 # Ждем 3 секунды для загрузки JavaScript
)
def parse(self, response):
# Теперь response содержит полностью отрендеренную страницу
# Работаем с ней как обычно
pass
При работе с большими объемами данных важно оптимизировать хранение. Вы можете настроить Scrapy для сохранения данных непосредственно в базу данных, например, SQLite, PostgreSQL или MongoDB, используя пайплайны:
# pipelines.py
import sqlite3
class SQLitePipeline:
def open_spider(self, spider):
self.connection = sqlite3.connect('products.db')
self.cursor = self.connection.cursor()
self.cursor.execute('''
CREATE TABLE IF NOT EXISTS products
(id INTEGER PRIMARY KEY, name TEXT, price TEXT, rating TEXT)
''')
self.connection.commit()
def close_spider(self, spider):
self.connection.close()
def process_item(self, item, spider):
self.cursor.execute(
"INSERT INTO products (name, price, rating) VALUES (?, ?, ?)",
(item['name'], item['price'], item['rating'])
)
self.connection.commit()
return item
# Включаем пайплайн в settings.py
ITEM_PIPELINES = {
'product_scraper.pipelines.SQLitePipeline': 300,
}
Этичный веб-скрапинг: легальные аспекты и лучшие практики
Веб-скрапинг — мощный инструмент для сбора данных, но он должен использоваться ответственно и в рамках закона. Игнорирование правовых и этических аспектов может привести к блокировке IP-адреса, судебным искам или даже уголовной ответственности в некоторых юрисдикциях. Давайте разберемся, как оставаться в безопасной зоне. ⚖️
Основные юридические ограничения, с которыми вы можете столкнуться:
- Условия использования сайта — многие веб-сайты запрещают автоматический сбор данных в своих правилах
- Авторское право — нельзя копировать и использовать защищенный контент (тексты, изображения) без разрешения
- Законы о персональных данных — сбор персональной информации может нарушать GDPR, CCPA и другие законы
- Компьютерное мошенничество — намеренный обход технических ограничений может рассматриваться как незаконный доступ к компьютерным системам
Для этичного скрапинга следуйте этим принципам:
- Проверяйте файл robots.txt — это официальный способ, которым владельцы сайтов указывают, какие части их сайта можно сканировать автоматически
- Не перегружайте сервер — добавляйте задержки между запросами (2-10 секунд)
- Идентифицируйте своего бота — включайте контактную информацию в User-Agent
- Используйте API, если они доступны — многие сайты предоставляют API для легального доступа к данным
- Уважайте тег nofollow и атрибуты noindex
Практический пример проверки robots.txt перед скрапингом:
import requests
from urllib.robotparser import RobotFileParser
def is_scraping_allowed(url, user_agent="*"):
# Парсим URL для получения домена
domain = url.split("//")[-1].split("/")[0]
# Создаем объект RobotFileParser
rp = RobotFileParser()
rp.set_url(f"https://{domain}/robots.txt")
try:
rp.read()
# Проверяем, разрешено ли сканирование URL для данного user-agent
return rp.can_fetch(user_agent, url)
except:
print("Не удалось прочитать robots.txt")
return False
# Пример использования
url = "https://example.com/products"
if is_scraping_allowed(url, "MyBot"):
print("Скрапинг разрешен, можно приступать")
# Код скрапинга
else:
print("Скрапинг запрещен правилами robots.txt")
При работе с большими объемами запросов важно не только соблюдать этические нормы, но и защитить себя от блокировки. Вот несколько технических рекомендаций:
- Ротация User-Agent — используйте разные User-Agent для запросов
- Прокси-серверы — распределяйте запросы через разные IP-адреса
- Распределение запросов во времени — используйте случайные интервалы между запросами
- Кэширование — не запрашивайте одни и те же страницы повторно
Пример реализации ротации User-Agent и прокси в Scrapy:
# middlewares.py
import random
from scrapy import signals
class RotateUserAgentMiddleware:
def __init__(self, user_agents):
self.user_agents = user_agents
@classmethod
def from_crawler(cls, crawler):
return cls(
user_agents=crawler.settings.get('USER_AGENT_LIST')
)
def process_request(self, request, spider):
request.headers['User-Agent'] = random.choice(self.user_agents)
# settings.py
USER_AGENT_LIST = [
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15',
'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36'
]
DOWNLOADER_MIDDLEWARES = {
'myproject.middlewares.RotateUserAgentMiddleware': 400,
}
Альтернативы скрапингу, которые стоит рассмотреть:
| Альтернатива | Преимущества | Недостатки |
|---|---|---|
| Официальные API | Легально, надежно, структурированные данные | Может быть платным, ограниченный объем данных |
| Открытые наборы данных | Готовые к использованию, часто высокого качества | Могут быть устаревшими, не всегда доступны для всех тематик |
| Партнерские соглашения | Официальный доступ к данным, поддержка | Требуют переговоров, могут быть дорогими |
| Сервисы для краудсорсинга данных | Масштабируемость, человеческая проверка | Медленнее автоматизированных методов, дороже |
Несколько конкретных случаев, когда веб-скрапинг может быть законным:
- Общедоступные государственные данные (при отсутствии явного запрета)
- Научные исследования с некоммерческими целями (часто подпадает под исключения для добросовестного использования)
- Личное использование без дальнейшего распространения данных
- Сбор собственных открытых данных (например, отзывы о вашей компании)
Помните, что законодательство в области веб-скрапинга продолжает развиваться, и то, что было допустимо вчера, может стать незаконным завтра. Всегда консультируйтесь с юристом, если планируете масштабные проекты по сбору данных, особенно для коммерческих целей.
Освоив веб-скрапинг с Python, вы получили не просто техническое умение, а инструмент для решения реальных задач. От сбора рыночных данных и анализа тенденций до создания уникальных исследовательских проектов — возможности практически безграничны. Помните, что с большой силой приходит большая ответственность: соблюдайте этические и юридические нормы при сборе данных, уважайте права владельцев сайтов и защиту персональных данных. И, конечно, продолжайте совершенствовать свои навыки — веб-скрапинг открывает путь к более глубокому пониманию автоматизации, анализа данных и искусственного интеллекта. Какой бы ни была ваша следующая задача — теперь вы готовы автоматизировать её с помощью Python.