Мониторинг цен в аптеках: как правильно собирать данные в стиле 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"])

Захватите георазброс
Интересный сигнал в инструментах потребительских цен — это локальный: наличные и дисконтные цены на лекарство меняются в зависимости от 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 и проведите жесткую границу на публичных ценах без персональных данных. Делая это, вы получите чистый, защищаемый набор данных для мониторинга цен в области, где соблюдение — это вся игра.