웹 수집 자동화가 중간에 멈췄을 때 처음부터 다시 돌리지 않는 구조

중단 후 재개 가능한 Web-to-CSV Python 소스 키트 실제 제품 개요

여러 웹페이지를 CSV로 모으는 자동화는 첫 실행보다 두 번째 실행에서 품질이 드러납니다. 100개 중 70개를 처리한 뒤 네트워크가 끊겼는데, 다시 실행하자 앞의 70개까지 처음부터 방문한다면 작업은 돌아가도 운영에는 쓰기 어렵습니다.

그래서 이번에 만든 Resumable Web-to-CSV Pipeline Kit에서는 ‘잠깐 실패한 요청을 다시 시도하는 것’과 ‘프로그램이 끝난 뒤 다음 실행에서 이어가는 것’을 다른 문제로 다뤘습니다. 구매자에게 전달하는 압축 파일을 새 폴더에 풀어 10개 검사를 실행했고, 동봉한 오프라인 데모에서는 성공 2건·실패 0건·중복 1건 건너뜀을 확인했습니다.

재시도와 재개는 같은 기능이 아니었습니다

재시도는 한 주소를 요청하다가 일시적인 오류가 났을 때 같은 실행 안에서 다시 요청하는 기능입니다. 반면 재개는 프로그램을 닫았거나 컴퓨터를 다시 켠 뒤에도 이전 실행에서 끝낸 항목을 기억하는 기능입니다. 둘을 하나의 반복문으로 묶으면 잠깐의 통신 오류와 작업 전체의 중단을 구분하기 어려워집니다.

소스 키트에서는 항목별 재시도 횟수와 대기 시간을 설정으로 두고, 최종 성공한 ID는 별도의 상태 파일에 기록합니다. 다음 실행은 상태 파일을 먼저 읽어 완료 ID를 제외한 뒤 남은 주소만 처리합니다. 실패 횟수를 늘리는 것으로 중단 복구를 대신하지 않는 구조입니다.

완료 표시를 CSV에만 의존하지 않았습니다

CSV의 마지막 줄을 읽어 진행 위치를 추측하는 방법은 단순하지만, 정렬이 바뀌거나 중간 행이 비어 있으면 어느 항목까지 끝났는지 모호해집니다. 출력 형식을 바꾸는 순간 진행 상태까지 함께 깨질 수도 있습니다.

이 키트는 레코드의 고유 ID와 완료 목록을 상태 파일에 따로 둡니다. CSV는 결과 데이터, 상태 파일은 작업 진행이라는 역할을 분리했습니다. 같은 ID가 입력 목록에 다시 나타나면 이미 완료됐는지 확인하고 건너뛰므로 결과에 같은 레코드가 한 번 더 붙는 일을 막습니다.

설정이 달라졌는데 옛 완료 목록을 그대로 쓰면 더 위험했습니다

수집할 필드나 주소 목록을 바꾼 뒤 과거 상태 파일을 그대로 재사용하면 새 설정으로 다시 받아야 할 항목까지 완료된 것으로 오해할 수 있습니다. 그래서 설정 내용을 기준으로 지문을 만들고, 현재 설정과 상태 파일의 지문이 맞는지 확인하도록 했습니다.

지문이 다르면 조용히 이어서 실행하지 않고 차이를 드러냅니다. 사용자가 상태 파일을 분리하거나 새 작업으로 시작할 수 있게 하기 위해서입니다. 자동으로 넘어가는 편이 편해 보여도, 다른 규칙으로 모은 데이터가 한 CSV에 섞이는 것이 더 큰 문제였습니다.

저장 도중 멈춰도 이전 파일을 잃지 않게 했습니다

상태 파일이나 CSV를 직접 덮어쓰는 순간 프로그램이 종료되면 파일이 절반만 남을 수 있습니다. 다음 실행에서 그 손상된 파일을 읽으면 재개 기능 자체가 실패합니다. 이 때문에 새 내용을 임시 파일에 완성한 뒤 최종 파일로 바꾸는 원자적 저장 방식을 사용했습니다.

로그에는 주소 전체의 민감한 쿼리 문자열이나 페이지 본문을 무작정 남기지 않습니다. 항목 ID, 결과 상태, 오류 종류처럼 재실행 판단에 필요한 정보만 JSONL로 기록하고, 사람은 HTML 보고서에서 성공·실패·건너뜀 수를 확인할 수 있게 했습니다.

실제 전달 파일에서는 10개 검사와 중복 건너뜀을 다시 확인했습니다

압축 해제본 10개 검사와 성공 2건 실패 0건 중복 1건 건너뜀 실제 결과

개발 폴더에서만 통과한 결과는 구매자가 받는 파일의 증거가 아닙니다. 판매용 ZIP을 새 폴더에 풀어 동봉된 검사를 실행했고 10개가 모두 통과했습니다. 이어 오프라인 HTML 표본으로 데모를 두 번 돌렸습니다.

첫 실행에서는 서로 다른 두 레코드가 CSV에 기록됐고 실패는 없었습니다. 별도 중단 검사는 첫 레코드 저장 직후 KeyboardInterrupt를 강제로 발생시켰습니다. 다시 실행했을 때 이미 저장된 첫 레코드는 재수집하지 않고 남은 레코드만 처리해 전체 CSV를 완성했습니다. 입력에 같은 ID가 한 번 더 있었지만 중복 1건으로 기록하고 안전하게 건너뛰었습니다. 실제 보고서 화면과 검사 수치는 공개 제품 저장소에서 볼 수 있습니다.

38초로 강제 중단 복구 흐름 보기

아래 영상은 동봉된 고정 오프라인 표본에서 첫 레코드를 영속화한 뒤 프로세스를 강제로 중단하고, 다음 실행이 완료 레코드를 다시 수집하지 않는 흐름을 38초로 압축한 증거입니다. 모든 웹사이트에 대한 보장이 아니라 이 표본의 실제 검사 범위입니다.

실패 경계, 체크포인트 순서, 30분 run → stop → resume 실습은 무료 6쪽 미리보기와 $9 필드 매뉴얼에서 확인할 수 있습니다. 맞춤 설정·원격 설치·지속 지원·향후 업데이트는 포함하지 않습니다.

사이트마다 바뀌는 부분은 JSON 설정으로 밖으로 뺐습니다

주소, 레코드 ID 규칙, 가져올 필드와 CSS 선택자를 코드 안에 박아 두면 사이트 하나가 바뀔 때마다 Python 파일을 고쳐야 합니다. 키트에서는 이 값을 JSON 설정으로 분리했습니다. 허용된 페이지의 구조를 확인한 뒤 설정 파일에서 필드를 바꾸고, 실제 코드 흐름은 그대로 유지하는 방식입니다.

다만 이것이 모든 사이트를 자동으로 알아서 읽는다는 뜻은 아닙니다. 사용자는 자신이 소유했거나 자동화 권한이 있는 페이지에 맞는 선택자를 직접 넣어야 합니다. 로그인·캡차·접근 제어·속도 제한·robots 규칙·사이트 약관을 우회하지 않으며, 맞춤 셀렉터 제작이나 원격 설정도 판매 범위에 포함하지 않았습니다.

완성형 소스가 필요한 경우에만 내려받으면 됩니다

Resumable Web-to-CSV Pipeline Kit은 전체 Python 소스, 설정 예제, 테스트, 오프라인 데모와 실행 문서를 묶은 일회성 다운로드 제품입니다. Personal은 1인용 $24, Team은 같은 법인 안의 최대 5인용 $59입니다.

맞춤 개발, 원격 설정, 지속 지원, 향후 업데이트는 포함하지 않습니다. 구매 전에 공개 저장소의 실제 화면과 검사 결과를 먼저 보고, 자기 작업에 필요한 선택자를 직접 정할 수 있을 때만 사용하는 범위입니다.

확인한 기준

2026년 7월 30일 구매자 전달용 Personal·Team 압축 파일을 각각 새 폴더에 풀어 암호화 전달과 라이선스 분리를 확인했습니다. 소스 키트 검사 10개 통과, 오프라인 데모 성공 2건·실패 0건·중복 1건 건너뜀, 첫 레코드 저장 직후 KeyboardInterrupt를 강제로 발생시킨 뒤 재실행해 완료 레코드가 재수집되지 않는지도 대조했습니다.

댓글

이 블로그의 인기 게시물

CSV 정리 자동화, 삭제 기능보다 감사 보고서를 먼저 만든 이유

뤼튼 무료 범위와 크랙 결제, 무료 AI와 유료 콘텐츠를 나눠 보세요

ChatGPT 대화 기록 삭제와 학습 제외, 임시채팅까지 따로 봐야 합니다