공공 의료 데이터 스크래핑: 왜 지금이 중요한가
제약 마켓 액세스 팀과 페이어 분석가에게 공개 의료 데이터는 경쟁 우위의 핵심입니다. 약가 벤치마킹, 임상시험 경쟁 지형 모니터링, 제공자 디렉토리 검증 — 모든 작업이 공개 데이터에서 시작됩니다. 하지만 이 데이터는 산재해 있고, 사이트마다 접근 정책이 다르며, 일부는 적극적인 봇 차단을 적용합니다.
이 가이드는 공개 데이터만 다룹니다. 환자 식별 정보(PHI/PII) 스크래핑은 절대 다루지 않습니다. HIPAA 경계를 엄격히 준수하면서, 제약 인텔리전스 팀이 실무에서 활용할 수 있는 스크래핑 아키텍처와 컴플라이언스 프레임워크를 설명합니다.
공공 의료 데이터 소스 개요
아래는 제약 인텔리전스와 페이어 분석에서 가장 많이 활용되는 공개 데이터 소스입니다. 모두 환자 개인정보 없이 접근 가능한 출처입니다.
| 데이터 소스 | 주요 콘텐츠 | 접근 방식 | 봇 차단 수준 |
|---|---|---|---|
| GoodRx | 약가 비교, 쿠폰, 약국별 가격 | 웹 스크래핑 | 매우 높음 |
| FDA Drugs@FDA | 승인 약물, ANDA, NDA, 라벨링 | API + 스크래핑 | 낮음 |
| ClinicalTrials.gov | 임상시험 등록, 결과, 모집 상태 | API + 스크래핑 | 낮음 |
| CMS Open Data | Medicare 평균 판매가, 의료 서비스 이용 | CSV/API 다운로드 | 매우 낮음 |
| NPPES NPI 디렉토리 | 의료 제공자 정보, NPI 번호, 전문과 | API + CSV | 낮음 |
| 주별 가격 투명 포털 | 병원 표준 가격, 시술별 비용 | 웹 스크래핑 | 중간~높음 |
GoodRx와 일부 주별 포털은 봇 차단이 적극적이어서 healthcare data proxies 없이는 대규모 수집이 거의 불가능합니다. 반면 FDA나 CMS 데이터는 공식 API나 벌크 다운로드로 접근하는 것이 권장됩니다.
왜 residential proxy가 필요한가
GoodRx는 약가 데이터를 집중적으로 보호합니다. 단일 IP에서 반복 요청이 감지되면 CAPTCHA, 속도 제한, IP 차단이 순차적으로 발동합니다. 데이터센터 IP 대역은 특히 빠르게 차단됩니다.
Residential proxy는 실제 가정용 ISP에서 할당된 IP를 사용하므로, 일반 사용자 트래픽과 구별이 어렵습니다. 이는 GoodRx 약가 스크래핑과 주별 가격 투명 사이트 수집에 필수적입니다.
프록시 유형별 비교
| 프록시 유형 | GoodRx 적합도 | CMS/FDA 적합도 | 비용 | IP 회전 |
|---|---|---|---|---|
| 데이터센터 | 부적합 (빠른 차단) | 적합 (API 호출용) | 낮음 | 불가 |
| Residential | 최적 | 적합 | 중간 | 요청별 회전 가능 |
| Mobile | 최적 (모바일 전용 페이지 시) | 과잉 | 높음 | 자연 회전 |
GoodRx에서 scrape drug prices 작업을 할 때는 residential proxy를 기본으로 사용하고, 모바일 전용 가격 페이지가 있는 경우 mobile proxy를 보조적으로 활용하는 전략이 효율적입니다.
Geo-targeting: 약가는 주와 우편번호마다 다릅니다
미국 약가는 주별, 심지어 ZIP 코드별로 유의미하게 다릅니다. GoodRx 쿠폰 가격, Medicaid 보상률, Medicare 평균 판매가 모두 지역 변수를 포함합니다. 마켓 액세스 팀이 의미 있는 벤치마크를 만들려면 지역별 가격 데이터를 수집해야 합니다.
ProxyHat의 geo-targeting 기능을 사용하면 특정 주나 도시의 IP로 요청을 보낼 수 있습니다:
- 캘리포니아 약가 수집:
user-country-US-state-CA - 뉴욕 특정 도시:
user-country-US-state-NY-city-newyork - 텍사스 약국 가격:
user-country-US-state-TX
이렇게 하면 GoodRx가 해당 지역 사용자에게 보여주는 실제 가격을 수집할 수 있습니다. 주별 가격 투명 포털도 같은 방식으로 지역 IP에서 접근해야 차단 없이 수집이 가능합니다.
아키텍처: 스크래핑 → 정규화 → ETL → 데이터 웨어하우스
pharma intelligence scraping 파이프라인은 단순한 스크래핑 이상의 작업입니다. 여러 소스에서 수집한 데이터를 정규화하고, 분석 가능한 형태로 변환하여 데이터 웨어하우스에 적재해야 합니다.
1단계: 수집 (Ingestion)
각 소스별로 최적의 수집 전략을 적용합니다.
- GoodRx: Residential proxy + geo-targeting + 요청 간 지연 3~6초
- FDA Drugs@FDA: 공개 API 우선, 보충용 스크래핑
- ClinicalTrials.gov: 공개 API (v2) 사용, 벌크 다운로드 가능
- CMS Open Data: CSV 벌크 다운로드 후 S3 적재
- NPPES NPI: 월간 전체 덤프 다운로드 + 증분 API 조회
2단계: 정규화 (Normalization)
소스마다 약물명, 단위, 가격 형식이 다릅니다. 정규화 단계에서 다음을 수행합니다:
- RxNorm/NDC 코드로 약물 매핑
- 가격 단위 통일 (USD, per unit vs per package)
- 날짜 형식 표준화 (ISO 8601)
- 지역 코드 표준화 (FIPS 주 코드, ZIP5)
3단계: ETL 및 적재
정규화된 데이터를 Snowflake, BigQuery, Redshift 등의 데이터 웨어하우스에 적재합니다. 일별 증분 업데이트가 권장되며, 가격 이력 추적을 위해 SCD Type 2 스키마를 사용합니다.
아래는 GoodRx 약가를 residential proxy로 geo-targeting하여 수집하는 Python 예제입니다:
import requests
from datetime import datetime
# ProxyHat residential proxy with geo-targeting for California
proxy_url = "http://user-country-US-state-CA:PASSWORD@gate.proxyhat.com:8080"
proxies = {"http": proxy_url, "https": proxy_url}
def scrape_goodrx_price(drug_name, ndc_code, state="CA"):
"""Scrape public drug price from GoodRx for a given state.
IMPORTANT: Only collects publicly displayed prices.
Does NOT collect any patient data, prescriptions, or PHI.
"""
# Rotate session for each request to avoid rate limits
session_id = f"rx-{ndc_code}-{state}-{datetime.now().strftime('%Y%m%d%H%M')}"
session_proxy = proxy_url.replace(
"user-country", f"user-country-US-state-{state}-session-{session_id}"
)
session_proxies = {"http": session_proxy, "https": session_proxy}
headers = {
"User-Agent": (
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
"AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/125.0.0.0 Safari/537.36"
),
"Accept-Language": "en-US,en;q=0.9",
}
url = f"https://www.goodrx.com/{drug_name}"
try:
resp = requests.get(url, proxies=session_proxies, headers=headers, timeout=30)
resp.raise_for_status()
# Parse publicly visible price data only
# Store: drug_name, ndc_code, state, price, pharmacy, timestamp
return {
"drug": drug_name,
"ndc": ndc_code,
"state": state,
"html": resp.text,
"scraped_at": datetime.utcnow().isoformat(),
}
except requests.RequestException as e:
print(f"Request failed for {drug_name} in {state}: {e}")
return None
# Example: collect public prices across multiple states
target_states = ["CA", "TX", "NY", "FL", "OH"]
for state in target_states:
result = scrape_goodrx_price("atorvastatin", "07777-3105-30", state)
if result:
print(f"Collected {result['drug']} price for {state}")
# Respect rate limits between requests
import time; time.sleep(4)
이 예제는 공개 가격만 수집하며, 어떤 환자 데이터도 수집하지 않습니다. 세션 ID를 포함한 sticky session으로 동일 요청 내 일관성을 유지하면서도, 요청 간에는 IP를 회전합니다.
컴플라이언스: HIPAA 경계와 공개 데이터의 한계
이 섹션이 가이드에서 가장 중요합니다. 기술적으로 수집 가능하다고 해서 법적으로 허용되는 것은 아닙니다.
HIPAA 경계: 무엇이 공개 데이터인가
HIPAA는 보건 정보의 프라이버시를 보호합니다. 핵심 구분은 다음과 같습니다:
- 수집 가능 (공개 데이터): 약가, 임상시험 등록 정보, Medicare 평균 판매가, NPI 디렉토리, FDA 승인 정보, 병원 표준 가격
- 수집 불가 (PHI/PII): 환자 기록, 처방전 개인정보, 보험 청구 개인정보, 진료 기록, 환자 식별 가능한 임상시험 결과
원칙: 데이터에 특정 개인을 식별할 수 있는 정보가 포함되어 있거나, 개인과 연결 가능하다면 수집하지 마세요. 공개 웹사이트에 있더라도 환자 식별 정보는 HIPAA 보호 대상입니다.
주별 건강 데이터 규제
연방 HIPAA 외에도 주별 규제가 추가로 적용될 수 있습니다:
- 캘리포니아 (CCPA/CPRA): 소비자 데이터 전반에 적용. 공개 데이터라도 대량 수집 시 개인 관련 정보가 포함되면 주의
- 뉴욕 (SHIELD Act): 건강 정보 유출에 특화된 규제
- 텍사스 (HB 300): HIPAA보다 엄격한 건강 정보 보호
- 기타 주: 많은 주에 추가 건강 데이터 프라이버시 법이 있음
공개 약가 데이터만 수집하더라도, 각 주의 데이터 투명 포털 이용약관을 확인해야 합니다. robots.txt와 ToS는 법적 구속력이 주마다 다르지만, 준수하는 것이 리스크 관리상 권장됩니다.
실무 컴플라이언스 체크리스트
- 수집 대상이 공개적으로 게시된 비개인 식별 정보인지 확인
- 수집 과정에서 환자 데이터가 우연히 포함될 가능성이 있는지 검토
- 각 소스의 robots.txt 준수 여부 결정 (법적 의무는 아니지만 권장)
- 각 소스의 이용약관 검토 및 법무팀 승인
- 수집된 데이터의 저장 및 암호화 정책 수립
- 주별 규제에 따른 데이터 보존 기간 설정
- 정기적인 컴플라이언스 감사 일정 수립
사용 사례
1. 마켓 액세스 약가 벤치마킹
제약사 마켓 액세스 팀은 자사 약물의 WAC(Wholesale Acquisition Cost)를 경쟁약 및 유사약의 공개 가격과 비교해야 합니다. GoodRx 가격, Medicare Part D 평균 비용, 주별 Medicaid 보상가를 종합하면 시장 내 가격 포지셔닝을 정량화할 수 있습니다.
지역별 가격 차이를 반영하기 위해 최소 10개 이상의 주에서 residential proxy로 geo-targeting하여 scrape drug prices를 수행합니다. 이 데이터를 내부 가격 모델과 결합하면 리베이트 시뮬레이션과 협상 전략 수립에 활용할 수 있습니다.
2. 임상시험 경쟁 지형 모니터링
ClinicalTrials.gov의 공개 데이터를 정기적으로 수집하면 경쟁사 임상시험 동향을 파악할 수 있습니다. 적응증별 활성 시험 수, 모집 상태, 예상 완료일 등을 추적하면 시장 진입 타이밍과 경쟁 강도를 예측합니다.
이 데이터는 완전히 공개적이며 HIPAA와 무관합니다. 다만, 임상시험 결과 섹션에서 개별 환자 데이터가 익명화되지 않은 형태로 게시된 경우는 극히 드물지만, 발견 시 즉시 수집을 중단해야 합니다.
3. 제공자 디렉토리 검증
NPPES NPI 디렉토리의 공개 데이터를 사용하여 페이어 네트워크의 제공자 정보를 검증합니다. NPI 번호, 전문과, 실습 주소, 면허 상태 등을 정기적으로 업데이트하면 디렉토리 부정확도로 인한 컴플라이언스 리스크를 줄일 수 있습니다.
NPPES 데이터는 완전히 공개이며 PHI를 포함하지 않습니다. 다만, NPI와 연결된 환자 청구 기록은 PHI이므로 절대 수집하지 마세요.
cURL을 활용한 간단 수집 예제
ProxyHat residential proxy를 사용해 특정 주의 공개 약가 페이지에 접근하는 cURL 예제입니다:
# Access GoodRx from a Texas IP via ProxyHat residential proxy
curl -x http://user-country-US-state-TX:PASSWORD@gate.proxyhat.com:8080 \
-H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36" \
-H "Accept-Language: en-US,en;q=0.9" \
-s -o goodrx_ozempic_tx.html \
"https://www.goodrx.com/ozempic"
# Access ClinicalTrials.gov API (no proxy needed — public API)
curl -s "https://clinicaltrials.gov/api/v2/studies?query.term=GLP-1+receptor+agonist&pageSize=50" \
| python3 -m json.tool > clinical_trials_glp1.json
# Download CMS Medicare Part D spending data (public CSV, no proxy needed)
curl -s -L "https://data.cms.gov/provider-data/api/1/datastore/query/5mj2-zqy6/0/download?format=csv" \
-o cms_part_d_spending.csv
공개 API와 CSV 다운로드는 프록시 없이도 가능하지만, GoodRx와 같은 봇 차단 사이트에는 residential proxy가 필수입니다.
프록시 선택 가이드: 의료 데이터 수집에 맞는 전략
모든 소스에 동일한 프록시 전략을 적용할 필요는 없습니다. 소스 특성에 맞게 최적화하세요:
- 봇 차단이 강한 소스 (GoodRx, 일부 주별 포털): Residential proxy + geo-targeting + 요청별 IP 회전
- 공개 API (FDA, ClinicalTrials.gov, NPPES): 데이터센터 proxy로 충분, 속도와 비용 면에서 유리
- 벌크 다운로드 (CMS CSV): 프록시 불필요, 직접 다운로드 후 S3 적재
- 모바일 전용 가격 페이지: Mobile proxy로 실제 모바일 환경 시뮬레이션
ProxyHat은 residential, mobile, datacenter 프록시를 모두 제공하므로, 소스별로 최적의 프록시 유형을 선택할 수 있습니다. 자세한 내용은 프록시 가격 페이지에서 확인하세요.
성능 메트릭과 모니터링
의료 데이터 스크래핑 파이프라인의 신뢰성을 유지하려면 다음 메트릭을 추적해야 합니다:
- 성공률 (Success Rate): HTTP 200 응답 비율. GoodRx의 경우 residential proxy 사용 시 85~95% 유지 목표
- 지연 시간 (Latency): residential proxy는 데이터센터보다 지연이 높지만, 안정성이 우선
- CAPTCHA 발생률: 5% 이상이면 프록시 회전 전략을 조정해야 함
- 동시성 (Concurrency): GoodRx는 동시 요청 3~5개로 제한 권장
- 데이터 신선도: 약가는 주 단위 업데이트, 임상시험은 일 단위 증분
핵심 요약
- 공개 데이터만 수집: 약가, 임상시험 등록, NPI 디렉토리, CMS 공개 데이터. 환자 데이터 절대 수집 금지.
- GoodRx와 주별 포털에는 residential proxy 필수: 데이터센터 IP는 빠르게 차단됩니다.
- Geo-targeting으로 지역별 약가 차이 포착: 주별, ZIP별 가격 변동은 마켓 액세스 전략의 핵심 입력입니다.
- 소스별 최적 전략 적용: API 가능 소스는 API 사용, 봇 차단 소스만 residential proxy 사용.
- HIPAA + 주별 규제 준수: 공개 데이터라도 컴플라이언스 검토는 필수입니다.
- 스크래핑 → 정규화 → ETL → 웨어하우스: 파이프라인 아키텍처를 체계적으로 구축하세요.
다음 단계
공개 의료 데이터 스크래핑 파이프라인을 시작하려면, 먼저 수집 대상 소스와 필요한 프록시 유형을 정의하세요. ProxyHat의 residential proxy는 GoodRx 약가 수집과 주별 가격 투명 포털 접근에 최적화되어 있으며, geo-targeting으로 50개 주 모두를 커버합니다.
웹 스크래핑 전반의 아키텍처는 웹 스크래핑 모범 사례 가이드에서, SERP 데이터 수집은 SERP 추적 유스케이스에서 확인할 수 있습니다. 전 세계 프록시 로케이션은 프록시 위치 페이지에서 확인하세요.
지금 ProxyHat 대시보드에서 계정을 만들고, 제약 인텔리전스 파이프라인을 위한 residential proxy를 시작하세요.






