Добавить в корзинуПозвонить
Найти в Дзене
Анастасия Софт

Как не словить бан за BeautifulSoup: парсим сайты по-человечески

— «Парсинг — это просто!». Сказал новичок и ушёл в бан на первой странице. В этой статье разберёмся, как грамотно парсить HTML-страницы с помощью Python, не нарушая правила хорошего тона (и robots.txt), не выжигая сервера до тла и не ловя блокировку по IP. Мы будем использовать requests, BeautifulSoup, кастомные заголовки, rate-limiting и даже слегка поиграем с пагинацией. Всё будет по-человечески, с юмором, комментариями и примерами — от простого к профессиональному. Проще говоря, парсинг — это способ достать данные с веб-страницы, которую обычно просматривает человек в браузере. Но мы-то хитрые: берём Python, отправляем запрос и вытаскиваем нужные куски HTML. pip install requests beautifulsoup4 Давайте начнем с базового примера. Допустим, хотим вытащить заголовок статьи с блога. import requests
from bs4 import BeautifulSoup
# Отправляем GET-запрос
response = requests.get("https://realpython.com/beautiful-soup-web-scraper-python/")
# Проверяем, всё ли прошло ок
print(response.status
Оглавление

— «Парсинг — это просто!». Сказал новичок и ушёл в бан на первой странице.

В этой статье разберёмся, как грамотно парсить 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].

🎬 Финал

Парсинг — это одновременно и искусство, и наука. С одной стороны — это про технику. С другой — про уважение к чужому труду (сайтам) и внимательность к деталям.

Если вы поняли, как парсить аккуратно и эффективно — поздравляю, вы уже не бот, вы почти человек.

Как не словить бан за BeautifulSoup: парсим сайты по-человечески
Как не словить бан за BeautifulSoup: парсим сайты по-человечески