이번 세션에서 진행한 작업

이번 세션에서는 전체 실행 흐름을 파악하고, 실제로 검색부터 결과 저장까지 이어지는 최소 동작을 확인했다.

완료한 작업

  • 실행 구조 파악
  • requirements.txt 추가
  • Google 기반 동작 확인
  • Google이 sorry / reCAPTCHA 차단 페이지를 반환하는 것 확인
  • headful 브라우저로 실제 차단 화면 확인
  • 검색엔진을 Google → Bing 으로 교체
  • Bing 결과 파싱 로직 추가
  • Bing 추적 링크의 원본 URL 디코드 처리 추가
  • Selenium expected_conditions import 버그 수정
  • 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 및 파일 크기 기록

작동 원리

전체 흐름

  1. 사용자가 CLI 실행
  2. CLI가 인자 파싱
  3. 설정 검증
  4. 검색 쿼리 생성
  5. Selenium으로 Bing 검색 결과 수집
  6. 각 결과 페이지 방문
  7. 본문 텍스트 및 메타 정보 수집
  8. 책 메타데이터 추출
  9. PDF 후보 링크 수집
  10. 라이선스 신호 판단
  11. 허용된 경우에만 PDF 다운로드
  12. 결과를 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이 아닌 값을 잡을 수 있음
  • 제목 역시 결과 페이지의 title fallback에 지나치게 의존하는 경우가 많음

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를 안정적으로 찾을 수 있느냐” 에 있다.

수정해야 할 부분들을 요약하면 다음과 같다.

  • 검색 결과의 관련성
  • 메타데이터 추출 정확도
  • 라이선스 판단 신뢰도