Python Web Scraping у 2026 році: httpx + BeautifulSoup + Playwright — коли використовувати який
Більшість навчальних посібників із веб-скрапінгу Python за 2018 рік досі рекомендують requests + BeautifulSoup. Частина requests чудова, але тепер є кращі значення за замовчуванням, і половина сучасного Інтернету відображає вміст у JavaScript, тому класичний стек мовчки повертає порожні сторінки.
Цей посібник охоплює дерево рішень 2026 року: коли httpx + BeautifulSoup є правильним (все ще понад 90% сайтів), коли звертатися до Playwright, як уникнути блокування та два правила, які зберігають ваш скребк як законним, так і етичним.
Дерево рішень в одному зображенні
Ось і все. Дев’яносто відсотків завдань копіювання є статичним HTML — класичний стек (перейменований) є правильним інструментом. Для решти потрібне виконання JS, а Playwright — сучасна відповідь.
Крок 1: httpx + BeautifulSoup (випадок 90%)
httpx — це додаткова заміна requests. Той самий API, плюс підтримка HTTP/2 і власна асинхронізація. BeautifulSoup не змінився порівняно з 2015 роком — вибір парсера має значення (lxml у 5 разів швидший за замовчування).
Ключові варіанти:
- `headers={"User-Agent": ...}` — завжди встановлювати справжній UA (контактна адреса ввічлива). UA за замовчуванням
httpxчасто блокується. - `timeout=10` — ніколи не робити необмежений запит; завислі з'єднання витік дескриптори файлів.
- `raise_for_status()` — рейзи на 4xx/5xx, щоб відмови були голосними, а не тихими.
- Синтаксичний аналізатор `"lxml" — у 5 разів швидший, ніж стандартний
html.parser, і більш поблажливий до неправильно сформованого HTML. - `soup.select("css-selector")` — розглядати скрапінг як "удавати, що ви використовуєте
document.querySelectorAllJavaScript". Селектори CSS – це зазвичай те, що ви хочете, а не API для перегляду дерева.
Крок 2: Режисер (коли JS рендерить вміст)
Багато сучасних SPA (React, Vue, Angular) доставляють порожній <div id="root"> і гідратують усе на стороні клієнта. httpx.get отримує порожню оболонку — потрібні дані завантажуються за допомогою fetch після завантаження сторінки.
Тест: httpx.get(url).text — шукайте потрібні дані. Якщо його немає, сайт потребує виконання JS.
Встановити: pip install playwright && playwright install chromium (завантаження з браузера становить ~150 МБ — це того варте один раз, боляче під час кожного запуску CI без кешування).
Вартість: Playwright у 10–50 разів повільніший, ніж httpx (завантаження сторінки + виконання JS + витрати на браузер). Досягайтеся до нього лише тоді, коли даних немає в статичному HTML.
Чотири способи заблокувати
Більшість систем захисту від подряпин спостерігають за цими чотирма відбитками пальців:
1. Відсутній/очевидний User-Agent
2. Відсутність затримки між запитами
Необроблені послідовні запити забивають сервер. Додайте затримку, пропорційну часу відповіді — якщо сторінка обслуговується 500 мс, зачекайте 500–2000 мс між запитами. asyncio.sleep(random.uniform(0.5, 2.0)).
3. Запит заборонених шляхів /robots.txt
Деякі сайти використовують robots.txt для легітимних сигналів швидкості — перевірте перед скануванням:
4. Невідповідність TLS / відбитка пальця браузера
Розширений захист від скрапінгу (Cloudflare, DataDome) для відбитків пальців вашого рукостискання TLS і середовища JS. httpx зовсім не схожий на Chrome на рівні TLS. Опції:
curl_cffi— бібліотека на основі імітації curl, яка імітує справжній TLS браузера.- Драматург — справжній TLS браузера за визначенням.
- Обертання проксі-серверів — ядерний варіант.
Для 99% випадків використання (неворожі сайти, помірний обсяг, не потрібен вхід) достатньо поваги httpx + real UA + затримка + robots.txt. Якщо ви скануєте сайти, захищені Cloudflare, вам потрібні справжні браузери або платні служби розблокування.
Обмеження швидкості (семафор + режим сну)
Для масового копіювання поєднайте asyncio.Semaphore (макс. одночасний) із asyncio.sleep (затримка на запит):
Обмеження на 5-10 одночасних + 500 мс-2 с затримки на запит тримає вас значно нижче того, що викликає сигнали обмеження швидкості на більшості сайтів.
Правові + етичні норми
1. Ознайомтеся з Загальними положеннями та умовами сайту. Багато хто прямо забороняє копіювання — ви все ще можете це робити (у більшості юрисдикцій Умови обслуговування є договірним, а не кримінальним правом), але ви берете на себе юридичний ризик. LinkedIn v. hiQ (2022) встановив, що збирання загальнодоступних даних не є порушенням CFAA в США, але носіння толстовки не робить вас невидимим.
2. Не збирайте особисті дані. GDPR / CCPA / все інше карає за збір особистої інформації без згоди. Якщо ви створюєте набір даних «співробітників компанії X», зупиніться.
Етичні доповнення, про які всі забувають:
- Надішліть справжню контактну адресу у вашій Україні. Якщо ваш бот створює проблеми, власник сайту повинен мати можливість надіслати вам електронний лист.
- Якщо ви кешуєте дані сайту, кешуйте агресивно — не вражайте їхні сервери під час кожного запуску.
- Віддавайте перевагу публічним API, навіть якщо вони платні. Дешевше, ніж юридичний ризик.
Зведення інструментів за 2026 рік
| Завдання | Дотягнутися до |
|---|---|
| Статичні HTML-сторінки | httpx + BeautifulSoup(html, "lxml") |
| SPA, відтворений JS | Пламатург (безголовий Хром) |
| Cloudflare / антибот | curl_cffi або Playwright + residential proxy |
| Великооб'ємне вишкрібання | httpx.AsyncClient + семафор + сон |
| Структуровані дані API | httpx.get + .json() — суп не потрібен |
Веб-скрапінг у 2026 році на 90% все ще складається з httpx + BeautifulSoup, плюс знання, коли перейти до справжнього браузера. Опануйте звички ввічливого збирання даних (справжній UA, семафор, сон, robots.txt), і ви побудуєте надійні канали даних без блокування чи судового позову.
Наступний крок: Data Science track містить 15 уроків про скрейпінг, ETL і pandas — ви побудуєте справжній наскрізний конвеєр від отримання HTTP до DataFrame до експорту CSV.