Оцініть цю публікацію!
[Усього: 0 Середнє значення: 0]
У сучасному світі, де дані стають все більш важливими, автоматизація збору та обробки інформації з різних джерел – критично важлива задача. Ручний збір даних, особливо з веб-сайтів, займає багато часу, схильний до помилок та не масштабується. Використання API часто є найкращим рішенням, але іноді потрібно “підтягнути” дані з веб-сторінок, які не надають API. Ця стаття покаже, як поєднати парсинг веб-сторінок, автоматизацію API, інтеграцію n8n для оркестрування процесів та обробку великих JSON структур, щоб створити надійну систему збору та звітності.
Практична реалізація та приклад коду
Ось як виглядає правильне рішення:
# Залежності:
# pip install beautifulsoup4 selenium requests n8n-workflows
from bs4 import BeautifulSoup
import requests
from selenium import webdriver
import json
import n8n_api
# 1. Парсинг веб-сторінки (BeautifulSoup + Selenium для динамічного контенту)
def scrape_website(url):
try:
# Спроба отримати HTML звичайним способом
response = requests.get(url)
response.raise_for_status() # Перевірка на помилки HTTP
soup = BeautifulSoup(response.content, 'html.parser')
except requests.exceptions.RequestException:
# Якщо звичайний спосіб не працює (динамічний контент), використовуємо Selenium
driver = webdriver.Chrome() # Переконайтеся, що у вас встановлено ChromeDriver
driver.get(url)
soup = BeautifulSoup(driver.page_source, 'html.parser')
driver.quit()
return soup
# 2. Витяг даних з HTML (приклад - витягування назв продуктів та цін)
def extract_data(soup):
products = []
for item in soup.find_all('div', class_='product'): # Замініть на відповідний CSS селектор
try:
name = item.find('h2', class_='product-name').text.strip()
price = float(item.find('span', class_='price').text.strip().replace('$', ''))
products.append({'name': name, 'price': price})
except AttributeError:
print(f"Помилка при витягуванні даних з елемента: {item}")
return products
# 3. Автоматизація API (відправка даних на сервер)
def send_data_to_api(data, api_endpoint):
headers = {'Content-Type': 'application/json'}
try:
response = requests.post(api_endpoint, json=data, headers=headers)
response.raise_for_status()
print(f"Дані успішно відправлені на API: {api_endpoint}")
return response.json()
except requests.exceptions.RequestException as e:
print(f"Помилка при відправці даних на API: {e}")
return None
# 4. Інтеграція n8n (запуск workflow для обробки та подальшої дії)
def trigger_n8n_workflow(data, workflow_id, api_key):
n8n = n8n_api.N8N(api_key)
n8n.trigger_workflow(workflow_id, data)
print(f"Workflow {workflow_id} запущено з даними: {data}")
# 5. Обробка великих JSON структур (наприклад, обчислення суми цін)
def process_large_json(data):
total_price = sum([product['price'] for product in data])
return total_price
# Головна функція
def main():
website_url = 'https://example.com/products' # Замініть на реальний URL
api_endpoint = 'https://your-api.com/data' # Замініть на реальний API endpoint
n8n_workflow_id = 'YOUR_N8N_WORKFLOW_ID'
n8n_api_key = 'YOUR_N8N_API_KEY'
soup = scrape_website(website_url)
products = extract_data(soup)
total_price = process_large_json(products)
# Відправка даних на API
api_response = send_data_to_api(products, api_endpoint)
# Запуск n8n workflow
trigger_n8n_workflow(products, n8n_workflow_id, n8n_api_key)
print(f"Загальна ціна продуктів: {total_price}")
if __name__ == "__main__":
main()
Розбір логіки та підводні камені
- Використання Selenium: Якщо веб-сайт використовує JavaScript для динамічного завантаження контенту, `requests` не зможе отримати повний HTML. У цьому випадку використовується `Selenium` для рендерингу сторінки в браузері та отримання відрендереного HTML. Не забудьте встановити та налаштувати `ChromeDriver`.
- Обробка помилок: Код містить блоки `try…except` для обробки помилок HTTP та помилок при витягуванні даних. Важливо ретельно обробляти помилки, щоб система була надійною.
- CSS селектори: CSS селектори, використані для витягування даних (`div.product`, `h2.product-name`, `span.price`), повинні відповідати структурі HTML веб-сайту. Перевіряйте їх за допомогою інструментів розробника в браузері.
- Інтеграція n8n: n8n дозволяє створювати складні workflows для обробки даних, надсилання email, інтеграції з іншими сервісами та багато іншого. У прикладі workflow запускається з даними, отриманими з веб-сайту.
- Безпека: Зберігайте API ключі та паролі в безпечному місці, наприклад, у змінних середовища. Не зберігайте їх безпосередньо в коді.
- Масштабування: Для великих проектів розгляньте використання асинхронного програмування (наприклад, `asyncio`) для паралельного виконання завдань та підвищення продуктивності.
- Обмеження швидкості (Rate Limiting): Веб-сайти можуть мати обмеження на кількість запитів. Дотримуйтесь правил `robots.txt` та реалізуйте затримки між запитами, щоб уникнути блокування.