Мониторинг цен в аптеках: как правильно собирать данные в стиле GoodRx

Цены на лекарства в США сильно варьируются в зависимости от аптеки, ZIP-кода и дисконтной карты — и общественные инструменты уже их раскрывают. Вот как собирать эти данные в большом масштабе, где находятся официальные наборы данных и как оставаться на стороне соблюдения в этой чувствительной области.

Цены на рецептурные лекарства в США известны своей хаотичностью: одно и то же лекарство может стоить совершенно разные суммы в зависимости от аптеки, ZIP-кода и того, какую дисконтную карту вы предъявите на кассе. Это разнообразие и является причиной существования инструментов прозрачности цен и почему исходные данные ценны для исследований, сайтов сравнения и анализа рынка. Это также чувствительная область, поэтому правильный способ их сбора — это подход, ориентированный на соблюдение — только открытые, неперсональные данные о ценах. Это руководство охватывает, что делает данные достойными мониторинга, где находятся официальные источники, как захватывать георазброс в большом масштабе и где проходит граница. Это практическая информация, а не юридическая или медицинская консультация.

Почему стоит собирать данные

Разбросы огромны. Анализ RAND данных за 2022 год показал, что цены в США на все лекарства составляли 278% от цен в 33 странах для сравнения — а для оригинальных брендовых лекарств — 422%. Дженерики идут против тренда: небрендированные дженерики в США, которые составляют около 90% объема рецептов в США, на самом деле были дешевле на 67% от цен в других странах. Даже в пределах США инструменты скидок сравнивают цены более чем в 70,000 аптеках и рекламируют экономию до 80%. Эта комбинация — огромные межстрановые разрывы и огромная внутристрановая вариативность — делает систематический мониторинг цен полезным, будь то создание сервиса сравнения, отслеживание рынка или исследование доступности.

Начните с официальных наборов данных

Прежде чем что-либо скрейпить, проверьте, опубликованы ли данные уже. Многие из них опубликованы. Medicaid публикует Национальную среднюю стоимость приобретения лекарств (NADAC) как открытый, еженедельно обновляемый набор данных — стоимость приобретения аптекой по лекарству, без необходимости скрейпинга. Несколько штатов управляют своими собственными инструментами прозрачности; например, во Флориде можно сравнить розничные цены на 400 наиболее распространенных лекарств по округам. Государственные и академические источники (RAND, ASPE) публикуют межстрановые сравнения. Извлечение структурированных данных из официального API быстрее, чище и менее рискованно, чем скрейпинг потребительского сайта — всегда исчерпывайте его в первую очередь.

import requests

# NADAC is an open Medicaid dataset -- query it directly, no scraping
r = requests.get(
    "https://data.medicaid.gov/api/1/datastore/query/<dataset-id>/0",
    params={"limit": 500, "offset": 0},
    timeout=30,
)
rows = r.json().get("results", [])
for row in rows[:5]:
    print(row["ndc_description"], row["nadac_per_unit"], row["effective_date"])
Диаграмма статистики разрывов цен на рецептурные лекарства в США: 278% от цен OECD для всех лекарств, 422% для брендовых, более 70000 аптек, дженерики дешевле на 67%
Разрывы цен — это причина, по которой данные важны: брендовые лекарства в США стоили 422% от цен в других странах, в то время как дженерики были дешевле.

Захватите георазброс

Интересный сигнал в инструментах потребительских цен — это локальный: наличные и дисконтные цены на лекарство меняются в зависимости от ZIP, потому что конкуренция аптек и согласованные ставки различаются по районам. Чтобы захватить этот разброс, вы запрашиваете публичную страницу цен на одно и то же лекарство по набору ZIP-кодов и — поскольку эти инструменты персонализируют по местоположению посетителя — направляете каждый запрос через резидентский выход в соответствующем регионе, чтобы увидеть местные цены, а не одну по умолчанию. Выход — это матрица цен по ZIP на каждое лекарство: какие аптеки дешевле где, и насколько широк разброс.

import requests, time, random

PROXY = "http://USER:PASS@gate.quantumproxies.io:8000"
proxies = {"http": PROXY, "https": PROXY}

def cash_prices(drug, zip_code):
    r = requests.get(f"https://example-rx.com/{drug}",
                     params={"zip": zip_code}, proxies=proxies, timeout=20)
    time.sleep(random.uniform(2, 4))          # polite pacing
    return parse_prices(r.text)               # [{pharmacy, price}, ...]

zips = ["10001", "33101", "90001", "60601"]   # NY, Miami, LA, Chicago
for z in zips:
    rows = cash_prices("atorvastatin-20mg", z)
    best = min(rows, key=lambda x: x["price"])
    print(z, best["pharmacy"], best["price"])

Гео-точность — это вся суть, поэтому резидентский пул с таргетингом по городам и странам в более чем 200 локациях делает мониторинг по ZIP реальным. Это тот же подход, ориентированный на местоположение, который лежит в основе аналитики цен на продукты и доставку.

Есть вторая ось, которую стоит захватить: разброс плательщиков. Одно и то же лекарство имеет наличную цену, цену по дисконтной карте и, отдельно, то, что согласовывает страховка — и самая дешевая из них часто не та, которую предполагает пациент. Поскольку инструменты скидок показывают наличные и купонные цены бок о бок, монитор может записывать обе цены по аптеке и отмечать, где дисконтная цена снижает прейскурантную цену наибольшим образом. Снимайте снимки по расписанию, и вы также увидите, как цены меняются со временем, что делает анализ интересным: сезонные изменения, появление новых дженериков на рынке и перепрайсинг аптек в ответ на конкурентов на улице. Храните лекарство, дозировку, форму, аптеку, ZIP, тип цены и временную метку в каждой строке, чтобы набор данных оставался чистым и доступным для запросов.

Получите гео-таргетированные резидентские прокси

Обрабатывайте рендеринг и стены

Потребительские сайты цен, как правило, рендерят результаты с помощью JavaScript и защищаются от ботов, потому что их ценообразование — это их продукт. Сырой запрос часто возвращает пустую оболочку, а интенсивное опрос с одного IP вызывает вызовы. Ротация резидентских IP и вежливое темпирование поддерживают работу монитора; когда сайт рендерит на стороне клиента или выдает постоянные вызовы, Scraper API, который рендерит страницу и возвращает структурированные данные, является более чистым путем. Держите скорость запросов мягкой в любом случае — это услуги, связанные со здоровьем, и быть хорошим гражданином сайта является частью ответственного подхода.

Диаграмма контрольного списка по сбору данных о ценах в аптеках в соответствии с требованиями: собирайте публичные наличные цены и официальные наборы данных, избегайте записей пациентов и персональных данных
Четко определите границу: публичные рекламируемые цены и официальные наборы данных — это честная игра; записи пациентов и любые персональные данные — нет.

Граница соблюдения

Здесь дисциплина важнее, чем в обычном скрейпинге цен. Собирайте рекламируемые наличные и дисконтные цены, названия и местоположения аптек, названия и дозировки лекарств, а также официальные публичные наборы данных — всю неперсональную, публично отображаемую информацию. Не трогайте записи пациентов, рецепты, данные о страховке или претензиях, ничего за логином или любую информацию о здоровье, связанную с индивидуумом — это персональные данные по законам, таким как GDPR, и может быть чувствительными данными о здоровье. Держите ваш набор данных в рамках цен и аптек, агрегируйте, а не отслеживайте индивидуумов, и вы останетесь далеко внутри границы. Наше руководство по GDPR и скрейпингу персональных данных полностью объясняет причины.

Часто задаваемые вопросы

Можете ли вы скрейпить цены на рецептурные лекарства?

Рекламируемые наличные и дисконтные цены, показанные публично на сайтах сравнения и аптек, могут быть собраны, и многие справочные данные опубликованы как официальные открытые наборы данных. Важные ограничения обусловлены соблюдением: оставайтесь на публичных, неперсональных данных о ценах, избегайте всего за логином и никогда не собирайте информацию о пациентах или здоровье об индивидуумов.

Где я могу получить официальные данные о ценах на лекарства?

Medicaid публикует NADAC, открытый еженедельный набор данных о стоимости приобретения аптекой, доступный через его API данных. Несколько штатов управляют инструментами прозрачности цен — Флорида охватывает 400 наиболее распространенных лекарств по округам. RAND и ASPE публикуют межстрановые сравнения. Начните с этих официальных источников, прежде чем скрейпить любой потребительский сайт; они чище и менее рискованны.

Почему цены на лекарства варьируются в зависимости от местоположения?

Наличные и дисконтные цены отражают местную конкуренцию аптек и согласованные ставки, которые различаются по районам, поэтому одно и то же лекарство стоит по-разному в зависимости от ZIP. Потребительские инструменты также персонализируют результаты по местоположению посетителя. Чтобы захватить реальный разброс, запросите несколько ZIP и направьте каждый запрос через резидентский выход в соответствующем регионе с использованием гео-таргетированных прокси.

Нужны ли мне прокси для мониторинга цен в аптеках?

Для гео-точности по ZIP, да — вам нужны выходы в регионах, которые вы оцениваете, что означает гео-таргетированные резидентские прокси. Они также распределяют запросы, чтобы запланированный мониторинг с одного адреса не был заблокирован. Официальные наборы данных, такие как NADAC, не требуют прокси вообще, поэтому извлекайте их напрямую и резервируйте прокси для данных гео потребительских сайтов.

Данные о ценах в аптеках ценны именно потому, что они так вариативны — 278% межстрановых разрывов, широкий разброс по ZIP, более 70,000 аптек с разными ценами. Постройте конвейер правильно: сначала исчерпайте официальные наборы данных, захватите георазброс с помощью резидентских прокси с таргетингом по местоположению, рендерите защищенные сайты с помощью Scraper API и проведите жесткую границу на публичных ценах без персональных данных. Делая это, вы получите чистый, защищаемый набор данных для мониторинга цен в области, где соблюдение — это вся игра.

Начните мониторинг цен с QuantumProxies