API에서 데이터 가져오기
첫 대상은 소상공인시장진흥공단 상가(상권)정보 API. 활용가이드의 오퍼레이션 명세를 읽고, requests.get(url, params=payload) 로 요청을 조립하는 것부터 시작했다.
url = "http://apis.data.go.kr/B553077/api/open/sdsc2/storeListInUpjong"
payload = dict(divId="indsSclsCd", key="I21006", # 소분류코드(치킨)
numOfRows=100, pageNo=1, type="json",
serviceKey=os.getenv("service_key"))
r = requests.get(url, params=payload)핵심 학습 포인트:
- 응답 코드 확인(200 정상),
r.text/r.json()의 차이 totalCount를 뽑아 전체 페이지 수를 계산하고 반복 수집(페이지네이션)- 같은 데이터를
json과xml두 포맷으로 받아 비교 - 수집 결과를
DataFrame으로 정리해 CSV로 저장 time.sleep()으로 API 호출 속도를 조절해 서버 부담 줄이기
크롤링으로 환율 수집 자동화
API가 없는 데이터는 직접 긁는다. 하나은행 환율 페이지를 pd.read_html 로 읽었다. 이때 OSError 를 만났는데, HTML 텍스트를 파일처럼 다루기 위해 StringIO 로 감싸는 방법을 배웠다.
datetime과pd.date_range로 날짜를 생성해 여러 날치를 반복 수집(스케줄러 개념)- 수집된 DataFrame의 컬럼 이름을
.columns/.values로 정리 - 최종 결과를 DB에 저장
Selenium과 DB 구성
정적 요청으로 안 되는 페이지는 Selenium으로 브라우저를 직접 제어했다. 그리고 수집한 데이터를 SQLAlchemy + pymysql 로 MySQL에 적재하며, 크롤링 → 정제 → 저장으로 이어지는 자동 수집 파이프라인을 처음 완성했다.
정리
"데이터를 어디서, 어떻게 가져오는가"에는 여러 층이 있다는 걸 배웠다. API가 가장 깔끔하고, 없으면 정적 크롤링, 그것도 막히면 브라우저 자동화. 그리고 가져온 데이터는 결국 DB에 쌓여야 반복 가능한 자산이 된다.