ua
English
Español
中國人
Tiếng Việt
Deutsch
Português
Français
भारतीय
Türkçe
한국인
Italiano
Gaeilge
اردو
Indonesia
Polski Веб-краулери використовуються для моніторингу цін, збору новин, аналітики конкурентів, індексації сайтів пошуковими системами та інших завдань, де потрібен структурований збір даних з інтернет-ресурсів. У цій статті розглянуто як створити веб-краулер на Python з нуля, починаючи від планування проєкту і вибору технологій, до налаштування середовища та збереження зібраних даних. Завдяки цьому матеріалу можна отримати базові навички, які стануть фундаментом для більш складних і масштабних проєктів у майбутньому.
Веб-краулер — це програма, яка автоматично обходить веб-сторінки і збирає з них інформацію. Принцип роботи полягає у тому, що краулер надсилає HTTP-запити до сайту, отримує HTML-код сторінок, а потім обробляє його для виділення потрібних даних. Після цього він переходить за внутрішніми посиланнями і повторює процес, поки не буде досягнуто визначених меж або умов зупинки. Важливо розуміти, що цей процес відрізняється від скрапінгу. Детальніше різницю можна подивитися у матеріалі Веб-скрапінг vs веб-краулінг.
Такі програми активно використовуються для моніторингу цін в e-commerce, збору контактів і оголошень, створення баз даних для аналітики та індексації контенту для пошукових систем. Саме тут ефективно застосовується підхід створення власного веб-краулера, який дозволяє налаштувати програму під конкретні потреби, контролювати частоту запитів і вибірку інформації.
Перед початком розробки важливо визначити ключові параметри краулера, щоб уникнути типових проблем і забезпечити ефективну роботу.
Добре спланований краулер працює стабільно, ефективно використовує ресурси та забезпечує якісні результати.
Щоб створити веб-краулер допоможуть різні мови програмування такі як, Python, Java та PHP. Python відрізняється простотою синтаксису, наявністю великої кількості бібліотек для роботи з HTTP-запитами та парсингу HTML (requests, BeautifulSoup, lxml). Java підходить для масштабованих проєктів і корпоративного використання, а PHP частіше застосовується у веб-розробці, але менш зручний для побудови автономних краулерів. Для старту оптимально обирати Python, оскільки це дозволяє швидко реалізувати і протестувати базовий функціонал.
Першим кроком є встановлення Python. Зробити це можна перейшовши на офіційний веб-сайт. Далі необхідно підключити основні бібліотеки: requests для відправки HTTP-запитів, BeautifulSoup для парсингу HTML:
pip install requests beautifulsoup4
Варто організувати структуру проєкту: окремі файли для основного коду, налаштувань та утиліт. Це спрощує підтримку та масштабування коду в майбутньому.
Перший краулер може складатися з трьох основних частин: надсилання запиту, обробка HTML та перехід за посиланнями.
from bs4 import BeautifulSoup
import time
import random
# Налаштування
url = "https://quotes.toscrape.com/" # Ось тут замініть на свій сайт
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
"(KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36"
}
timeout = 5 # час очікування відповіді сервера
max_retries = 3 # максимальна кількість повторів при помилках
# Ось тут можна додати свій проксі, якщо потрібно
proxies = {
"http": "http://username:password@proxyserver:port",
"https": "https://username:password@proxyserver:port"
}
# Функція для перевірки доступу через robots.txt
def can_crawl(base_url, path="/"):
try:
robots_url = base_url.rstrip("/") + "/robots.txt"
r = requests.get(robots_url, headers=headers, timeout=timeout)
if r.status_code == 200 and f"Disallow: {path}" in r.text:
print(f"Ресурс {path} заборонений для краулінгу robots.txt")
return False
except requests.RequestException:
# Якщо robots.txt недоступний, продовжуємо
pass
return True
# Основний код
if can_crawl(url):
for attempt in range(max_retries):
try:
response = requests.get(url, headers=headers, timeout=timeout, proxies=proxies)
response.raise_for_status()
soup = BeautifulSoup(response.text, 'lxml')
# Збір посилань
links = [a['href'] for a in soup.find_all('a', href=True)] # тут можна змінити селектор
print("Знайдено посилання:", links)
# Затримка між запитами для більш реалістичної поведінки
time.sleep(random.uniform(3, 7)) # краще, ніж фіксовані 5 секунд
break # якщо все успішно, виходимо з циклу повторів
except requests.RequestException as e:
print(f"Помилка при запиті (спроба {attempt+1}): {e}")
wait = 2 ** attempt
print(f"Очікування {wait} секунд перед повтором...")
time.sleep(wait)
else:
print("Краулер не може обробляти цей ресурс через robots.txt")
Цей код демонструє базовий принцип роботи: обробку запиту, парсинг HTML та збір посилань.
Для багатосторінкових сайтів необхідно реалізувати цикл, який проходить через усі сторінки. Приклад:
for page in range(1, 6):
url = f"https://google.com/page/{page}"
response = requests.get(url)
soup = BeautifulSoup(response.text, 'lxml')
# обробка даних
Етична робота краулера передбачає перевірку файлу robots.txt сайту та дотримання його правил. Крім того, слід робити затримки між запитами, щоб не навантажувати сервер. Наприклад, через модуль time.sleep() можна вводити паузи між обробкою сторінок.
import time
from bs4 import BeautifulSoup
for page in range(1, 6):
url = f"https://google.com/page/{page}"
response = requests.get(url)
soup = BeautifulSoup(response.text, 'lxml')
# обробка даних
time.sleep(5) # вказуємо секунди
Отримані дані можна зберегти у зручному форматі, наприклад, CSV або JSON. Приклад збереження списку посилань:
import json
data = {"links": links}
with open("links.json", "w", encoding="utf-8") as f:
json.dump(data, f, ensure_ascii=False, indent=4)
Після проходження всіх кроків створено базовий веб-краулер, який можна розвивати для складніших задач. Можна масштабувати код, додавати підтримку проксі, інтегрувати обробку великої кількості сторінок або перейти до більш просунутих фреймворків на кшталт Scrapy для комплексного збору даних.
Коментарі: 0