[Python] 크롤링 이슈 해결

임기범·2022년 7월 14일
0

SW Maestro 프로젝트의 일환으로 여기어때 웹사이트를 크롤링하여 DB에 저장하는 작업에 착수했다.
요구사항을 순서대로 정리해 보면 다음과 같다.

  1. URL 쿼리를 변경해 가며 숙박 상품의 상세페이지 html파일을 가져온다.
  2. 1에서 크롤링한 html 파일을 서버에 임시 저장한다.
  3. 2에서 저장한 html파일을 파싱하여 여러 정보를 DB에 저장한다.
  4. 파싱한 html파일을 서버에서 삭제한다.

다음 스프린트까지 1~4의 과정을 EC2 인스턴스 내에서 자동으로 이루어지도록 하는 것이 목표이며, 오늘은 1을 구현하면서 시행착오를 겪었던 과정들을 정리해보고자 한다.

Problem

Scrapy

Python 기반 크롤링 프레임워크이다. 나름 최신 기술이고 빠른 성능과 획기적인 기능 지원으로 크롤링 프레임워크로 급부상중인 훌륭한 프레임워크이다... 하지만

m1 맥에서 발생하는 이슈로 인해 삽질만 하다가 결국 사용을 포기했다.

로컬에서 작업하고 서버에 올리는 것이 아니라, EC2 인스턴스에서 다이렉트로 작업하려는 시도도 해 보았으나, 환경 구축하는 데에 또 이슈가 생겨서 결국 스크래피 사용은 포기했다.

requests

원시적이지만 확실한 방법. URL 리퀘스트를 넣어서 html 파일을 받아오는 방식이다.
html을 원시적으로 받아와서 마크다운 문서를 파싱해서 정보를 뽑아내면 된다.
이전에 인턴으로 활동했던 연구실에서도, XML 문서를 파싱해서 Coverage를 뽑아냈던 경험이 있어 문제 없이 잘 이뤄질 거라 확신했다.

하지만 또다른 문제에 봉착했는데,, 기껏 받아온 html 문서에 유효한 정보가 하나도 없는 것이었다.
가져와야 하는 가장 중요한 정보 중 하나가 바로 가격인데, 가격에 대한 정보를 도저히 찾을 수 없었다.

Selenium

나는 위 문제점이 클라이언트에서 정보를 렌더링해 새로운 html문서에서만 가격 등의 정보를 조회할 수 있는 것이라고 생각했다.

그래서 동적으로 html 파일을 가져올 수 있는 Selenium을 활용해보았다.

웹 어플리케이션 테스트를 위한 프레임워크로 개발되었지만, 브라우저를 자동화하여 조작할 수 있는 장점 덕택에 동적 웹 크롤링 도구로 각곽받고 있다. 이 녀석을 통해 크롤링이 잘 되는 것을 확인할 수 있었는데, 내가 간과한 문제점이 있었다.

바로 Python %-formatting 문법의 잘못된 사용이었다.

BASE_URL = "https://www.goodchoice.kr/"
BASE_URL_TEMPLATE = BASE_URL + "product/detail?ano={%d}&adcno={%d}&sel_date={%s}&sel_date2={%s}"

% 변수를 중괄호로 감싸 버려 실제 리퀘스트로 들어가는 URL에 중괄호가 포함된다.
때문에, 여기어때 백엔드 어플리케이션은 잘못된 URL로 판단해 에러 페이지를 리턴하게 된다.

Solution

다음 코드로 수정 후 정상적으로 작동하는 것을 확인할 수 있었다.

BASE_URL = "https://www.goodchoice.kr/"
BASE_URL_TEMPLATE = BASE_URL + "product/detail?ano=%d&adcno=%d&sel_date=%s&sel_date2=%s"

바보같은 실수였다.
응답 상태 코드를 확인했다면 이렇게 오랜 시간 헤매지 않았을 것이다.
앞으로는 좀 더 꼼꼼하고 사소한 실수를 미연에 방지하기 위한 의식적인 노력을 통해 이번과 같은 일이 없도록 주의해야겠다!

profile
장래희망: 초고수 개발자

0개의 댓글