Как собирать обучающие данные для машинного обучения из Интернета
Модель — это легкая часть. Истинная сложность заключается в получении чистого, дедуплицированного, юридически корректного и обновляемого обучающего набора из открытого Интернета. Вот как выглядит процесс сбора данных от начала до конца.
Обучение модели часто является легкой частью. Шаг, который тормозит проекты машинного обучения, находится на предыдущем этапе: сбор чистого, дедуплицированного, юридически корректного и обновляемого обучающего набора из открытого Интернета. Получение сырых страниц дешево — это делает краулер — но превращение их в пригодные строки — это настоящая работа, и именно об этом идет речь в этом руководстве: получение, очистка до структурированного текста, дедупликация, выборка, лицензирование и конвейер обновления, который не дает модели устареть.
Начните с сигнала, а не с краулера
Прежде чем писать какой-либо код для сбора, точно определите, чему должна научиться модель и какие источники несут этот сигнал. Данные бывают трех форм, и каждая имеет разные затраты на сбор: структурированные (таблицы, продуктовые фиды — легко парсить), полуструктурированные (JSON, CSV, XML endpoints — часто это самое чистое, что сайт предоставляет), и неструктурированные (тексты статей, отзывы, темы на форумах). Неструктурированное содержание составляет 80-90% всех данных, и, как сообщается, только около 0,5% из них когда-либо используется, что именно и закрывает разрыв хорошо построенный веб-набор данных. Решите, какую форму вы ищете, прежде чем масштабировать что-либо.
Собирайте чистый текст, а не сырой HTML
Подача сырого HTML в обучающий конвейер означает подачу навигации, рекламы, баннеров с куки и тегов скриптов — шума, который ухудшает набор данных. Надежный шаг — это сразу собирать чистый, структурированный текст. Scraper API, который возвращает markdown, выполняет за вас удаление шаблонов, так что сбор тысяч страниц превращается в читаемое содержание, а не в кашу из тегов:
import requests
def fetch_clean(url):
r = requests.get(
"https://api.quantumproxies.io/scrape",
params={"url": url, "format": "markdown"},
headers={"Authorization": "Bearer YOUR_API_KEY"},
timeout=60,
)
return r.json()["content"] # boilerplate-stripped markdown
corpus = [fetch_clean(u) for u in seed_urls]
Markdown — это хорошая цель, потому что он сохраняет структуру (заголовки, списки, таблицы), отбрасывая слой представления — по той же причине он является предпочтительным вводом для RAG конвейеров и обучения LLM. Направляйте сбор через вращающиеся резидентные IP, чтобы большой сбор не был заблокирован на полпути.

Дедуплицируйте, прежде чем это отравит модель
Почти дублирующиеся документы — это тихий убийца веб-наборов данных — одна и та же статья, распространенная на десяти сайтах, шаблонные футеры, перепубликованный контент. Обучение на них приводит к избыточному весу повторяющегося. Хэшируйте нормализованный контент каждого документа и удаляйте коллизии; для почти дубликатов подходы шингла или MinHash ловят те, которые пропускает точный хэш:
import hashlib
def content_hash(text):
norm = " ".join(text.lower().split()) # normalise whitespace/case
return hashlib.sha256(norm.encode()).hexdigest()
seen, unique = set(), []
for doc in corpus:
h = content_hash(doc)
if h not in seen:
seen.add(h)
unique.append(doc)
print(f"kept {len(unique)} of {len(corpus)} after dedup")
Хэш контента, который вы вычисляете здесь, выполняет двойную функцию — это также то, как вы обнаруживаете изменения при следующем сборе, так что сохраняйте его.
Выбирайте выборку обдуманно, лицензируйте честно
Больше данных не означает автоматически лучшие данные. Репрезентативная выборка лучше перекошенной кучи — если 90% вашего сбора приходится на один сайт или один язык, модель учится на этом перекосе. Выбирайте стратифицированно по вашим источникам и классам, чтобы набор отражал распределение, которое вы действительно хотите моделировать. О лицензировании: веб-данные не автоматически бесплатны для обучения. Фильтруйте по условиям источника, соблюдайте директивы robots, где они применимы, и сохраняйте происхождение (URL источника и дату получения) рядом с каждой строкой, чтобы вы могли доказать, откуда пришел каждый пример. Наша заметка о законности веб-скрапинга в 2026 году охватывает вопросы личных данных и лицензирования (информативно, не юридическая консультация).
Истинные данные: часть, которую веб не предоставит
Для обучения с учителем вам нужны метки, и открытый веб редко их предоставляет. Некоторые наборы данных по своей природе имеют метки (оценка рядом с отзывом, следующее слово в предложении), поэтому их дешево собирать в большом масштабе. Все остальное требует шага истинных данных: маркировка экспертами в области или краудсорсинг через рынок. Если вы используете краудсорсинг, контролируйте качество, добавляя задачи с известными ответами и отклоняя работников, которые их не выполняют — это хорошо изученная ошибка. Где возможно, предпочитайте естественно маркированные веб-данные; это разница между набором данных, который можно собрать за неделю, и тем, который требует бюджета на маркировку.
Обновляйте, потому что данные устаревают
Сбор данных никогда не бывает одноразовым. Цены меняются, страницы переписываются, появляется новый контент — модель, обученная на замороженном снимке, отдаляется от мира, который она должна предсказывать. Включите обновление с первого дня: повторно собирайте по расписанию, сравнивайте хэш контента каждой страницы с последним запуском и обрабатывайте только то, что действительно изменилось. Это сохраняет стоимость обновления пропорциональной реальным изменениям, а не повторной загрузке всего:
def refresh(url, last_hash):
text = fetch_clean(url)
h = content_hash(text)
if h == last_hash:
return None # unchanged, skip re-processing
return {"url": url, "text": text, "hash": h, "fetched": now()}
Для быстро меняющихся доменов или когда вы предпочитаете потреблять управляемую ленту, а не запускать сбор самостоятельно, веб-данные, созданные для LLM, предоставляют вам чистый, обновленный контент без необходимости поддерживать конвейер.

Собирайте веб в чистый markdown в масштабе
Часто задаваемые вопросы
Где вы получаете обучающие данные для машинного обучения?
Три основных источника: существующие публичные наборы данных (Kaggle, Google Dataset Search, академические корпуса), внутренние данные от первой стороны и открытый веб через сбор. Веб — это самый большой и свежий источник, но он требует больше всего работы — очистки, дедупликации, выборки и лицензирования. Для многих современных моделей сбор релевантных сайтов в чистый markdown — это самый быстрый способ получить специфичный для домена набор данных, который еще не существует.
Сколько обучающих данных мне нужно?
Это зависит от задачи и модели, и честный ответ: начните с малого и масштабируйте, пока производительность не стабилизируется. Обучайтесь на репрезентативной выборке, измеряйте точность на отложенном тестовом наборе (70/30 разделение — это обычное начало), затем добавляйте больше данных и наблюдайте, продолжает ли метрика улучшаться. Качество и репрезентативность обычно важнее, чем просто объем.
Законно ли собирать веб-данные для обучения ML?
Сбор публичных данных в целом защищаем, но использование для обучения вызывает вопросы лицензирования и, где задействованы личные данные, вопросы конфиденциальности. Фильтруйте по условиям источника, избегайте личных данных, которые вам не нужны, сохраняйте происхождение для каждого примера и соблюдайте директивы robots, где они применимы. Это общая информация, не юридическая консультация — получите консультацию для коммерческого набора данных в масштабе.
Как я могу поддерживать актуальность обучающего набора данных?
Запланируйте повторные сборы и используйте хэш контента для обнаружения изменений, повторно обрабатывая только страницы, которые действительно изменились. Версионируйте ваш набор данных, чтобы вы могли воспроизвести, какой снимок обучил какую модель, и сохраняйте даты получения на каждой строке. Инкрементальное обновление, обнаруженное по изменениям, сохраняет стоимость пропорциональной реальным изменениям, а не повторной загрузке всего корпуса каждый цикл.
Модель получает заголовки, но набор данных определяет результат. Получите правильный сигнал, собирайте в чистый markdown, жестко дедуплицируйте, честно выбирайте выборку, сохраняйте происхождение и включайте обновление с самого начала. Если вы направляетесь к тонкой настройке, наше руководство по созданию набора данных для тонкой настройки из Интернета продолжает с того места, где это заканчивается.