— «Парсинг — это просто!». Сказал новичок и ушёл в бан на первой странице.
В этой статье разберёмся, как грамотно парсить HTML-страницы с помощью Python, не нарушая правила хорошего тона (и robots.txt), не выжигая сервера до тла и не ловя блокировку по IP. Мы будем использовать requests, BeautifulSoup, кастомные заголовки, rate-limiting и даже слегка поиграем с пагинацией.
Всё будет по-человечески, с юмором, комментариями и примерами — от простого к профессиональному.
🚀 Что такое парсинг?
Проще говоря, парсинг — это способ достать данные с веб-страницы, которую обычно просматривает человек в браузере. Но мы-то хитрые: берём Python, отправляем запрос и вытаскиваем нужные куски HTML.
☕ Инструменты, которые понадобятся:
pip install requests beautifulsoup4
🔰 Пример 1: Простой парсинг статьи (новичок)
Давайте начнем с базового примера. Допустим, хотим вытащить заголовок статьи с блога.
import requests
from bs4 import BeautifulSoup
# Отправляем GET-запрос
response = requests.get("https://realpython.com/beautiful-soup-web-scraper-python/")
# Проверяем, всё ли прошло ок
print(response.status_code) # 200 - значит, всё ок!
# Создаём объект BeautifulSoup
soup = BeautifulSoup(response.text, "html.parser")
# Находим заголовок страницы
title = soup.find("h1").text
print(f"Заголовок: {title}")
📝 Комментарии к коду:
- requests.get(...) — получаем HTML-код страницы.
- BeautifulSoup(..., "html.parser") — говорим, что будем разбирать HTML.
- soup.find("h1") — ищем первый заголовок <h1> на странице.
- .text — достаём чистый текст без тегов.
🔐 Пример 2: Заголовки и маскировка под браузер
Некоторые сайты банят ботов по User-Agent. Что делать? Притвориться браузером!
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"
}
response = requests.get("https://quotes.toscrape.com/", headers=headers)
soup = BeautifulSoup(response.text, "html.parser")
for quote in soup.find_all("span", class_="text"):
print(quote.text)
📌 Важно:
- Заголовок User-Agent нужен, чтобы не светиться как бот.
- Некоторые сайты без него не отдают вообще ничего (или отдают пустышку).
⏳ Пример 3: Rate-limiting — не будь назойливым
Хамить веб-серверу — это плохо. Не надо слать 100 запросов в секунду.
import time
for page in range(1, 4):
url = f"https://quotes.toscrape.com/page/{page}/"
response = requests.get(url)
soup = BeautifulSoup(response.text, "html.parser")
print(f"Страница {page}")
for quote in soup.find_all("span", class_="text"):
print(quote.text)
# Пауза между запросами
time.sleep(2) # 2 секунды отдыха
🧘♂️ Резюме:
- Делаем паузы между запросами (sleep).
- Можно использовать random.uniform(1, 3) для реалистичности.
- Не будьте как скрипт на фрилансе за 500₽ — будьте вежливы.
📚 Пример 4: Пагинация — гуляем по страницам
Парсим все страницы сайта до конца? Легко!
url = "https://quotes.toscrape.com/page/1/"
while url:
response = requests.get(url)
soup = BeautifulSoup(response.text, "html.parser")
for quote in soup.find_all("span", class_="text"):
print(quote.text)
next_btn = soup.find("li", class_="next")
if next_btn:
next_link = next_btn.find("a")["href"]
url = "https://quotes.toscrape.com" + next_link
time.sleep(2)
else:
url = None
💡 Хитрости:
- Ищем ссылку на «следующую» страницу.
- Пока есть next, мы парсим дальше.
- Подобный подход работает почти на всех форумах, каталогах и блогах.
🧠 Пример 5: Продвинутый случай — парсим товары с фильтрацией
Задача: собрать названия и цены всех товаров, содержащих слово “Python”, с https://books.toscrape.com
base_url = "https://books.toscrape.com/catalogue/page-{}.html"
for page in range(1, 51): # У сайта 50 страниц
response = requests.get(base_url.format(page))
soup = BeautifulSoup(response.text, "html.parser")
books = soup.find_all("article", class_="product_pod")
for book in books:
title = book.h3.a["title"]
price = book.find("p", class_="price_color").text
if "python" in title.lower():
print(f"{title} — {price}")
time.sleep(1)
🔥 Фишки:
- Мы фильтруем книги по ключевому слову.
- Не грузим всё подряд, только то, что нужно.
- На практике вы можете сохранять эти данные в CSV, Excel или базу данных.
🛑 Как не словить бан?
- Уважайте robots.txt (можно посмотреть по адресу https://site.com/robots.txt).
- Ставьте паузы между запросами.
- Не обрушивайте сайт за секунду — делайте задержки и ограничьте потоки.
- Меняйте User-Agent, не используйте Python-urllib/....
- Используйте прокси или TOR для серьёзных задач (но это уже другая история).
📦 Бонус: Библиотека для «человеческого» парсинга
Если устали писать requests.get() и soup.find(), гляньте Scrapy или requests_html. А если хочется автоматизации и взаимодействия с JS — вам к Playwright или [Selenium].
🎬 Финал
Парсинг — это одновременно и искусство, и наука. С одной стороны — это про технику. С другой — про уважение к чужому труду (сайтам) и внимательность к деталям.
Если вы поняли, как парсить аккуратно и эффективно — поздравляю, вы уже не бот, вы почти человек.