Як парсувати дані з Python: повний гайд

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)

Що тут відбувається?

  1. Використовуємо requests.get(url) для отримання HTML-коду сторінки.
  2. Передаємо отриманий код у BeautifulSoup для обробки.
  3. Використовуємо .find_all("h2"), щоб знайти всі заголовки <h2>.
  4. Виводимо текст із заголовків.

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"])

Що тут відбувається?

  1. Відправляємо GET-запит на API.
  2. Конвертуємо відповідь у JSON.
  3. Перебираємо отримані дані та виводимо заголовки.

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 — це потужний інструмент для збору та аналізу даних. Ми розглянули кілька підходів:

  1. BeautifulSoup для парсингу HTML.
  2. Selenium для роботи з динамічними сайтами.
  3. API-запити для отримання структурованих даних.
  4. Обхід захисту сайтів за допомогою заголовків, проксі та затримок.

Python надає безліч можливостей для автоматизації парсингу, тому все залежить від вашої задачі!