← Назад к вопросам

Какие знаешь библиотеки для работы с веб парсингом?

2.0 Middle🔥 171 комментариев
#Python Core

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Библиотеки для веб-парсинга (Web Scraping) в Python

Web scraping - это автоматизированная загрузка и обработка данных с веб-сайтов. Python предоставляет мощные инструменты для этого.

Основные библиотеки

1. Requests

Простая и элегантная HTTP библиотека для загрузки веб-страниц.

import requests
from bs4 import BeautifulSoup

# Загрузка HTML страницы
response = requests.get('https://example.com')
print(response.status_code)  # 200
print(response.text)          # HTML содержимое
print(response.json())        # Если JSON ответ

# С параметрами
params = {'q': 'python', 'sort': 'stars'}
response = requests.get('https://api.github.com/search/repos', params=params)

# С заголовками (User-Agent)
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
}
response = requests.get('https://example.com', headers=headers)

# POST запрос
data = {'username': 'user', 'password': 'pass'}
response = requests.post('https://example.com/login', data=data)

# Timeout
response = requests.get('https://example.com', timeout=5)

Плюсы:

  • Простая и интуитивная API
  • Обработка cookies и sessions
  • Поддержка всех HTTP методов

Минусы:

  • Синхронные запросы (медленно для множества URL)
  • Не работает с JavaScript

2. BeautifulSoup

Парсинг HTML и XML документов.

from bs4 import BeautifulSoup
import requests

response = requests.get('https://example.com')
soup = BeautifulSoup(response.text, 'html.parser')

# Поиск элементов
title = soup.find('title')  # Первый элемент
print(title.text)

# Поиск всех элементов
links = soup.find_all('a')
for link in links:
    print(link.get('href'))

# Поиск по CSS селекторам
soup.select('div.class-name')
soup.select('#id-name')
soup.select('div > p')

# Навигация по дереву
parent = soup.find('div')
children = parent.find_all(recursive=False)  # Только прямые потомки

# Получение атрибутов
link = soup.find('a')
href = link.get('href')
text = link.get_text()

Плюсы:

  • Легко парсить HTML структуру
  • Поддержка CSS селекторов
  • Много методов навигации

Минусы:

  • Медленнее для больших документов
  • Не работает с JavaScript-rendered контентом

3. Selenium

Браузерная автоматизация для работы с динамическим контентом.

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support.expected_conditions import presence_of_element_located

# Инициализация браузера
driver = webdriver.Chrome()

try:
    driver.get('https://example.com')
    
    # Ожидание загрузки элемента
    wait = WebDriverWait(driver, 10)
    element = wait.until(
        presence_of_element_located((By.ID, 'dynamic-content'))
    )
    
    # Поиск элементов
    title = driver.find_element(By.CSS_SELECTOR, 'h1')
    links = driver.find_elements(By.TAG_NAME, 'a')
    
    # Взаимодействие
    button = driver.find_element(By.ID, 'submit')
    button.click()
    
    # Заполнение формы
    input_field = driver.find_element(By.NAME, 'email')
    input_field.send_keys('test@example.com')
    
    # Выполнение JavaScript
    result = driver.execute_script('return 2 + 2')
    
finally:
    driver.quit()

Плюсы:

  • Работает с JavaScript-rendered контентом
  • Поддержка взаимодействия (клики, ввод текста)
  • Полная автоматизация браузера

Минусы:

  • Медленнее (полный браузер)
  • Требует больше памяти и CPU
  • Сложнее запустить на серверах

4. Playwright (современный выбор)

Современная альтернатива Selenium.

import asyncio
from playwright.async_api import async_playwright

async def scrape_with_playwright():
    async with async_playwright() as p:
        browser = await p.chromium.launch()
        page = await browser.new_page()
        
        await page.goto('https://example.com')
        
        # Ожидание элемента
        await page.wait_for_selector('.dynamic-content')
        
        # Извлечение содержимого
        title = await page.text_content('h1')
        
        # Клик и навигация
        await page.click('a.next-page')
        await page.wait_for_load_state('networkidle')
        
        # Screenshot
        await page.screenshot(path='screenshot.png')
        
        content = await page.content()
        await browser.close()
        
        return content

# Запуск
content = asyncio.run(scrape_with_playwright())

Плюсы:

  • Асинхронные операции (быстро)
  • Поддержка множества браузеров
  • Лучше документация чем Selenium
  • Встроенная поддержка mobile

Минусы:

  • Еще относительно новая библиотека
  • Требует установки браузеров

5. Scrapy

Полнофункциональный фреймворк для веб-скрепинга.

import scrapy
from scrapy.crawler import CrawlerProcess

class QuotesSpider(scrapy.Spider):
    name = 'quotes'
    start_urls = ['http://quotes.toscrape.com']
    
    def parse(self, response):
        # Извлечение данных с помощью CSS селекторов
        for quote in response.css('div.quote'):
            yield {
                'text': quote.css('span.text::text').get(),
                'author': quote.css('small.author::text').get(),
                'tags': quote.css('div.tags a.tag::text').getall(),
            }
        
        # Переход на следующую страницу
        next_page = response.css('li.next a::attr(href)').get()
        if next_page is not None:
            yield response.follow(next_page, callback=self.parse)

# Запуск
process = CrawlerProcess({'USER_AGENT': 'Mozilla/5.0'})
process.crawl(QuotesSpider)
process.start()

Плюсы:

  • Производительность (асинхронная архитектура)
  • Встроенная обработка ошибок и retry
  • Пайплайны для обработки данных
  • Масштабируемость

Минусы:

  • Сложнее начать (крутая кривая обучения)
  • Overhead для простых задач
  • Требует больше кода для начального проекта

6. HTTPX

Асинхронный HTTP клиент (улучшенный requests).

import httpx
import asyncio

async def fetch_multiple_urls():
    urls = [
        'https://api.github.com/users/github',
        'https://api.github.com/users/google',
        'https://api.github.com/users/microsoft',
    ]
    
    async with httpx.AsyncClient() as client:
        # Параллельные запросы
        responses = await asyncio.gather(*[
            client.get(url) for url in urls
        ])
        
        for response in responses:
            print(response.json())

# Запуск
asyncio.run(fetch_multiple_urls())

Плюсы:

  • Асинхронность
  • Похожа на requests (легко мигрировать)
  • Встроенная поддержка HTTP/2

7. lxml

Быстрый парсер XML/HTML на C.

from lxml import html
import requests

response = requests.get('https://example.com')
tree = html.fromstring(response.content)

# XPath селекторы
titles = tree.xpath('//h1/text()')
links = tree.xpath('//a/@href')

# CSS селекторы
links = tree.cssselect('a')

Плюсы:

  • Очень быстрый (на C)
  • Поддержка XPath
  • Хороший для больших документов

Минусы:

  • Требует компиляции (могут быть проблемы на Windows)
  • Менее удобный API чем BeautifulSoup

Сравнение библиотек

БиблиотекаСкоростьJavaScriptПростотаМасштабируемость
requestsОчень быстроНетВысокаяНет
BeautifulSoupБыстроНетВысокаяСредняя
HTTPXОчень быстроНетВысокаяДа
SeleniumМедленноДаСредняяНет
PlaywrightБыстроДаСредняяСредняя
ScrapyОчень быстроНетНизкаяДа
lxmlЭкстра быстроНетНизкаяСредняя

Выбор инструмента

Для простого парсинга:

requests + BeautifulSoup

Для API:

requests или httpx

Для JavaScript-heavy сайтов:

Playwright или Selenium

Для больших проектов (crawlers):

Scrapy

Для максимальной производительности:

httpx (асинхронные запросы) + lxml (парсинг)

Лучшие практики

# 1. Используй User-Agent
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
}

# 2. Соблюдай robots.txt
# 3. Добавляй задержки между запросами
import time
time.sleep(random.uniform(1, 3))

# 4. Обрабатывай ошибки
try:
    response = requests.get(url, timeout=5)
except requests.RequestException as e:
    print(f'Ошибка: {e}')

# 5. Для асинхронных запросов используй aiohttp или httpx
# 6. Кэшируй результаты (requests-cache)

Итог

Правильный выбор библиотеки зависит от задачи:

  • Простые HTTP запросы → requests
  • HTML парсинг → BeautifulSoup
  • JavaScript контент → Playwright
  • Больших масштабах → Scrapy

Python - король веб-скрепинга благодаря этому обилию инструментов.

Какие знаешь библиотеки для работы с веб парсингом? | PrepBro