← Назад к вопросам
Как автоматизировать сбор данных на сайте 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 сайта — это быстрее и надёжнее любой браузерной автоматизации.