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

Как автоматизировать сбор данных на сайте c JavaScript?

2.0 Middle🔥 41 комментариев
#Другое

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

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

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

Автоматизация сбора данных на сайтах с JavaScript

Для разработчика на Python есть несколько подходов к автоматизации сбора данных на JavaScript-сайтах. Выбор зависит от сложности сайта и типа данных.

1. Использование браузерной автоматизации (Selenium, Playwright, Puppeteer)

Selenium + Python

Классический и надежный инструмент для автоматизации браузера:

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

class WebScraper:
    def __init__(self):
        self.driver = webdriver.Chrome()
    
    def scrape_js_site(self, url: str) -> list:
        self.driver.get(url)
        
        # Ожидание загрузки динамических элементов
        wait = WebDriverWait(self.driver, 10)
        elements = wait.until(
            EC.presence_of_all_elements_located((By.CLASS_NAME, "product-item"))
        )
        
        # Сбор данных
        data = [elem.text for elem in elements]
        self.driver.quit()
        return data

scraper = WebScraper()
results = scraper.scrape_js_site("https://example.com")

Playwright (современный и быстрый)

import asyncio
from playwright.async_api import async_playwright

async def scrape_with_playwright(url: str) -> list:
    async with async_playwright() as p:
        browser = await p.chromium.launch(headless=True)
        page = await browser.new_page()
        await page.goto(url)
        
        # Ожидание элементов
        await page.wait_for_selector(".product-item")
        
        # Сбор данных через eval
        data = await page.evaluate(
            """() => {
                return Array.from(document.querySelectorAll(.product-item))
                    .map(el => ({
                        title: el.querySelector(.title).textContent,
                        price: el.querySelector(.price).textContent
                    }))
            }"""
        )
        
        await browser.close()
        return data

results = asyncio.run(scrape_with_playwright("https://example.com"))

2. Puppeteer через pyppeteer (Python обёртка)

import asyncio
from pyppeteer import launch

async def scrape_with_pyppeteer(url: str) -> dict:
    browser = await launch(headless=True)
    page = await browser.newPage()
    await page.goto(url)
    
    # Дождаться загрузки и собрать данные
    await page.waitForSelector(".content")
    content = await page.evaluate(
        "() => document.querySelector(body).innerText"
    )
    
    await browser.close()
    return {"content": content}

3. Обработка AJAX запросов (Network интерцепция)

Если сайт загружает данные через API:

from playwright.sync_api import sync_playwright

def scrape_api_calls(url: str) -> list:
    with sync_playwright() as p:
        browser = p.chromium.launch(headless=True)
        page = browser.new_page()
        
        # Перехват сетевых запросов
        responses = []
        page.on("response", lambda resp: responses.append(resp) 
                if "api" in resp.url else None)
        
        page.goto(url)
        page.wait_for_load_state("networkidle")
        
        # Анализ API ответов
        for response in responses:
            if response.ok:
                data = response.json()
                print(f"API: {response.url} -> {data}")
        
        browser.close()

4. Обращение напрямую к API (если возможно)

Лучший вариант — найти и использовать API сайта:

import requests
import json

class APICollector:
    def __init__(self, api_url: str, headers: dict = None):
        self.api_url = api_url
        self.headers = headers or {}
    
    def fetch_data(self, params: dict = None) -> list:
        response = requests.get(self.api_url, headers=self.headers, params=params)
        response.raise_for_status()
        return response.json()

# Пример
collector = APICollector(
    "https://api.example.com/products",
    headers={"User-Agent": "Mozilla/5.0..."}
)
data = collector.fetch_data({"page": 1, "limit": 100})

5. BeautifulSoup + requests для простых случаев

from bs4 import BeautifulSoup
import requests

def scrape_rendered_html(url: str) -> list:
    response = requests.get(url)
    soup = BeautifulSoup(response.content, "html.parser")
    
    products = []
    for item in soup.find_all("div", class_="product"):
        products.append({
            "title": item.find("h2").text.strip(),
            "price": item.find("span", class_="price").text.strip()
        })
    
    return products

Сравнение подходов

ИнструментСкоростьПростотаДля JS сайтовСтоимость ресурсов
BeautifulSoupОчень быстроПростаяНет ❌Низкие
SeleniumМедленноСложнаяДа ✅Высокие
PlaywrightБыстроСредняяДа ✅Средние
PyppeteerБыстроСредняяДа ✅Средние
API DirectОчень быстроПростаяДа ✅Низкие

Best Practices

  • Respect robots.txt — проверяй разрешенные URL
  • User-Agent — выдавай себя за обычный браузер
  • Rate limiting — не перегружай сервер частыми запросами
  • Кэширование — сохраняй данные локально
  • Error handling — обрабатывай сетевые ошибки
  • Headless mode — для экономии ресурсов

Заключение

Для Python-разработчика лучшие варианты — Playwright (современный и быстрый) или Selenium (проверенный и стабильный). Всегда сначала ищи API сайта — это быстрее и надёжнее любой браузерной автоматизации.