Python웹크롤링트러블슈팅데이터QA
📝 상황
데이터 수집 자동화가 성공적으로 끝나도, 실제 결과물이 신뢰할 수 있는지는 별도의 검증이 필요하다.
이를 위해 QA 스크립트를 추가하여 수집된 데이터의 품질을 점검했다.
🔍 주요 점검 항목
링크 상태 검증
ok / bad / error / skip네 가지로 분류하고, 상세 사유까지 기록한다.
def check_url(url, timeout=12):
try:
r = requests.head(url, allow_redirects=True, timeout=timeout)
if r.status_code >= 400 or r.status_code in (405, 403):
r = requests.get(url, allow_redirects=True, timeout=timeout)
return "ok" if 200 <= r.status_code < 400 else "bad"
except Exception:
return "error"
기간 컬럼 판정
기간 문자열에서 종료일을 파싱하거나 키워드로 상태를 판정한다.
def judge_period_status(period_str, today=date.today()):
if "상시" in period_str or "수시" in period_str:
return "진행중"
if "마감" in period_str or "종료" in period_str:
return "마감"
# 종료일 날짜 파싱
m = DATE_RANGE_RE.search(period_str)
if m:
end_dt = date(int(m.group(4)), int(m.group(5)), int(m.group(6)))
return "진행중" if end_dt >= today else "마감"
return "확인불가"
QA 요약 통계 출력
총 건수 / 중복 제거 건수
필수 키워드 포함 여부
기간 컬럼 빈값 수
링크 정상률, 실패 유형
기간 상태(진행중/마감/확인불가)
유효 데이터 비율 + 실행 시간
print("=== QA SUMMARY ===")
print(f"총 건수: {total} (중복제거 후 {dedup})")
print(f"링크 정상: {ok_cnt}, 실패: bad={bad_cnt}, error={err_cnt}, skip={skip_cnt}")
print(f"모집기간 상태: 진행중={cnt_open}, 마감={cnt_closed}, 확인불가={cnt_tbd}")
print(f"👉 유효 데이터: {valid_cnt}/{total} ({valid_ratio:.0f}%)")
로그 및 리포트
실패 케이스만
qa_link_failures.csv저장필요 시 전체 리포트도 CSV로 출력 가능
✅ 결과
단순 수집 성공 여부가 아니라, 링크 유효성·기간 상태·키워드 적합성까지 수치화 가능해졌다.
실패 케이스를 CSV로 기록하여, 추후 재현성과 개선 포인트 확보가 쉬워졌다.
💡 실무 인사이트
데이터 QA는 신뢰도 확보의 핵심
수집만으로는 부족하다. 품질 검증이 있어야 실제 활용이 가능하다.
QA는 에러 찾기가 아니라 품질 지표화 과정
정상률, 실패 유형, 유효 비율 등을 지표로 관리할 수 있다.
로그는 곧 개선의 단서
실패 내역을 CSV로 저장하면, 재현성 있는 문제 추적과 고도화가 가능하다.