Reddit Extract

У каждого выходного значения должен быть понятный источник

На примере PostgreSQL составьте правила переноса полей: источник текста, пропуски, типы и причины отклонения. Проверяйте изменения на сохранённом ответе.

Получить API-ключ

Оставьте исходный ответ доступным для проверки

Начните с https://api.redditextract.com/v1/search?q=index&subreddit=PostgreSQL&limit=3. Запрос ищет текст index в указанном сообществе и возвращает не более трёх записей на странице. Ключ передавайте с сервера через поддерживаемый заголовок. Выборка не является случайной или полной; пустой ответ тоже возможен. Архив независимый и исторический, не официальный поток текущих событий Reddit.

Сохраните фактически полученный ответ вместе с параметрами запроса, своим временем получения и версией будущего преобразователя. Не добавляйте ключ в этот файл. Так вы отделите вход, который проверяете локально, от следующего обращения к API. Сохранение на своей стороне не означает, что сервис гарантирует тот же ответ при повторном запросе или вечное наличие исходной записи.

Опишите путь от свойства к столбцу

Сделайте сопоставление понятным без чтения кода. Для каждого выходного столбца укажите наблюдаемое исходное свойство, допустимый тип, действие при пропуске и способ получения: копирование или вычисление. Локальная отметка content_source может содержать title либо text, а source_page — браться из вашего журнала запросов. Это имена вашего результата, а не дополнительные поля ответа API.

Просмотрите объекты по одному и выпишите встретившиеся свойства, их фактические типы, пропуски и явные null. Наличие поля во всех трёх примерах ещё не доказывает его обязательность. Если ответ пуст, у вас нет наблюдений о форме отдельной записи. Не заменяйте такой ответ правдоподобным вымышленным объектом под видом полученных данных.

Укажите, откуда взят текст

Параметр q ищет по title и text. Если слов несколько, они должны совпасть вместе внутри одного подходящего поля; распределения слов между заголовком и текстом недостаточно. Для q=index проверьте оба поля по отдельности и выберите источник выходного содержимого. Если text отсутствует, сохраните пропуск либо примените явно описанную подстановку title с отметкой об источнике. Не маскируйте её под исходный основной текст.

Проверьте пропуски до преобразования типов

Сохраняйте идентификатор без попытки превратить его в арифметическое число. Текст проверяйте как строку, прежде чем убирать пробелы или переводить строки в нужный формат. Явно решите, отличаются ли в вашей базе отсутствие свойства, null и пустая строка. Значение по умолчанию может облегчить загрузку, но не должно превращаться в утверждение о том, что находилось в архивном объекте.

Для времени сначала установите представление и единицы измерения полученного значения. Поле created_utc, если оно есть, не следует автоматически делить или умножать на 1000 без проверки. Для рейтинга проверьте числовой тип, не заменяя пропуск нулём. При полезности для аудита храните исходное значение отдельно от преобразованного и отмечайте причину отказа от строки, а не исправляйте её незаметно.

Объясните судьбу каждой полученной записи

Если доступны parent_id и link_id, их можно оставить ссылками для локального объединения. Целевая запись может не входить в полученную страницу или вообще не быть доступной. Это не основание создавать фиктивного родителя. Сервис возвращает плоские записи, а не готовое дерево разговора, и не поддерживает фильтры parent_id или link_id. Для простого извлечения полей восстановление дерева может быть лишним этапом.

Проверьте выбор содержимого на явно помеченных синтетических случаях: только заголовок, только текст, оба поля, явный null и отсутствие обоих свойств. Сравнивайте не только выходное значение, но и отметку источника. Для отклонённой записи сохраняйте исходный объект и причину. Если преобразователь выдаёт не более одной строки на запись, сумма принятых и отклонённых записей должна объяснять полученный вход, а не размер всего архива.

Решите, зачем нужна следующая страница

Следующий запрос выполняйте только при понятной цели. Порядок _doc не соответствует хронологии, релевантности или рейтингу; min_score лишь отсекает записи по порогу. До 100 записей на запрос и до 100 страниц на набор условий не гарантируют полный экспорт. Итоги eq, gte и unknown означают точное значение, нижнюю границу и неизвестный итог, а не степень покрытия всего Reddit.

Успешная страница стоит один кредит даже при пустом результате. Ошибка вашего преобразователя после успешного ответа не отменяет расход, но локальный повтор на сохранённом файле нового кредита не требует. Цена — $1 за 1000 успешных запросов; $50 дают 50000 платных кредитов. Необязательная проба на 100 кредитов зависит от условий защиты сети от злоупотреблений. Проверяйте доменный баланс в кабинете, а не через публичный /v1/status.