药品价格监测:正确构建GoodRx风格的数据
美国药品价格因药房、邮政编码和折扣卡而剧烈波动——公共工具已经揭示了这些信息。以下是如何大规模收集这些数据,官方数据集在哪里,以及如何在这个敏感领域保持合规。
美国处方药价格以混乱著称:同一种药物的价格可能因药房、邮政编码和你在柜台出示的折扣卡而大相径庭。这种差异正是价格透明工具存在的原因,也是基础数据对研究、比较网站和市场分析有价值的原因。这也是一个敏感领域,因此收集它的正确方式是合规优先——仅限公共、非个人的价格数据。本指南涵盖了数据值得监测的原因、官方来源在哪里、如何大规模捕捉地理差异,以及界限在哪里。这是实用信息,不是法律或医学建议。
为什么数据值得收集
差异巨大。RAND对2022年数据的分析发现,美国所有药品的价格是33个比较国家价格的278%——而品牌原研药品则是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"])

捕捉地理差异
消费者价格工具中的有趣信号是本地的:药品的现金和折扣价格因邮政编码而异,因为药房竞争和协商价格因地区而异。要捕捉这种差异,您需要查询同一药品在一组邮政编码中的公共价格页面,并且——由于这些工具根据访问者的位置个性化——通过匹配地区的住宅出口路由每个请求,以便看到本地价格,而不是一个默认价格。输出是每种药品的每邮政编码价格矩阵:哪些药房在哪里最便宜,以及差异有多大。
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多个地点的城市和国家定位的住宅池使得每邮政编码监测成为现实。这是杂货和配送价格情报背后的同一位置优先方法。
还有一个值得捕捉的轴:支付者差异。同一种药品有现金价格、折扣卡价格,以及保险协商的价格——而最便宜的往往不是患者假设的那个。因为折扣工具同时显示现金和优惠券价格,监测器可以记录每个药房的价格,并标记出折扣价格比标价低的最大幅度。按计划快照,您还可以看到价格随时间变化,这是分析变得有趣的地方:季节性变化、新仿制药进入市场,以及药房因街对面的竞争对手而重新定价。将药品、剂量、形式、药房、邮政编码、价格类型和时间戳存储在每一行中,以保持数据集的清洁和可查询。
处理渲染和防护墙
消费者价格网站往往使用JavaScript渲染结果并防范机器人,因为他们的定价就是他们的产品。一个原始请求通常返回一个空壳,并且来自一个IP的频繁轮询会受到挑战。旋转住宅IP加上礼貌的节奏保持监测器运行;当一个网站在客户端渲染或抛出持续挑战时,使用Scraper API渲染页面并返回结构化数据是更清洁的路径。无论如何保持请求速率温和——这些是与健康相关的服务,成为网站的良好公民是负责任地进行这一操作的一部分。

合规界限
在这里,纪律比普通价格抓取更为重要。收集广告的现金和折扣价格、药房名称和位置、药品名称和剂量以及官方公共数据集——所有非个人、公开显示的信息。不要触碰患者记录、处方、保险或索赔数据、登录后的任何内容或与个人相关的健康信息——根据GDPR等法律,这些是个人数据,并且可能是敏感的健康数据。保持您的数据集仅限于价格和药房,汇总而不是跟踪个人,您就会保持在界限内。我们关于GDPR和抓取个人数据的指南全面解释了原因。
常见问题解答
可以抓取处方药价格吗?
在比较和药房网站上公开显示的广告现金和折扣价格可以被收集,许多参考数据作为官方开放数据集发布。重要的限制是合规驱动的:保持在公共、非个人的价格数据上,避免登录后的任何内容,绝不收集关于个人的患者或健康信息。
在哪里可以获得官方药品价格数据?
Medicaid发布了NADAC,一个开放的每周更新的药房采购成本数据集,可以通过其数据API查询。几个州运行价格透明工具——佛罗里达州的工具涵盖按县的400种最常用药品。RAND和ASPE发布跨国比较。在抓取任何消费者网站之前,请从这些官方来源开始;它们更清洁且风险更低。
为什么药品价格因地区而异?
现金和折扣价格反映了当地药房竞争和协商价格,这些因地区而异,因此同一种药品因邮政编码而价格不同。消费者工具也根据访问者的位置个性化结果。要捕捉真实的差异,请查询多个邮政编码,并使用地理定位的代理将每个请求路由通过匹配地区的住宅出口。
药品价格监测需要代理吗?
对于每邮政编码的地理准确性,是的——您需要在您定价的地区拥有出口,这意味着地理定位的住宅代理。它们还可以分散请求,以便计划中的监测不会从一个地址被封锁。像NADAC这样的官方数据集根本不需要代理,因此直接提取这些数据,并将代理保留用于消费者网站的地理数据。
药品价格数据的价值正是因为其变化多端——278%的跨国差距,广泛的每邮政编码差异,超过70,000家药房定价不同。以正确的方式构建管道:首先用尽官方数据集,使用位置定位的住宅代理捕捉地理差异,用Scraper API渲染受保护的网站,并在没有个人数据的公共价格上划定明确界限。这样做,您将在一个合规为重的领域获得一个清洁、可辩护的价格监测数据集。