Парсер на Python — это скрипт, который автоматически извлекает данные с сайтов: цены, курсы валют, контакты, расписания. Для статических страниц достаточно двух библиотек — Requests и BeautifulSoup (bs4) — первый рабочий скрипт пишется за 15 минут. Для сайтов с JavaScript подключают Selenium WebDriver. В этой статье — 6 последовательных шагов, готовый кейс парсера погоды и сравнительная таблица инструментов. Все библиотеки бесплатны, Python 3.11+ устанавливается за пару минут.
Перед стартом убедитесь, что на компьютере установлен Python версии 3.11 или выше. Дополнительно нужны: редактор кода (подойдут VS Code или PyCharm) и браузер Chrome с инструментами разработчика.
Не знаете, с чего ребёнку начать в IT?
Дайте попробовать разные направления: Python, веб-разработку и робототехнику
Три основные библиотеки устанавливаются одной командой:
pip install requests beautifulsoup4 lxml
Здесь requests — для отправки HTTP-запросов, beautifulsoup4 — для разбора HTML, lxml — быстрый сторонний парсер, который BeautifulSoup использует «под капотом» вместо медленного встроенного html.parser.
Чтобы изолировать зависимости и не допустить конфликтов версий, сначала создайте виртуальное окружение (venv):
python3 -m venv myenv
После активации окружения и установки пакетов минимальный парсер на Python готов к написанию примерно за 15 минут.

Весь процесс укладывается в шесть этапов: изучить HTML-структуру страницы, подготовить окружение, получить HTML через запрос, разобрать его с помощью BeautifulSoup, сохранить результат и — при необходимости — добавить эмуляцию браузера для JS-страниц.

Прежде чем писать код, нужно понять, где в HTML живут нужные данные. Откройте DevTools: нажмите F12, перейдите на вкладку Elements. Перед вами — DOM-дерево (Document Object Model, объектная модель документа): иерархическая структура всех тегов страницы с корнем <html>.
Чтобы найти нужный элемент, кликните правой кнопкой мыши прямо по нему на странице → Inspect → в панели Elements подсветится соответствующий тег. Дальше: правая кнопка по тегу → Copy → Copy Selector. Браузер скопирует готовый CSS-селектор — краткое обозначение пути к элементу. Синтаксис: tag.class — по тегу и классу, #id — по идентификатору. Например: div.price или span.temp-value.
Активируйте созданный ранее venv:
После активации установите пакеты через менеджер пакетов pip:
pip install requests beautifulsoup4 lxml
Проверьте, что всё подтянулось корректно:
python -c «import bs4; print(bs4.__version__)»
Виртуальное окружение решает типичную проблему начинающих: если на компьютере несколько проектов с разными версиями библиотек, venv не даёт им конфликтовать между собой.

Библиотека Requests — HTTP-клиент для Python. Она отправляет GET-запрос и возвращает HTML страницы в виде строки. Многие сайты блокируют запросы без заголовка User-Agent (строки, идентифицирующей браузер для сервера) — передавайте его явно:
import requests
url = «https://example.com/catalog»
headers = {«User-Agent»: «Mozilla/5.0 (Windows NT 10.0; Win64; x64)»}
response = requests.get(url, headers=headers)
if response.status_code == 200:
src = response.text
else:
print(f»Ошибка: {response.status_code}»)
Код 200 — успешный ответ. Переменная src содержит HTML-строку, которую передадим в BeautifulSoup. Если страница возвращает пустой контент или данные отсутствуют — сайт, скорее всего, подгружает их через JavaScript. В таком случае переходите к шагу 6.

BeautifulSoup принимает HTML-строку и строит объектную модель, по которой ходят с помощью трёх методов поиска. Полезный бонус библиотеки — автоматическое восстановление невалидного HTML с незакрытыми тегами.
from bs4 import BeautifulSoup
soup = BeautifulSoup(src, ‘lxml’)
# Первый найденный элемент
title = soup.find(«h1»).get_text(strip=True)
# Все элементы с нужным классом
items = soup.find_all(«div», class_=»product-card»)
# CSS-синтаксис через select()
prices = soup.select(«span.price»)
price_list = [p.get_text(strip=True) for p in prices]
# Значение атрибута href
link = soup.find(«a»)[«href»]
find() возвращает первый найденный элемент, find_all() — список всех совпадений, select() принимает CSS-селектор, скопированный из DevTools. Метод .get_text(strip=True) выдаёт чистый текст без тегов и лишних пробелов.

Извлечённые данные нужно записать в файл. JSON подходит для иерархических структур и дальнейшей обработки в Python; CSV открывается прямо в Excel без дополнительных инструментов.
import json, csv
data = [{«name»: «Товар 1», «price»: «1200 ₽»}, {«name»: «Товар 2», «price»: «850 ₽»}]
# JSON
with open(«result.json», «w», encoding=»utf-8″) as f:
json.dump(data, f, ensure_ascii=False, indent=2)
# CSV
with open(«result.csv», «w», newline=»», encoding=»utf-8″) as f:
writer = csv.DictWriter(f, fieldnames=[«name», «price»])
writer.writeheader()
writer.writerows(data)
Для больших объёмов данных используют SQLite — модуль sqlite3 встроен в Python и не требует отдельной установки. Для промышленного масштаба подойдёт PostgreSQL.

HTTP-запрос через Requests возвращает исходный HTML — ровно то, что сервер отдаёт при первом обращении. Если данные подгружаются позже через AJAX (асинхронные запросы к серверу без перезагрузки страницы) или SPA-фреймворки (React, Vue), в исходном HTML их ещё нет. Два варианта решения: Selenium WebDriver или Playwright.

Selenium WebDriver — инструмент управления браузером из Python-кода. Он запускает реальный Chrome, загружает страницу полностью, дожидается выполнения JavaScript и только потом отдаёт HTML.
pip install selenium webdriver-manager
webdriver-manager — утилита для автоматической загрузки ChromeDriver. Без неё драйвер пришлось бы обновлять вручную при каждом обновлении браузера.
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.support.ui import WebDriverWait
Ребенок хочет изучать программирование? Пусть начнёт с реальных проектов
На курсе школьники создают Telegram-бота, сайт и веб-приложение
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager
from bs4 import BeautifulSoup
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
driver.get(«https://example.com/js-page»)
# Ждём появления нужного элемента — до 10 секунд
WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.CSS_SELECTOR, «div.price»))
)
src = driver.page_source
driver.quit()
soup = BeautifulSoup(src, ‘lxml’)
WebDriverWait ждёт появления элемента на странице — надёжнее фиксированного time.sleep(), который не знает о реальном состоянии загрузки.
Если нужно пройти тысячи страниц, настроить регулярный мониторинг цен или выстроить сложную логику обработки данных — выбирайте Scrapy. Это асинхронный (выполняющий несколько запросов одновременно) фреймворк с готовым конвейером обработки.
Структура Scrapy: Spider (паук) — обходит страницы и извлекает данные → Item (контейнер данных) → Pipeline (конвейер: очистка, валидация, запись в хранилище).

Создать проект и запустить краулер:
scrapy startproject myproject
scrapy crawl myspider -o output.json

Три ключевые настройки в settings.py:
ROBOTSTXT_OBEY = True # соблюдать robots.txt
DOWNLOAD_DELAY = 1 # пауза между запросами (секунды)
CONCURRENT_REQUESTS = 16 # параллельных запросов одновременно
ROBOTSTXT_OBEY = True — стандарт вежливого краулера: Scrapy сам читает robots.txt целевого сайта и пропускает запрещённые разделы. DOWNLOAD_DELAY снижает нагрузку на сервер и уменьшает риск блокировки.

Разберём конкретный пример парсера на Python — извлечение текущей температуры с публичного погодного сайта.
Первый шаг — DevTools: открываем нужную страницу, через Inspect находим тег с температурой и копируем CSS-селектор, например span.temp-value.
import requests
from bs4 import BeautifulSoup
import csv
from datetime import datetime
url = «https://погодный-сайт.ru/moscow»
headers = {«User-Agent»: «Mozilla/5.0»}
response = requests.get(url, headers=headers)
soup = BeautifulSoup(response.text, ‘lxml’)
temp = soup.select_one(«span.temp-value»).get_text(strip=True)
print(f»Температура в Москве: {temp}»)
# Добавить запись в CSV-лог
with open(«weather_log.csv», «a», newline=»», encoding=»utf-8″) as f:
csv.writer(f).writerow([datetime.now().isoformat(), temp])
За 10 минут получаем рабочий инструмент мониторинга: каждый запуск дописывает строку с датой и температурой в CSV-файл. По той же схеме строится мониторинг цен, курсов валют, остатков товаров.
Парсинг публично доступной информации — цен, статей, расписаний, курсов валют — законен. Два ключевых правила: проверяйте robots.txt перед запуском и не создавайте нагрузку на сервер.
| Можно |
Нельзя |
|---|---|
| Публичные цены и каталоги | Персональные данные пользователей |
| Открытые новости и статьи | Закрытые разделы за авторизацией |
| Курсы валют, расписания | Контент с запретом в robots.txt |
| Данные публичных API | Запросы с частотой, перегружающей сервер |
Перед стартом откройте https://сайт.ru/robots.txt и проверьте правила вручную. Scrapy при ROBOTSTXT_OBEY = True делает это автоматически. Стандартная задержка — 1–3 секунды между запросами; для строгих сайтов повышайте до 5–10 секунд.
Если сайт начал отвечать ошибками или возвращать пустые страницы, используйте несколько приёмов:
| Параметр |
Requests + BS4 |
Scrapy |
Selenium / Playwright |
|---|---|---|---|
| Поддержка JS | ❌ | ❌ | ✅ |
| Скорость | Высокая | Очень высокая | Низкая |
| Масштаб | Отдельные страницы | Тысячи страниц | Отдельные страницы |
| Сложность входа | Низкая | Средняя | Средняя |
| Встроенный экспорт | — | JSON / CSV / XML | — |
| Поддержка прокси | Вручную | Встроена | Вручную |
| Статические страницы | ✅ | ✅ | ✅ |
| Динамические страницы | ❌ | ❌ | ✅ |
Requests + BeautifulSoup — оптимальный старт для прототипов и небольших задач. Scrapy — когда нужен регулярный мониторинг тысяч страниц. Selenium или Playwright — для JS-сайтов и страниц с авторизацией. Playwright работает быстрее Selenium за счёт нативного async/await (асинхронного API) и поддерживает Chromium, Firefox и WebKit.
Хотите освоить Python с нуля и писать собственные скрипты? На курсе «Программирование: Уверенный старт» школьники за 4 недели создают Telegram-бота, сайт и веб-приложение — с нуля, пошагово, с преподавателями-практиками. Узнайте подробнее на странице курса.
Парсинг (web scraping) — автоматическое извлечение данных с сайтов. Вместо того чтобы вручную копировать цены, контакты или расписания, скрипт делает это программно. Альтернатива парсингу — API (программный интерфейс): если сайт его предоставляет, это всегда предпочтительный вариант — API стабильнее и не нарушает условий использования сервиса.
BeautifulSoup — библиотека для разбора HTML одной страницы; подходит начинающим и для небольших задач. Scrapy — полноценный асинхронный фреймворк с очередью запросов, конвейером обработки и встроенным экспортом данных. Scrapy рассчитан на промышленный обход тысяч страниц и требует больше времени на первоначальную настройку, зато не нужно писать логику параллелизма и повторных попыток вручную.
Если Requests возвращает пустой HTML, значит данные подгружает JavaScript после первой загрузки страницы. Решение — Selenium WebDriver: он запускает реальный браузер и дожидается выполнения JS. Современная альтернатива — Playwright от Microsoft: работает быстрее и поддерживает Chromium, Firefox и WebKit. Также проверьте вкладку Network в DevTools — иногда данные приходят напрямую через JSON-эндпоинт и парсить HTML вообще не нужно.
Нажмите F12, откройте вкладку Elements, кликните правой кнопкой мыши по нужному элементу на странице → Inspect. В панели Elements подсветится соответствующий тег. Затем правая кнопка по тегу → Copy → Copy Selector. Браузер скопирует готовый CSS-селектор, который вставляется в soup.select() в BeautifulSoup или в response.css() в Scrapy.
Парсинг публично доступной информации — цен, статей, расписаний — законен. Запрещено собирать персональные данные пользователей и обходить технические меры защиты закрытых разделов. Перед запуском всегда проверяйте robots.txt целевого сайта: там указано, какие разделы закрыты для автоматических запросов.
Используйте ротацию User-Agent, прокси-серверы для смены IP-адреса и рандомизированные задержки: time.sleep(random.uniform(1, 3)). Главный принцип — не частите: 1–3 секунды между запросами покрывают большинство сайтов. Если ресурс предоставляет API — используйте его: это быстрее, надёжнее и этичнее парсинга.
Playwright быстрее за счёт нативного async/await (асинхронного API), поддерживает три движка — Chromium, Firefox, WebKit — и требует меньше кода для типовых задач автоматизации браузера. Selenium зрелее и имеет большую экосистему готовых решений, что облегчает поиск ответов при нестандартных проблемах.
Начните с основ языка: переменные, функции, работа с библиотеками. Затем — пять шагов из этой инструкции: установите Python и venv, добавьте Requests и BeautifulSoup, напишите запрос, разберите HTML, сохраните результат в JSON. Если Python ещё незнаком, освоить основы можно на курсе «Программирование: Уверенный старт» — он бесплатный (0 ₽), проходит онлайн от 4 недель. В первом модуле — основы Python и реальный проект: рабочий Telegram-бот.
Пусть ребёнок сделает первый IT-проект уже в этом месяце
Бесплатный онлайн-курс с понятной программой, поддержкой и проектами для портфолио