Если вы работаете с закрытыми или внутренними данными - корпоративной сетью, локальным сайтом, защищённым API или частным порталом - стандартные поисковые системы вам не помогут. Нужен свой краулер. Не какой-нибудь готовый инструмент из интернета, а тот, который работает именно в вашем пространстве. И да, его можно написать на Python за один вечер.
Почему именно Python?
Python - это не просто язык для новичков. Это язык, который умеет работать с реальными данными. У него есть библиотеки, которые делают краулинг простым: requests - для HTTP-запросов, библиотека для отправки HTTP-запросов и получения ответов от веб-серверов, BeautifulSoup - для парсинга HTML, lxml - для быстрого анализа XML и HTML, и urllib - встроенная альтернатива без внешних зависимостей. Они работают вместе, как инструменты в гараже: один подтягивает данные, другой чистит их, третий сохраняет.
В отличие от Java или C#, где на настройку краулера может уйти день, на Python вы можете запустить первый рабочий скрипт за 30 минут. Это не теория - это практика. Я видел, как команда из трёх человек в Казани за два дня написала краулер для внутреннего портала компании, который собирал 12 000 страниц в день. Без облачных сервисов. Без платных решений. Просто Python и несколько строк кода.
Что значит "приватное пространство"?
Приватное пространство - это не то, что скрыто за логином. Это то, что вообще не доступно извне. Например:
- Внутренний сайт компании, доступный только через корпоративную сеть
- Локальный веб-сервер на вашем ноутбуке
- API с токеном доступа, который выдаётся только сотрудникам
- PDF-документы, размещённые на закрытом FTP
- Страницы, требующие JavaScript-инициализации (например, React-приложения)
Тут не помогут Googlebot или Bingbot. Они даже не знают, что такое ваш сервер. Вам нужно самому сходить туда, авторизоваться, пройти капчу, дождаться загрузки JS, а потом начать собирать данные. Это и есть задача краулера для приватного пространства.
Как он работает: пошагово
Вот как выглядит простой краулер, который работает в приватной среде:
- Установите нужные библиотеки:
pip install requests beautifulsoup4 lxml - Создайте сессию - это как ваша "входная карта". Сессия запомнит куки, заголовки, токены.
- Авторизуйтесь: отправьте POST-запрос с логином и паролем на форму входа.
- Перейдите на целевую страницу: используйте ту же сессию, чтобы получить доступ к защищённому контенту.
- Найдите ссылки: используйте BeautifulSoup, чтобы вытащить все
<a href="...">из HTML. - Сканируйте рекурсивно: для каждой найденной ссылки повторите шаги 4-5, но не зацикливайтесь.
- Сохраняйте данные: в JSON, CSV или базу данных.
Пример минимального кода:
import requests
from bs4 import BeautifulSoup
session = requests.Session()
# Логинимся
login_data = {"username": "your_login", "password": "your_pass"}
session.post("https://internal-site.com/login", data=login_data)
# Заходим на страницу
response = session.get("https://internal-site.com/dashboard")
soup = BeautifulSoup(response.content, "lxml")
# Ищем все ссылки
links = soup.find_all("a", href=True)
for link in links:
print(link["href"])
Этот код не идеален, но он работает. И его легко доработать.
Как избежать банов и ошибок
Даже в приватной сети есть правила. Если вы будете слать 100 запросов в секунду - администраторы заметят. Вот что помогает:
- Добавьте задержку:
time.sleep(1)между запросами. Даже полсекунды снижает нагрузку. - Используйте User-Agent: имитируйте браузер. Например,
session.headers["User-Agent"] = "Mozilla/5.0 (Windows NT 10.0; Win64; x64)" - Обрабатывайте ошибки: не падайте, если страница не отвечает. Используйте
try/exceptи повторные попытки (не более 3). - Не ходите по одинаковым URL: сохраняйте уже посещённые ссылки в множестве (
set()), чтобы избежать зацикливания.
Если сайт использует JavaScript - Selenium - это ваш следующий шаг. Он запускает настоящий браузер (Chrome или Firefox) и ждёт, пока страница полностью загрузится. Это медленнее, но надёжнее. Например, если вы хотите собрать данные из внутреннего CRM-интерфейса, где всё рендерится через React - без Selenium вы ничего не получите.
Где хранить собранные данные?
Собрать - это только половина дела. Нужно, чтобы данные были полезны. Вот три простых варианта:
- CSV: для таблиц, где нужно быстро открыть в Excel. Подходит для небольших объёмов (до 100 тыс. строк).
- JSON: если данные структурированы (например, продукты, документы, статьи). Легко читается программами.
- SQLite: лёгкая база данных, которая работает без сервера. Отлично подходит для хранения 100 тыс.+ страниц с метаданными: URL, заголовок, дата, текст.
Пример сохранения в SQLite:
import sqlite3
conn = sqlite3.connect("crawler.db")
c = conn.cursor()
c.execute("CREATE TABLE IF NOT EXISTS pages (url TEXT, title TEXT, content TEXT)")
c.execute("INSERT INTO pages VALUES (?, ?, ?)", (url, title, content))
conn.commit()
conn.close()
Это не требует настройки PostgreSQL или MongoDB. Работает на любом ноутбуке.
Что делать, если сайт защищён капчей или 2FA?
Если вы работаете в корпоративной среде - капча обычно не используется. Но если она есть - есть два пути:
- Решать вручную: остановите краулер, введите капчу в браузере, возобновите. Не идеально, но работает для небольших задач.
- Использовать API-ключи: если у вас есть доступ к API (например, через OAuth 2.0), используйте его вместо веб-краулинга. Это быстрее, надёжнее и легально.
Если вы не можете обойти 2FA - значит, вы не должны это делать. Это не техническая проблема. Это политическая. Убедитесь, что у вас есть разрешение от ИТ-отдела. Без него даже самый умный краулер - это нарушение.
Какие ещё инструменты стоит рассмотреть?
Python - не единственный выбор, но он самый быстрый для старта. Вот что ещё можно использовать:
| Инструмент | Скорость | Поддержка JS | Сложность | Лучше для |
|---|---|---|---|---|
| Python + requests + BeautifulSoup | Высокая | Нет | Низкая | Статичные сайты, API |
| Python + Selenium | Средняя | Да | Средняя | Динамические интерфейсы (React, Angular) |
| Scrapy | Высокая | Частично | Высокая | Большие проекты, масштабирование |
| Node.js + Puppeteer | Средняя | Да | Средняя | Команды, уже использующие JavaScript |
Для начинающих - Python и requests. Для сложных задач - Selenium. Для масштабирования - Scrapy. Выбирайте по задаче, а не по моде.
Почему это работает в реальности
В Казани есть компания, которая занимается производством деталей для нефтепереработки. У них был внутренний сайт с 8000 технических чертежей. Никто не знал, где что лежит. Инженеры тратили по 2 часа в день на поиск. Мы написали краулер на Python - он за 12 часов прошёл все страницы, собрал названия, описания и ключевые слова. Потом выгрузил всё в Excel. Теперь любой инженер ищет по ключевому слову - например, "фланец 300 psi" - и находит нужный чертёж за 5 секунд.
Это не магия. Это просто правильный инструмент, применённый к конкретной проблеме.
Что дальше?
После того как вы собрали данные - вы можете:
- Создать внутренний поисковик
- Сравнить документы на дубликаты
- Автоматически генерировать отчёты
- Связать данные с CRM или ERP
- Обнаружить устаревшие ссылки и сломанные файлы
Краулер - это не конечная цель. Это первый шаг к автоматизации. Как только вы начнёте собирать данные, вы увидите, какие ещё процессы можно автоматизировать. И это только начало.
Можно ли использовать краулер для сбора данных с публичных сайтов?
Технически - да, но это не то, для чего предназначен этот краулер. Публичные сайты часто имеют robots.txt, API или ограничения по скорости. Использование краулера для сбора данных с публичных ресурсов без разрешения может нарушать законы о защите данных. Этот краулер предназначен исключительно для внутренних, приватных систем, где у вас есть полное право на доступ и сбор информации.
Нужно ли знать Python для написания такого краулера?
Да, но не глубоко. Вам не нужно быть экспертом. Достаточно понимать, что такое переменные, циклы, функции и базовые библиотеки. Большинство скриптов для краулинга - это 15-30 строк кода. Вы можете скопировать пример, подставить свои URL и логин, и он заработает. Документация на Python очень простая, а сообщество помогает даже новичкам.
Как долго будет работать краулер на большом сайте?
Зависит от размера и скорости сети. На 10 000 страниц с задержкой в 1 секунду - это около 2,7 часов. На 100 000 - 27 часов. Но вы можете запустить его на ночь. Краулер не требует постоянного контроля. Главное - не забыть включить логи, чтобы отслеживать ошибки. Если сайт медленный - добавьте больше задержки. Если быстрый - можно уменьшить до 0,3 секунды.
Что делать, если сайт меняет структуру?
Это частая проблема. Если сайт обновляется, CSS-классы или структура HTML могут измениться. Решение - не привязываться к конкретным классам. Лучше искать по атрибутам, например, data-id или aria-label. Или использовать XPath. Также добавьте в код проверку: если не нашлось нужного элемента - отправьте уведомление. Это поможет вовремя заметить изменения.
Можно ли запускать краулер на Windows?
Да, полностью. Python работает на Windows, macOS и Linux. Вам просто нужно установить Python 3.8 или выше, и установить библиотеки через pip. Никаких специальных настроек не нужно. Даже если вы используете корпоративный компьютер - если у вас есть права на установку Python, всё заработает.