Skip to content
This repository has been archived by the owner on Apr 6, 2022. It is now read-only.

크롤러 만들 때 꿀팁

Sean Hong(홍성민) edited this page Jul 23, 2021 · 1 revision

Introduction

기본적으로 파이썬으로 크롤러를 만들때 사용되는 라이브러리에 대해서 설명하겠다. 내가 사용해본 것들만. 그 후 Javascript로 렌더링되는 페이지를 다룰 때 대응할 수 있는 방법에 대해서 적어보겠다.

BeautifulSoup

가장 기본적으로 파이썬으로 스파이더를 구현할 때 사용되는 라이브러리다. 기본적으로 low level이기 때문에 http를 위한 requests 라이브러리를 별도로 사용해야된다. 장점으로는 기초 크롤러에 대한 개념을 잡기 쉽다.(html 내에 tag와 attribute 다루는 것부터 세부적인 Parsing까지) 단점으로는 역시 기초적인 html parsing library 기 때문에 js render에 대한 처리가 되지 않고, 데이터를 처리하기 위한 pipelining 이 제공되지 않아서 별도로 만들어줘야 되는 불편함이 있다.

Selenium

Web testing tool 로 나와서 애초 목적은 서비스 페이지에 대한 모니터링 및 테스트 실행으로 만들어졌지만, 크롤링에도 사용이된다. Selenium의 특징은 역시 browser driver을 사용하기 때문에 해당 드라이버로 처리가 된 페이지를 읽어올 수 있다는 점이다. 따라서 Selenium의 가장 큰 장점으로는 JS로 렌더링되는 페이지의 내용을 읽을 수 있다는 점이다. 요즘처럼 다양한 JS framework으로 만들어지는 반응형 웹이 많아지고 있기 때문에 Selenium으로 해당 문제를 해결할 수 있다. 다만, 브라우저 드라이버를 깔아야하고, non-textual resource(이미지, 동영상 등) 을 읽고 저장하기 때문에 무겁고 느려질 수 있다.

Scrapy

Scrapy 는 현재 Stack Lounge 를 진행하면서 프로젝트에 필요한 기술 스택 데이터를 모으는데 사용하고 있다. Scrapy를 사용하면서 느낀점은 역시 Framework으로 제공되기 때문에 작업하도 수월하고 참고할 수 있는 문서와 Stackoverflow 질문도 많다. 그리고 개인적으로 가장 좋다고 느끼는 것은 Item으로 DB 스키마 모델로 사용할 수 있고, Pipeline을 통해서 데이터베이스 daemon과 통신할 수 있다는 점이다. 또한 비동기를 지원하기 위해 asyncio와 일부 coroutine을 지원한다(coroutine에 대한 설명 참고) 물론 아직까지 사용해본 결과, JS rendering은 따로 처리 해주지 않는걸로 알고 있고, 정식 문서에도 이러한 동적으로 로딩되는 페이지를 읽지 못하는 문제를 처리하는 여러가지 추천방법이 나와있다.

Dynamic Content

이제 동적으로 로딩되는 html 자료를 크롤링 하기위한 방법들이다.

  • Selenium 사용

    • 위에서 말했듯이 browser driver 로 렌더링을 마친 후에 페이지 내용을 읽어오기 때문에 동적으로 로딩되는 html을 렌더링 된 이후로 읽을 수 있다.
  • API 사용

    • Stack Lounge 에서도 사용되는 방법이다. JS 렌더링을 하기위해서는 필요한 정보를 해당 웹 서버에서 호출을 한다. 최소 요즘 만들어진 사이트들은 웹 페이지에 대한 api endpoint를 두고 있어서 필요한 정보를 해당 endpoint 를 통해 호출한다. 이 정보는 사용하는 브라우저의 웹 인스펙터의 생성되는 XHR 을 참고해서 원하는 api endpoint를 찾을 수 있다. 심심풀이로 탐구해본 직방과 네이버 맵 내부 api 를 정리한 저장소를 참고해도 좋을 수 있다. 최신화는 안되어 있어서 안되면 말고 ㅇㅇ
  • 다른 방법있으면 업데이트 해보자