Что такое веб-парсинг
Веб-парсинг (web scraping) — это автоматизированный процесс извлечения данных с веб-сайтов. Парсер загружает HTML страницы, анализирует их структуру и извлекает нужную информацию: цены, телефоны, адреса, новости и другие данные.
Парсинг используется в множестве сценариев: мониторинг цен конкурентов, сбор контактов для маркетинга, автоматизация заполнения данных, исследование рынка и многое другое.
В этом гайде мы разберём разные техники парсинга от простых до продвинутых, с примерами кода и лучшими практиками.
Правовые и этические аспекты
Перед парсингом сайта важно понимать юридические и этические границы:
- Проверьте файл robots.txt сайта (domain.com/robots.txt)
- Почитайте Terms of Service (условия использования)
- Не перегружайте сервер частыми запросами
- Используйте нормальный User-Agent
- Не скачивайте копирайтные материалы без разрешения
- В некоторых странах парсинг без разрешения может быть запрещён
Когда парсинг разрешён, используйте его ответственно, не создавая нагрузку на сервер.
Простой парсинг с 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 и обхода защиты.
Заказать парсер