TL;DR
Набор данных о списке Etsy должен отражать список и конкретное предложение или вариацию, которые вы хотите сравнить. Файл, содержащий только заголовок и плавающую цену, может быть достаточен для приблизительного инвентаря, но недостаточен для надёжного мониторинга цен. Вам нужны идентификатор, валюта, время наблюдения и достаточно контекста вариации, чтобы объяснить изменение.
Для интеграции с собственным магазином начните с того, что предоставляет Etsy для требуемой операции. Для более широкого исследовательского проекта убедитесь в разрешённом доступе и использовании до сбора данных. Публичная страница списка не является доказательством того, что каждый автоматический метод сбора разрешён. Среда браузера управляет выполнением; она не расширяет уровень доступа приложения.
Выберите путь данных в зависимости от полей и охвата, которые ваш проект действительно имеет право использовать. Структурированные данные могут снизить неоднозначность парсинга, но всё равно требуют валидации схемы и соответствующей модели авторизации. Проверка браузера полезна для устранения конкретного расхождения, если это разрешено, а не для замены каждой интеграции.
В руководстве по аутентификации Etsy документируется API-ключ и требования OAuth для ограниченных операций. Текущее руководство указывает значение x-api-key, состоящее из keystring и общего секрета, разделённых двоеточием. Убедитесь в текущих требованиях в официальной документации при реализации; старые руководства могут показывать несовместимый формат заголовка.
Запрашивайте только те разрешения, которые действительно нужны для конкретного конечного пункта. Чтение списка в режиме только для чтения не должно запрашивать привилегии записи или удаления просто потому, что пример включает их. Храните токены и секреты приложения вне кода, журналов и экспортированных данных. Ни один аутентифицированный запрос к API Etsy не запускался для этой статьи.
Официальное руководство по спискам описывает циклы состояний и вариации инвентаря. Список может быть неактивным или распроданным, а сборщик может также не получить его. Сохраняйте эти возможности отдельно. Отсутствие записи в частичном списке результатов не является достаточным доказательством того, что продавец удалил список.
Для рабочего процесса авторизованного магазина сравните выбранную вариацию, количество, валюту и время наблюдения, прежде чем считать расхождение ошибкой парсера. Запишите, что браузер действительно отображал. Не отождествляйте начальную цену карточки категории, цену настроенного варианта и итоговую сумму при оформлении заказа.
Используйте одну таблицу списка для идентификации уровня списка и одну таблицу предложения или вариации, когда источник предоставляет эту деталь. Храните необработанные идентификаторы в виде текста, чтобы избежать проблем с преобразованием электронных таблиц. Сохраняйте связь, предоставленную источником, между продуктами, предложениями и свойствами вариации, а не упрощайте несвязанные выборы в одну строку заголовка.
| Наблюдение | Необходимый контекст | Частая ошибка интерпретации |
|---|---|---|
| Цена списка | Валюта, время, значение цены | Рассматривание её как цены каждой вариации |
| Предложение вариации | Выбранные свойства и идентификатор | Сравнение разных размеров как изменения цены |
| Количество | Объём и состояние источника | Называние уровня списка универсальным количеством |
| Отсутствующая строка | Пагинация и завершённость запуска | Сообщение об удалении после неудачной партии |
| Сумма, связанная с доставкой | Местоположение и контекст расчёта | Смешивание цены товара с итоговой стоимостью |
Сделайте ключ сравнения явным. Например, запись истории цен может быть ключом по listing_id, сигнатуре вариации, валюте и observed_at. Это предложенный дизайн склада, а не утверждение, что Etsy возвращает поле с именем variation_signature. Отличайте нормализованные столбцы от полей поставщика.
Определения денег Etsy описывают amount, делённый на divisor, и отдельный код валюты. Жёсткое деление на 100 искажает записи, у которых divisor отличается. Двоичная арифметика с плавающей точкой также вводит избежимые проблемы представления, когда значения используются для согласования.
Этот пример на Python использует синтетические объекты денег, соответствующие этим документированным полям. Он проверяет divisor и сохраняет валюту. Это тест преобразования, а не ответ API, захваченный с реального магазина.
from decimal import Decimal
import json
def money(value):
amount, divisor = value["amount"], value["divisor"]
if type(amount) is not int or type(divisor) is not int or divisor <= 0:
raise ValueError("integer amount and positive integer divisor required")
currency = value["currency_code"]
if not isinstance(currency, str) or len(currency) != 3 or not currency.isalpha():
raise ValueError("three-letter currency code required")
return {"value": format(Decimal(amount) / Decimal(divisor), "f"),
"currency": currency.upper()}
samples = [{"amount": 1299, "divisor": 100, "currency_code": "USD"},
{"amount": 2500, "divisor": 1000, "currency_code": "USD"}]
result = [money(x) for x in samples]
assert result[0]["value"] == "12.99"
assert result[1]["value"] == "2.5"
try:
money({"amount": 1, "divisor": 0, "currency_code": "USD"})
except ValueError:
rejected_zero_divisor = True
else:
raise AssertionError("zero divisor was accepted")
print(json.dumps({"converted": result, "rejected_zero_divisor": rejected_zero_divisor}))
Локальный тест вернул 12.99 и 2.5 USD и отклонил нулевой делитель. Второй фиксированно использует другой делитель, чтобы выявить распространённое предположение. Проверка трёхбуквенного кода — это только проверка формата; политика валюты в производстве должна использовать поддерживаемый набор валют для интеграции. Не молча конвертируйте валюты или округляйте значения до определения политики отчёта.
Начните с ограниченного авторизованного магазина или набора списков. Сохраняйте необработанный ответ с его операцией, временем и отредактированным диагностическим контекстом. Нормализуйте каждый список только после проверки необходимых идентификаторов и структуры цены. Отслеживайте завершение страницы или курсора отдельно от количества возвращённых записей.
Для повторных запусков вставьте текущее представление и добавьте исторические наблюдения о ценах, где это необходимо. Согласуйте принятые строки, отклонённые строки и повторяющиеся идентификаторы. Если страница не удаётся, отметьте запуск как частичный и повторите в соответствии с текущими рекомендациями конечной точки. Не помечайте неизвестные списки как удалённые, пока полное сравнение и политика удаления не подтверждены.
Nstbrowser может организовать проверку браузера вокруг сохранённого Профиля для намеченного рабочего процесса магазина. Это полезно, когда человеку нужно сравнить структурированные записи с разрешённым просмотром страницы. Групповые настройки помогают вам проверить выбор хранилища и синхронизации для среды. RPA может поддерживать ограниченную последовательность проверки, когда её охват разрешён и её вывод проверен. Эти функции не заменяют одобрение приложения Etsy, аутентификацию API или правильную модель данных уровня вариации.
Подготовьте среду с помощью создания Профиля, изучите групповые настройки и адаптируйте разрешённую последовательность из документации RPA. Сравните известный список и выбранную вариацию с структурированной записью. Здесь не запускался живой браузер Etsy или интеграция Nstbrowser.
Используйте пилот для проверки смысла, а не просто успешного извлечения. Строка полезна только тогда, когда другой редактор может определить, какой список, вариацию, валюту и момент времени она представляет.
Вопрос: Цена Etsy всегда равна amount, делённому на 100?
Нет. Используйте возвращённый divisor вместе с amount и currency_code.
Вопрос: Дает ли API-ключ доступ ко всем операциям?
Нет. Ограничения конечной точки, авторизация OAuth, доступ приложения и разрешённое использование всё ещё важны.
Вопрос: Может ли цена одного списка представлять все вариации?
Не предполагайте этого. Сохраняйте конкретный контекст предложения или вариации, используемый сравнением.
Вопрос: Отсутствие списка в одном запуске доказывает, что он был удалён?
Нет. Частичный сбор, проблема доступа или сбой извлечения также могут привести к отсутствию записей.