Парсинг сайтов на Python: полное руководство 2026

Парсеры Python Web Scraping

Что такое веб-парсинг

Веб-парсинг (web scraping) — это автоматизированный процесс извлечения данных с веб-сайтов. Парсер загружает HTML страницы, анализирует их структуру и извлекает нужную информацию: цены, телефоны, адреса, новости и другие данные.

Парсинг используется в множестве сценариев: мониторинг цен конкурентов, сбор контактов для маркетинга, автоматизация заполнения данных, исследование рынка и многое другое.

В этом гайде мы разберём разные техники парсинга от простых до продвинутых, с примерами кода и лучшими практиками.

Простой парсинг с requests и BeautifulSoup

Начнём с самого простого случая — парсинг статических HTML сайтов. Установите нужные библиотеки:

pip install requests beautifulsoup4

Пример парсинга цен товаров:

import requests
from bs4 import BeautifulSoup

# Загружаем страницу
url = 'https://example-store.com/products'
response = requests.get(url)
html = response.text

# Парсим HTML
soup = BeautifulSoup(html, 'html.parser')

# Находим все товары
products = soup.find_all('div', class_='product-card')

for product in products:
    name = product.find('h3', class_='product-name').text
    price = product.find('span', class_='price').text
    url = product.find('a')['href']
    
    print(f"Название: {name}")
    print(f"Цена: {price}")
    print(f"URL: {url}")
    print("---")

Другой пример — парсинг новостей:

import requests
from bs4 import BeautifulSoup
from datetime import datetime

def parse_news(url):
    response = requests.get(url)
    soup = BeautifulSoup(response.content, 'html.parser')
    
    articles = []
    for item in soup.find_all('article'):
        title = item.find('h2').text.strip()
        link = item.find('a')['href']
        date = item.find('time')['datetime']
        
        articles.append({
            'title': title,
            'link': link,
            'date': date
        })
    
    return articles

news = parse_news('https://example-news.com')
for article in news:
    print(f"{article['date']}: {article['title']}")
    print(f"   Ссылка: {article['link']}\n")

Парсинг динамических сайтов с Selenium

Некоторые сайты загружают контент через JavaScript. Для парсинга таких сайтов нужно использовать браузер автоматизацию (Selenium или Playwright).

pip install selenium

Скачайте ChromeDriver с официального сайта и поместите в PATH.

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from bs4 import BeautifulSoup
import time

# Инициализируем браузер
options = webdriver.ChromeOptions()
options.add_argument('--headless')  # Без окна браузера
driver = webdriver.Chrome(options=options)

# Загружаем страницу
url = 'https://example-dynamic.com'
driver.get(url)

# Ждём загрузки элементов
wait = WebDriverWait(driver, 10)
items = wait.until(EC.presence_of_all_elements_located((By.CLASS_NAME, 'item')))

# Парсим страницу
soup = BeautifulSoup(driver.page_source, 'html.parser')
for item in soup.find_all('div', class_='item'):
    print(item.text)

driver.quit()

Альтернативно можно использовать Playwright (современнее и быстрее):

pip install playwright
playwright install

Обход защиты и капчи

Многие сайты защищены от парсинга. Вот техники обхода:

1. User-Agent и заголовки

import requests

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
}

response = requests.get(url, headers=headers)

2. Обработка Rate Limiting

import time
import requests

urls = [...list of urls...]

for url in urls:
    response = requests.get(url)
    time.sleep(2)  # Ждим 2 секунды между запросами

3. Обработка Cookie и сессий

session = requests.Session()
session.headers.update({'User-Agent': '...'})

# Первый запрос для получения cookie
session.get('https://example.com')

# Второй запрос с уже установленными cookie
response = session.get('https://example.com/data')

Для обхода капчи существуют сервисы вроде 2Captcha или Anti-Captcha, но это дороговато для массового парсинга. Лучше просто быть вежливым к серверам.

Работа с прокси

Если вам нужна ротация IP адресов, используйте прокси:

import requests

proxy_list = [
    'http://proxy1.com:8080',
    'http://proxy2.com:8080',
    'http://proxy3.com:8080'
]

def get_proxy():
    import random
    return random.choice(proxy_list)

proxies = {
    'http': get_proxy(),
    'https': get_proxy()
}

response = requests.get(url, proxies=proxies)

Для автоматизации можно использовать API прокси сервисов:

# Например, с использованием rotating proxy
proxies = {
    'http': 'http://user:pass@rotating-proxy.com:8080',
    'https': 'http://user:pass@rotating-proxy.com:8080'
}

response = requests.get(url, proxies=proxies)

Сохранение данных

Сохранение в JSON

import json

data = [
    {'name': 'Item 1', 'price': '1000'},
    {'name': 'Item 2', 'price': '2000'}
]

with open('data.json', 'w', encoding='utf-8') as f:
    json.dump(data, f, ensure_ascii=False, indent=2)

Сохранение в CSV/Excel

import csv

data = [
    ['Name', 'Price', 'URL'],
    ['Item 1', '1000', 'https://...'],
    ['Item 2', '2000', 'https://...']
]

with open('data.csv', 'w', newline='', encoding='utf-8') as f:
    writer = csv.writer(f)
    writer.writerows(data)

Сохранение в БД

import sqlite3

conn = sqlite3.connect('products.db')
cursor = conn.cursor()

cursor.execute('''CREATE TABLE IF NOT EXISTS products 
                 (id INTEGER PRIMARY KEY, name TEXT, price TEXT)''')

cursor.execute("INSERT INTO products (name, price) VALUES (?, ?)", 
              ('Item 1', '1000'))

conn.commit()
conn.close()

Антибан меры и лучшие практики

  • Задерживайте запросы — используйте случайные задержки между запросами (1-5 секунд)
  • Меняйте User-Agent — используйте список разных браузеров
  • Ротируйте прокси — не делайте все запросы с одного IP
  • Уважайте robots.txt — не парсьте запрещённые пути
  • Используйте сессии — переиспользуйте соединения
  • Обрабатывайте ошибки — не падайте при ошибке, логируйте и продолжайте
  • Мониторьте блокировки — проверяйте HTTP коды ответов

Хороший пример полного парсера:

import requests
from bs4 import BeautifulSoup
import time
import random
import logging

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

def parse_website(base_url, pages=5):
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'}
    results = []
    
    for page in range(1, pages + 1):
        try:
            url = f"{base_url}?page={page}"
            logger.info(f"Парсим страницу {page}...")
            
            response = requests.get(url, headers=headers, timeout=10)
            response.raise_for_status()
            
            soup = BeautifulSoup(response.content, 'html.parser')
            items = soup.find_all('div', class_='item')
            
            for item in items:
                name = item.find('h3').text.strip()
                price = item.find('span', class_='price').text.strip()
                results.append({'name': name, 'price': price})
            
            time.sleep(random.uniform(2, 5))  # Случайная задержка
            
        except requests.RequestException as e:
            logger.error(f"Ошибка при парсинге {url}: {e}")
            continue
    
    return results

data = parse_website('https://example.com')
print(f"Спарсено {len(data)} товаров")

Заключение

Парсинг — мощный инструмент для автоматизации работы с данными в интернете. Мы разобрали базовый парсинг с BeautifulSoup, продвинутый парсинг с Selenium, обход защиты и лучшие практики.

Помните: с большой силой приходит большая ответственность. Парсьте ответственно и уважайте правила сайтов.

Если вам нужен парсер для конкретного сайта или проекта автоматизации, обратитесь к нам. Наша команда создаст надёжное решение.

Заказать парсер

Nexora разработает парсер для вашего проекта. Любая сложность — от простого парсинга до работы с JavaScript и обхода защиты.

Заказать парсер