Веб краулеры используют для мониторинга цен, сбора новостей, анализа конкурентов, индексации сайтов поисковыми системами и других задач, где нужен структурированный сбор данных с веб ресурсов. В этой статье разбирается, как создать веб краулер на 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