Модуль 4: Збір даних з відкритих джерел

УРОК 4

Час60-90 хвилин
ПотрібноУроки 1-3, доступ до інтернету
РезультатСкрипт для збору даних з веб

Задача

OSINT (Open Source Intelligence) — розвідка з відкритих джерел. Інформація лежить у відкритому доступі: сайти, соцмережі, публічні бази. Проблема — її багато, і вручну збирати довго.

Python дозволяє автоматизувати збір: завантажити сторінку, витягнути потрібні дані, зберегти в таблицю. Один скрипт замість годин ручної роботи.

Що освоїмо

Нові терміни

HTTP-запитЗвернення до сервера. GET — отримати дані, POST — відправити. Як запит по радіо: викликаєш — отримуєш відповідь.
URLАдреса ресурсу в інтернеті. https://example.com/page — протокол, домен, шлях.
HTMLМова розмітки веб-сторінок. Теги (<div>, <p>, <a>) структурують контент.
ПарсингРозбір тексту для витягування потрібних частин. Як аналіз перехоплення: з потоку виділяємо суть.
APIApplication Programming Interface — спосіб отримати дані напряму, без HTML. Сервер віддає структуровані дані.
JSONJavaScript Object Notation — текстовий формат даних. Ключ: значення, як словник.

Встановлення бібліотек

pip install requests beautifulsoup4

requests — для HTTP-запитів. beautifulsoup4 — для парсингу HTML.

Частина 1: HTTP-запити

Базовий запит

import requests # GET-запит — отримуємо сторінку response = requests.get('https://httpbin.org/get') # Код відповіді: 200 = успіх, 404 = не знайдено, 403 = заборонено print(f"Статус: {response.status_code}") # Вміст сторінки (текст) print(response.text[:500]) # Перші 500 символів

Коди відповідей

200OK — запит успішний
301/302Redirect — сторінка переїхала
403Forbidden — доступ заборонено
404Not Found — сторінка не існує
429Too Many Requests — забагато запитів, заблоковано
500Server Error — помилка на сервері

Заголовки запиту

Сервери можуть блокувати запити без заголовків. User-Agent імітує браузер:

headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120.0.0.0' } response = requests.get('https://example.com', headers=headers)
⚠ Не роби багато запитів швидко — сервер може заблокувати. Додавай паузи: import time; time.sleep(1) — пауза 1 секунда.

Частина 2: Парсинг HTML

HTML — структурований текст з тегами. BeautifulSoup дозволяє шукати елементи за тегами, класами, атрибутами.

Приклад: витягування заголовків

from bs4 import BeautifulSoup import requests # Завантажуємо сторінку url = 'https://quotes.toscrape.com/' response = requests.get(url) # Створюємо об'єкт BeautifulSoup soup = BeautifulSoup(response.text, 'html.parser') # Знаходимо всі цитати (елементи з класом "quote") quotes = soup.find_all('div', class_='quote') for quote in quotes[:3]: # Перші 3 # Текст цитати text = quote.find('span', class_='text').get_text() # Автор author = quote.find('small', class_='author').get_text() print(f"{author}: {text[:50]}...")

Основні методи BeautifulSoup

soup.find('tag')Перший елемент з тегом
soup.find_all('tag')Всі елементи з тегом
soup.find('div', class_='name')Елемент з класом
soup.find('a', href=True)Посилання з атрибутом href
element.get_text()Текст всередині елемента
element['href']Значення атрибута
element.find_parent('div')Батьківський елемент

Частина 3: Робота з API

API — простіший спосіб отримати дані. Замість HTML сервер віддає JSON — структуровані дані, готові до обробки.

Приклад: публічне API

import requests # Публічне API з даними про країни url = 'https://restcountries.com/v3.1/name/ukraine' response = requests.get(url) # Перевіряємо успішність if response.status_code == 200: # Парсимо JSON data = response.json() # Автоматично перетворює в словник/список country = data[0] print(f"Країна: {country['name']['common']}") print(f"Столиця: {country['capital'][0]}") print(f"Населення: {country['population']:,}") print(f"Площа: {country['area']:,} км²") else: print(f"Помилка: {response.status_code}")

Структура JSON

# JSON — це вкладені словники та списки { "name": "Сокіл-1", "coordinates": { "lat": 48.4567, "lon": 35.0234 }, "events": ["contact", "movement", "fire"] } # Доступ до даних: data['name'] # "Сокіл-1" data['coordinates']['lat'] # 48.4567 data['events'][0] # "contact"

Практична задача

Збираємо цитати з сайту та зберігаємо в CSV.

Створи файл scrape_quotes.py:

import requests from bs4 import BeautifulSoup import csv import time # Налаштування base_url = 'https://quotes.toscrape.com' output_file = 'quotes.csv' # Список для збору даних all_quotes = [] # Збираємо з перших 3 сторінок for page in range(1, 4): url = f'{base_url}/page/{page}/' print(f"Завантажую: {url}") response = requests.get(url) if response.status_code != 200: print(f"Помилка: {response.status_code}") continue soup = BeautifulSoup(response.text, 'html.parser') quotes = soup.find_all('div', class_='quote') for quote in quotes: text = quote.find('span', class_='text').get_text() author = quote.find('small', class_='author').get_text() tags = [tag.get_text() for tag in quote.find_all('a', class_='tag')] all_quotes.append({ 'author': author, 'text': text, 'tags': '; '.join(tags) }) # Пауза між запитами — ввічливість до сервера time.sleep(1) # Зберігаємо в CSV with open(output_file, 'w', encoding='utf-8', newline='') as f: writer = csv.DictWriter(f, fieldnames=['author', 'text', 'tags']) writer.writeheader() writer.writerows(all_quotes) print(f"\nЗібрано {len(all_quotes)} цитат") print(f"Збережено у {output_file}")

Очікуваний результат

Завантажую: https://quotes.toscrape.com/page/1/ Завантажую: https://quotes.toscrape.com/page/2/ Завантажую: https://quotes.toscrape.com/page/3/ Зібрано 30 цитат Збережено у quotes.csv

Якщо не працює

ПомилкаРішення
ConnectionErrorНемає інтернету або сайт недоступний
TimeoutСервер не відповів вчасно. Додай timeout: requests.get(url, timeout=10)
403 ForbiddenСервер блокує. Додай User-Agent заголовок
429 Too Many RequestsЗабагато запитів. Збільш паузи між запитами
AttributeError: NoneTypeЕлемент не знайдено на сторінці. Перевір селектори
JSONDecodeErrorВідповідь не є валідним JSON. Перевір response.text

Робота з AI

Промпт для парсингу

Напиши Python-скрипт для збору даних з сайту [URL]. Потрібно витягнути: - Заголовки новин - Дати публікації - Посилання на повні статті Зберегти в CSV. Додай паузи між запитами. Використовуй requests та BeautifulSoup.

Промпт для API

Є API: https://api.example.com/data Документація: [посилання] Напиши скрипт, який: 1. Робить запит з параметрами date_from, date_to 2. Парсить JSON-відповідь 3. Фільтрує по полю status = "active" 4. Зберігає в CSV

Типові помилки AI

Етика та безпека

Чек-лист

☐ requests та beautifulsoup4 встановлено ☐ Базовий GET-запит працює ☐ Парсинг HTML витягує дані ☐ scrape_quotes.py збирає цитати ☐ quotes.csv створено з даними ☐ API-запит повертає JSON

Самостійна практика

Наступний урок

Урок 5: Робота з геоданими

Координати на карті, розрахунок відстаней, кластеризація точок.