이번 세션에서 진행한 작업
이번 세션에서는 전체 실행 흐름을 파악하고, 실제로 검색부터 결과 저장까지 이어지는 최소 동작을 확인했다.
완료한 작업
- 실행 구조 파악
requirements.txt추가- Google 기반 동작 확인
- Google이
sorry/ reCAPTCHA 차단 페이지를 반환하는 것 확인 - headful 브라우저로 실제 차단 화면 확인
- 검색엔진을 Google → Bing 으로 교체
- Bing 결과 파싱 로직 추가
- Bing 추적 링크의 원본 URL 디코드 처리 추가
- Selenium
expected_conditionsimport 버그 수정 - JSON 저장 시
Path직렬화 버그 수정 - 현재 디렉토리 아래
result/경로에 결과 JSON 생성 확인
현재 아키텍처
프로젝트는 크게 6개 계층으로 나뉜다.
1. CLI 계층
파일: book_crawler/cli.py
역할
- 명령행 인자 파싱
- 설정 검증
- 실행 진입점 제공
- 검색엔진 차단 에러를 사용자 메시지로 변환
2. 설정 / 검증 계층
book_crawler/config.py
역할
CrawlerConfig데이터 구조 정의
book_crawler/validators.py
역할
title,lang,timeout,retries,out디렉토리 상태 검증
3. 오케스트레이션 계층
파일: book_crawler/runner.py
역할
- 검색 쿼리 생성
- 검색 결과 수집 호출
- 각 결과 페이지 분석 호출
- 후보 PDF 우선순위 결정
- 다운로드 여부 판단
- 최종 JSON 결과 저장
4. 검색 / 페이지 분석 계층
파일: book_crawler/crawler.py
역할
- Selenium Chrome 드라이버 생성
- Bing 검색 URL 생성
- Bing 검색 결과 파싱
- 차단 / challenge 페이지 감지
- 결과 페이지 본문 및 메타 텍스트 수집
- 책 메타데이터 추출
- PDF 후보 링크 탐색
5. 라이선스 판단 계층
파일: book_crawler/license_detector.py
역할
- 긍정 / 부정 라이선스 키워드 탐지
- 도메인 신뢰도 판단
allowed/blocked결정
6. 다운로드 계층
파일: book_crawler/downloader.py
역할
- PDF 파일명 생성
- HEAD / GET 요청으로
application/pdf확인 - 실제 PDF 저장
- SHA-256 및 파일 크기 기록
작동 원리
전체 흐름
- 사용자가 CLI 실행
- CLI가 인자 파싱
- 설정 검증
- 검색 쿼리 생성
- Selenium으로 Bing 검색 결과 수집
- 각 결과 페이지 방문
- 본문 텍스트 및 메타 정보 수집
- 책 메타데이터 추출
- PDF 후보 링크 수집
- 라이선스 신호 판단
- 허용된 경우에만 PDF 다운로드
- 결과를
run_<uuid>.json형태로 저장
현재 검색 쿼리 생성 방식
기본적으로 아래와 같은 형태의 쿼리를 만든다.
"책 제목" "저자" filetype:pdf"책 제목" "저자" site:.edu
연도 정보가 있으면 연도 범위를 반영한 쿼리를 추가한다.
Bing 검색 결과 처리 방식
google에서는 어려움이 있어서 bing으로 시도했다. 현재 Bing 결과 페이지에서는 다음 규칙으로 결과를 추출한다.
li.b_algo블록을 개별 검색 결과로 간주h2 a에서 제목과 링크 추출.b_caption p에서 스니펫 추출- Bing 추적 링크일 경우
u=파라미터를 디코드해 실제 URL 복원
결과 페이지 분석 방식
각 결과 페이지에서 다음 정보를 수집한다.
- 페이지
title meta[name="description"]meta[property="og:description"]body텍스트
이 텍스트들을 합쳐서 아래 정보를 추정한다.
- 저자
- 출판사
- 출판 연도
- ISBN
- PDF 링크
- 라이선스 키워드
현재 결과물 저장 방식
사용자가 --out <dir> 로 지정한 경로 아래에 결과를 저장한다.
저장 파일 종류
- 실행 요약 JSON:
run_<uuid>.json - 실제 PDF:
<정제된_책제목_저자_연도>.pdf
현재 확인된 문제점
1. 검색 품질이 낮다
Bing 검색 결과 첫 페이지에 책과 무관한 결과가 포함되는 경우가 있다.
예를 들어 Think Python 검색 시 Larousse 사전 페이지가 결과로 들어왔다.
영향
- 관련 없는 페이지를 분석하게 됨
- PDF 후보를 찾지 못함
domain_untrusted로 종료될 가능성이 커짐
2. 출력 디렉토리 정책이 모순된다
현재 runner.py 는 출력 폴더를 자동 생성할 수 있는 구조인데,
validators.py 는 디렉토리가 미리 존재해야 통과한다.
즉, 사용자는 실행 전에 mkdir -p result 같은 사전 작업을 해야 한다.
3. 메타데이터 추출 정확도가 낮다
- 연도 정규식이 페이지 내 아무 숫자나 잡을 수 있음
- ISBN 정규식도 실제 ISBN이 아닌 값을 잡을 수 있음
- 제목 역시 결과 페이지의
titlefallback에 지나치게 의존하는 경우가 많음
4. 도메인 신뢰도 규칙이 거칠다
현재는 .edu, .ac, .gov, .org 위주로 신뢰 도메인을 판단하고 있다.
문제
- 정상적인 공식 배포 도메인도 쉽게 차단될 수 있음
- 반대로 예외 케이스를 충분히 구분하지 못함
5. 검색엔진 의존성이 크다
- Google은 현재 차단됨
- Bing도 추후 rate-limit 또는 challenge를 걸 가능성이 있음
- 검색엔진이 바뀌면 CSS selector를 다시 수정해야 함
다음으로 수정해야 할 사항
우선순위 높음
검색 결과 관련성 필터 추가
아래 기준으로 검색 결과 점수를 매기고 상위 결과만 분석하도록 개선할 필요가 있다.
- 제목 / 저자 토큰 매칭 점수
pdf,book,edition,isbn키워드 가중치- 사전 / 포럼 / 잡음성 도메인 감점
출력 디렉토리 자동 생성 정책 통일
둘 중 하나로 명확히 정리해야 한다.
validators.py에서 없는 디렉토리를 허용- 또는 CLI 진입 단계에서 출력 디렉토리를 미리 생성
메타데이터 추출 정교화
- ISBN 체크섬 검증 추가
- 연도 / 출판사 후보 스코어링
- 저자 추출 패턴 개선
테스트 추가
예상되는 최소 테스트 범위는 다음과 같다.
- Bing 결과 HTML fixture 파싱 테스트
- PDF 후보 추출 테스트
- 라이선스 판별 테스트
- 메타데이터 추출 테스트
문서 보강
- 설치 방법
- 실행 예시
- 결과 JSON 예시
- known limitations
현재 상태 결론
현재 프로젝트는 실행 가능한 프로토타입 단계까지는 도달했다. 정리하면, 지금 단계의 평가는 다음과 같다.
실행은 가능한 프로토타입이지만, 검색 품질과 판단 품질을 더 보강해야 하는 상태
마무리
이번 세션에서는 단순히 “코드가 돌아간다” 수준을 넘어서, 실제로 검색엔진 차단 문제를 확인하고 우회 가능한 구조로 수정했으며, 최소한의 end-to-end 실행 흐름을 검증했다는 점에서 의미가 있었다.
다만 이 프로젝트의 핵심 가치는 결국 “정말로 관련 있고, 합법적으로 배포된 PDF를 안정적으로 찾을 수 있느냐” 에 있다.
수정해야 할 부분들을 요약하면 다음과 같다.
- 검색 결과의 관련성
- 메타데이터 추출 정확도
- 라이선스 판단 신뢰도