Як парсувати дані з Python: повний гайд
Парсинг (scraping) — це процес автоматизованого збору даних з веб-сайтів, API або локальних файлів. Python є одним із найкращих інструментів для парсингу завдяки своїм бібліотекам, таким як BeautifulSoup
, Scrapy
, Selenium
та requests
.
У цій статті ми розглянемо:
- Як парсити дані з веб-сайтів
- Як використовувати
BeautifulSoup
іrequests
- Динамічний парсинг за допомогою
Selenium
- Парсинг через API
- Обробку отриманих даних
1. Парсинг HTML за допомогою BeautifulSoup
Що таке BeautifulSoup?
BeautifulSoup
— це бібліотека для обробки HTML та XML. Вона дозволяє легко витягати потрібні дані зі сторінок.
Встановлення бібліотеки
pip install beautifulsoup4 requests
Приклад парсингу веб-сторінки
Припустимо, нам потрібно отримати заголовки статей із веб-сайту.
import requests
from bs4 import BeautifulSoup
# URL сторінки, яку будемо парсити
url = "https://example.com"
# Завантажуємо HTML-код сторінки
response = requests.get(url)
# Створюємо об'єкт BeautifulSoup
soup = BeautifulSoup(response.text, "html.parser")
# Знаходимо всі заголовки h2
titles = soup.find_all("h2")
# Виводимо заголовки
for title in titles:
print(title.text)
Що тут відбувається?
- Використовуємо
requests.get(url)
для отримання HTML-коду сторінки. - Передаємо отриманий код у
BeautifulSoup
для обробки. - Використовуємо
.find_all("h2")
, щоб знайти всі заголовки<h2>
. - Виводимо текст із заголовків.
2. Як працювати з CSS-селекторами у BeautifulSoup
find_all()
дозволяє знайти теги за їхніми атрибутами або класами.
Приклад парсингу за CSS-класом
# Знаходимо всі елементи з класом "article-title"
titles = soup.find_all("h2", class_="article-title")
for title in titles:
print(title.text)
Приклад парсингу за унікальним ID
article = soup.find("div", id="post-123")
print(article.text)
Парсинг посилань (<a href>
):
links = soup.find_all("a")
for link in links:
print(link["href"]) # Виводимо URL
3. Динамічний парсинг за допомогою Selenium
Якщо сайт використовує JavaScript для завантаження контенту, requests
і BeautifulSoup
не допоможуть. У таких випадках використовується Selenium
.
Встановлення Selenium
pip install selenium webdriver-manager
Приклад використання Selenium для парсингу JavaScript-генерованої сторінки
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
# Запускаємо браузер
options = webdriver.ChromeOptions()
options.add_argument("--headless") # Запуск без графічного інтерфейсу
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=options)
# Відкриваємо сторінку
driver.get("https://example.com")
# Чекаємо, поки завантажиться потрібний елемент
driver.implicitly_wait(5)
# Отримуємо заголовки статей
titles = driver.find_elements(By.TAG_NAME, "h2")
# Виводимо текст заголовків
for title in titles:
print(title.text)
# Закриваємо браузер
driver.quit()
Що тут відбувається?
webdriver.Chrome()
запускає браузер.driver.get(url)
відкриває сторінку.driver.find_elements(By.TAG_NAME, "h2")
шукає всі заголовки<h2>
.driver.quit()
закриває браузер.
Selenium корисний для парсингу сайтів, які завантажують дані через JavaScript (наприклад, React, Vue, Angular).
4. Парсинг через API
Багато сайтів надають API для доступу до даних. Парсинг API — це більш надійний спосіб отримання інформації, ніж парсинг HTML.
Приклад парсингу JSON API
import requests
url = "https://jsonplaceholder.typicode.com/posts"
response = requests.get(url)
# Конвертуємо відповідь у JSON
data = response.json()
# Виводимо заголовки статей
for item in data:
print(item["title"])
Що тут відбувається?
- Відправляємо
GET
-запит на API. - Конвертуємо відповідь у
JSON
. - Перебираємо отримані дані та виводимо заголовки.
5. Як обійти блокування парсерів
Деякі сайти блокують автоматизовані запити. Ось кілька способів обійти це:
1. Використання заголовків User-Agent
headers = {"User-Agent": "Mozilla/5.0"}
response = requests.get("https://example.com", headers=headers)
2. Використання проксі
proxies = {"http": "http://123.123.123.123:8080"}
response = requests.get("https://example.com", proxies=proxies)
3. Додавання затримок між запитами
Щоб уникнути бану, додавайте випадкові затримки:
import time
import random
time.sleep(random.uniform(1, 3)) # Затримка від 1 до 3 секунд
6. Збереження отриманих даних
Після парсингу можна зберегти дані у CSV, JSON або базу даних.
Збереження у CSV
import csv
data = [("Title1", "https://example.com/1"), ("Title2", "https://example.com/2")]
with open("data.csv", "w", newline="") as file:
writer = csv.writer(file)
writer.writerow(["Title", "URL"]) # Заголовки стовпців
writer.writerows(data)
Збереження у JSON
import json
data = [{"title": "Title1", "url": "https://example.com/1"}]
with open("data.json", "w") as file:
json.dump(data, file, indent=4)
Висновок
Парсинг у Python — це потужний інструмент для збору та аналізу даних. Ми розглянули кілька підходів:
- BeautifulSoup для парсингу HTML.
- Selenium для роботи з динамічними сайтами.
- API-запити для отримання структурованих даних.
- Обхід захисту сайтів за допомогою заголовків, проксі та затримок.
Python надає безліч можливостей для автоматизації парсингу, тому все залежить від вашої задачі!