Цены на авиабилеты: закрепить четыре входа
Зафиксируйте валюту, локаль, точку продажи и устройство, чтобы разница в тарифе была разницей в цене, и записывайте эти четыре входа при каждом снимке.
BotBrowser Team
Нужна структурированная документация по теме Сеть?
Эта статья относится к редакционной библиотеке. Для пошаговой настройки, справки и постоянных обновлений переходите сразу в соответствующий раздел docs.
Сбор цен на авиабилеты даёт пригодный ряд только тогда, когда окружение за каждым запросом остаётся неизменным. Тариф котируется для валюты, локали, точки продажи и устройства, и изменение любого из них может изменить сумму, хотя на рынке ничего не изменилось. BotBrowser документирует входные данные локали, часового пояса и языков из профиля вместе с географически согласованным выходом, поэтому снимок может объявить представляемое окружение. Он не поставляет тарифы, не бронирует, не управляет логикой цен перевозчика и не гарантирует, что котировка повторится. Там, где есть лицензированный тарифный поток или API агентства, использовать нужно именно его.
Кратко
- Тариф котируется для конкретных валюты, локали, точки продажи и устройства. Закрепите все четыре, иначе измеренная разница частично будет разницей окружения.
- Валюта это параметр запроса или настройка аккаунта, а не значение профиля браузера. Локаль и языки приходят из профиля. Точка продажи это параметр сайта, который должен совпадать с регионом выхода и аккаунтом.
- Записывайте четыре входа рядом с каждым котируемым тарифом, а не один раз на прогон.
- Классифицируйте разницу по тому, какой вход изменился. Смена валюты не является движением тарифа, сколь бы велика ни была сумма.
- Предпочитайте лицензированный тарифный поток или API агентства там, где они есть. Браузерный прогон не создаёт разрешения на мониторинг и не может бронировать.
Содержание
- Четыре входа, которые двигают тариф
- Какие из четырёх действительно удерживает профиль
- Запись четырёх входов на каждый снимок
- Чтение разницы по изменившемуся входу
- Когда ответом является лицензированный тарифный поток
- Практический вывод
Четыре входа, которые двигают тариф
Поиск авиабилета несёт больше, чем пункт отправления, пункт назначения и дату. Он несёт валюту, языковое предпочтение, рынок, для которого котируется маршрут, и класс устройства, который может выбрать другой набор предложений. Эти четыре не взаимозаменяемы, и ряд мониторинга, который их меняет, измеряет собственную конфигурацию не меньше, чем тарифы.
| Вход | Где задаётся | Что может изменить |
|---|---|---|
| Валюта | Параметр запроса или настройка аккаунта | Котируемую сумму и её округление |
| Локаль | Локаль и список языков из профиля | Язык страницы, форматирование, иногда набор предложений |
| Точка продажи | Параметр сайта, регион выхода и аккаунт вместе | Рынок, чьи правила и инвентарь применяются |
| Устройство | Окно просмотра и значения устройства из профиля | Вёрстку и иногда предложение только для мобильных |
Тип Offer в schema.org даёт здесь полезную форму словарю. Он определяет price и рекомендует сопровождать его priceCurrency с кодом ISO 4217 вместо неоднозначного символа, а также предостерегает от разделителей внутри числового значения. Это указание касается публикации предложения и напрямую переносится на задачу снимка: тариф, записанный как $412, не является фактом, тогда как 412 USD является сравнимым наблюдением.
Второй и третий входы чаще всего путают. Локаль это то, что объявляет браузер. Точка продажи это рынок, для которого сайт назначает цену, и она часто выводится из сочетания параметра сайта, видимого региона запроса и настройки аккаунта. Заставить браузер объявить немецкий язык само по себе не делает тариф немецким, а выход с немецкого адреса сам по себе не задаёт валюту.
Валюта заслуживает отдельного абзаца, потому что это вход, который чаще всего остаётся подразумеваемым. Сайт может принимать явный параметр валюты, выводить её из точки продажи или читать из настройки аккаунта, и эти три пути могут расходиться. Когда они расходятся, страница обычно показывает одну валюту, а оплата другую, либо ту же валюту с другим применённым курсом. Записывайте валюту, которую показала страница, а не ту, что запросил запрос, и записывайте рядом точку продажи, потому что именно эта пара делает сумму воспроизводимой.
Округление это меньший, но постоянный источник шума. Тариф, конвертированный из одной валюты в другую, округляется с точностью, зависящей от валюты, и некоторые округляют до целых единиц, тогда как другие сохраняют два знака. Поэтому два снимка одного и того же тарифа в одной валюте должны совпадать точно; если они различаются на долю единицы, разница обычно приходит из конвертации, а не из изменения тарифа, и запись должна это указывать, а не считать долю движением.
Налоги и сборы относятся к той же семье проблем. Показанная сумма может включать их, исключать или включать подмножество, зависящее от точки продажи, и изменение включённого набора выглядит в точности как изменение цены. Записывайте, что включает показанная сумма, когда страница это указывает, и держите это поле рядом с суммой. Ряд, который переходит от показа с налогами к показу без них, даст скачок, не связанный с тарифом.
Какие из четырёх действительно удерживает профиль
Документация BotBrowser по часовому поясу, локали и языкам описывает автоматический вывод из IP выхода прокси при настроенном прокси и ручные переопределения часового пояса, локали и языков, причём ручные переопределения требуют лицензии ENT Tier1. Документация GeoIP описывает преобразование адреса выхода в географические значения и прямо указывает границу точности: сопоставление на уровне страны обычно надёжно, а на уровне города может указывать на соседний город или регион.
Это покрывает половину таблицы, связанную с локалью, и часть точки продажи. Это не покрывает валюту и не покрывает точку продажи полностью, потому что сайт может принимать параметр валюты независимо от языка, который он обслуживает, это поведение сайта, а не документированный вход браузера. Схема мониторинга, которая предполагает, что профиль удерживает всё, удержит два из четырёх входов и будет считать, что удерживает четыре.
| Вход | Удерживает профиль | Нужна явная проверка |
|---|---|---|
| Валюта | Нет | Параметр запроса или настройка аккаунта |
| Локаль | Да, если настроена | Список, который страница действительно сообщает |
| Точка продажи | Частично | Указание самого сайта о рынке |
| Устройство | Да, если настроено | Окно просмотра и значения, которые сообщает страница |
Практическое следствие в том, что проверка должна быть на каждый снимок, а не на конфигурацию. Прогон, правильно настроенный в начале, собьётся, как только кто-то изменит параметр запроса, добавит переопределение или сменит прокси для одного региона. Запись четырёх входов в момент котировки это единственный способ узнать, какие из них применились.
Класс устройства это вход, который лучше всех скрывается. Окно просмотра настольного компьютера и мобильное окно могут возвращать разные наборы предложений, а некоторые перевозчики показывают тариф только для мобильных, которого на настольном пути просто нет. Это не изменение цены между двумя наблюдениями одного предложения, это другое предложение. Записывайте окно просмотра рядом с классом устройства, чтобы более поздний читатель мог увидеть, использовали ли оба снимка одно и то же, и считайте изменение набора предложений эффектом устройства, а не движением тарифа.
Есть и временнáя сторона внутри самого окружения. Снимок, сделанный во время акции, и снимок, сделанный час позже, могут различаться, потому что акция закончилась: это изменение на стороне источника, которое четыре входа правильно показывают как неизменные. Это правильный результат: запись делает свою работу, исключая снимок как объяснение. Ошибка, которую нужно избегать, обратная: винить источник в разнице, которую объясняет смена валюты.
Последняя привычка стоит упоминания из-за низкой цены. Записывайте четыре входа до загрузки страницы тарифа, а не после, и сохраняйте значения до загрузки. Страница может изменить локаль или валюту во время собственной инициализации на клиенте, поэтому значение, прочитанное после котировки, может описывать конечное состояние, а не то, что нёс запрос. Запись обоих значений, когда они различаются, превращает запутанную разницу в документированный переход.
Запись четырёх входов на каждый снимок
Запись снимка для мониторинга тарифов невелика. Ей нужны маршрут, котируемая сумма с валютой, четыре входа и время наблюдения. Всё остальное это вспомогательные детали.
| Поле | Содержимое | Зачем оно в записи |
|---|---|---|
itinerary_key | Маршрут, даты и класс как запрошены | Определяет, что сравнивается |
amount | Числовое значение с десятичной точкой | Сравнимо только с валютой |
currency | Код ISO 4217 | Не даёт прочитать символ как сумму |
accept_language | Объявленный список языков на момент снимка | Показывает, какая локаль применилась |
point_of_sale | Рынок, который указал сайт | Отделяет рынок от языка |
device_class | Настольный или мобильный, с окном просмотра | Отделяет вёрстку от тарифа |
observed_at | Время снимка в UTC | Упорядочивает наблюдения и выявляет смену расписания |
alignment | aligned или изменившийся вход | Не даёт несравнимой строке попасть в ряд |
Два поля в этой таблице легко записать неверно. amount должно быть числом с десятичной точкой, а не форматированной строкой, потому что строка несёт соглашение о разделителях своей локали и становится неоднозначной, как только ряд охватывает две локали. point_of_sale должно быть тем, что указал сайт, а не тем, что задумал оператор: намерение, которое сайт не выполнил, это ровно тот случай, который стоит поймать.
Конструктор записей ниже сравнивает два снимка одного маршрута и сообщает, какие входы удержались. Пример сконструирован.
// Constructed fixture: two captures of one itinerary, one input changed.
const captureA = {
itineraryKey: 'YYZ-LHR 2026-12-10 Y',
amount: 812.4,
currency: 'CAD',
acceptLanguage: 'en-CA,en',
pointOfSale: 'CA',
deviceClass: 'desktop',
observedAt: '2026-11-10T09:00:00Z',
};
const captureB = {
itineraryKey: 'YYZ-LHR 2026-12-10 Y',
amount: 512.1,
currency: 'EUR',
acceptLanguage: 'en-CA,en',
pointOfSale: 'CA',
deviceClass: 'desktop',
observedAt: '2026-11-10T09:00:30Z',
};
const FIELDS = ['currency', 'acceptLanguage', 'pointOfSale', 'deviceClass'];
const changed = FIELDS.filter(f => captureA[f] !== captureB[f]);
const alignment = changed.length === 0 ? 'aligned' : `input_changed:${changed.join(',')}`;
const lines = [
`itinerary=${captureA.itineraryKey}`,
`a=${captureA.amount} ${captureA.currency} b=${captureB.amount} ${captureB.currency}`,
`currency=${captureA.currency}->${captureB.currency} locale=${captureA.acceptLanguage}`,
`pos=${captureA.pointOfSale} device=${captureA.deviceClass}`,
`changed=${changed.join(',') || 'none'} alignment=${alignment}`,
`observed_at=${captureA.observedAt}->${captureB.observedAt}`,
];
console.log(lines.join('\n'));
Сконструированный вывод ниже и есть цель упражнения. Сумма упала примерно на 37 процентов, а классификация говорит, что это падение вовсе не движение тарифа.
itinerary=YYZ-LHR 2026-12-10 Y
a=812.4 CAD b=512.1 EUR
currency=CAD->EUR locale=en-CA,en
pos=CA device=desktop
changed=currency alignment=input_changed:currency
observed_at=2026-11-10T09:00:00Z->2026-11-10T09:00:30Z
Чтение разницы по изменившемуся входу
Величина разницы ничего не говорит о её причине. Полезный вопрос: какие из четырёх входов удержались, потому что это определяет, что может подтвердить пара снимков.
| Удержанные входы | Наблюдение | Что подтверждает разница |
|---|---|---|
| Все четыре идентичны | Сумма отличается | Сравнимое изменение цены в этом окружении |
| Валюта отличается, остальное то же | Сумма отличается | Конвертация или переоценка, а не движение |
| Точка продажи отличается | Сумма отличается | Два рынка; ни один не база для другого |
| Класс устройства отличается | Сумма или набор предложений меняются | Предложение, зависящее от устройства, а не тариф |
Первая строка единственная, которая подтверждает тарифный ряд. Вторая это самая частая ошибка на практике, потому что смена валюты меняет сумму в разы, и полученный график выглядит как драматическое движение. Третья строка это сравнение рынков, которое нужно строить как два ряда, а не один. Четвёртая это случай, когда предложение только для мобильных выдаёт себя за изменение цены.
Ещё два предостережения относятся к чтению, а не к записи. Во-первых, котировка не является бронируемой ценой: налоги, сборы и доступность могут измениться между котировкой и страницей оплаты. Во-вторых, повторный снимок в неизменном окружении всё равно может отличаться, потому что изменился инвентарь или тарифные правила перевозчика; это реальное наблюдение, и его нужно помечать как изменение на стороне источника, а не как ошибку снимка.
Архитектура мониторинга цен описывает планирование и обнаружение изменений для общего ценового ряда. Путешествия добавляют то, что четыре входа более независимы друг от друга, чем в рознице, где одна страница товара обычно подразумевает одну валюту и одну локаль. Запись согласованности профиля и маршрута является правильным дополнением для выходной половины точки продажи. Календарю доступности нужен ключ по дате, а не по продукту, и модель доступности показывает, как сохранить этот календарь сравнимым между снимками.
Когда ответом является лицензированный тарифный поток
Большинство перевозчиков и крупных агентств предлагают лицензированный путь: поток распространения тарифов, API агентства или согласованный экспорт данных. Эти пути дают те же маршруты с определённой схемой, объявленной частотой обновления и лицензией, где сказано, для чего данные можно использовать. Когда такой путь есть, браузерный прогон обычно является неверным инструментом, потому что он даёт менее стабильный ряд с большей юридической экспозицией для источника, который уже предлагал поддерживаемый путь.
Там, где такого пути нет, честный вопрос в том, что разрешает наблюдение. Работающая браузерная сессия не является ответом. Решают применимые условия перевозчика или агентства, и они часто ограничивают автоматический доступ, перепродажу тарифных данных и показ кэшированных цен. Записывайте основание прогона рядом со снимками, чтобы следующий читатель унаследовал ответ, а не допущение.
Тип FlightReservation в schema.org напоминает о той же границе с другой стороны. Он определяет словарь для бронирования, с bookingTime, полями пассажира и reservationFor, указывающим на рейс. Он описывает, как бронирование может быть представлено; он ничего не говорит о том, можно ли мониторить тариф, и о том, какой будет котировка при оплате.
Словарь всё же полезен, чтобы назвать то, что снимок держит раздельно. Бронирование это не предложение, а предложение это не тарифное правило. Когда запись смешивает три вещи, более позднее сравнение не может сказать, изменил ли перевозчик цену, маршрут или связанные условия. Держите ключ маршрута описывающим запрошенное, сумму и валюту описывающими котировку, а четыре входа окружения описывающими, как котировка была получена.
Вопросы и ответы
Является ли смена валюты изменением цены?
Нет. Она меняет единицу суммы и обычно округление. Ряд, который меняет валюту на ходу, измеряет смену, поэтому держите одну валюту на ряд или конвертируйте по объявленному курсу и записывайте конвертацию.
Может ли профиль браузера удержать точку продажи?
Только частично. Профиль управляет локалью, языками и через прокси видимым регионом. Точка продажи сайта часто является отдельным параметром или настройкой аккаунта, поэтому проверяйте, что указал сайт, а не что задумал оператор.
Всегда ли один и тот же маршрут даёт одну и ту же цену?
Нет. Инвентарь и тарифные правила меняются, и котировка не равна итогу при оплате. Повторный снимок в неизменном окружении всё равно может отличаться, и эта разница принадлежит источнику.
Поставляет ли BotBrowser тарифы или бронирует билеты?
Нет. Он предоставляет документированные входные данные браузера, чтобы снимок мог объявить своё окружение. Он не поставляет тарифные данные, не бронирует и не гарантирует котируемую цену.
Источники
- schema.org FlightReservation
- schema.org Offer
- MDN Accept-Language
- Часовой пояс, локаль и языки в BotBrowser
- База GeoIP в BotBrowser
Практический вывод
Определите, какую валюту, локаль, точку продажи и устройство представляет ряд, до первого снимка. Проверяйте все четыре на каждый снимок, потому что профиль удерживает два полностью и один частично, и записывайте их рядом с котируемой суммой и временем наблюдения. Классифицируйте каждую разницу по изменившемуся входу и считайте смену валюты изменением окружения, а не движением тарифа. Если лицензированный тарифный поток или API агентства существует, используйте его и исключите браузерный прогон из схемы.
Эта статья входит в руководство: Обзор настройки прокси: карта сетевых решений браузера
Похожие статьи
Мониторинг цен в ecommerce: браузерный слой
СетьДоступность на Booking.com: календарь по датам
РазвертываниеМониторинг цен конкурентов: устройство сбора
РазвертываниеЗащита отпечатков для мониторинга цен в электронной коммерции
СетьРотация прокси: границы сессии при сборе данных
СетьЛимиты скрейпинга: 429, Retry-After и параллелизм
Выполните ту же проверку в BotBrowser
Загрузите профиль, сохраните внутри браузера те сигналы, о которых только что прочитали, и подтвердите результат на своей машине до раскатки.