Python 웹 크롤러 도구 비교 및 사용 후기(Scrapy vs selenium vs Requests, urllib)

Key Kim
7 min readMar 9, 2020

--

웹 크롤러 개발 언어로 Python을 선택했다면, 개발 효율성을 높혀줄 여러가지 라이브러리와 프레임워크가 있습니다.

그 중에서 제가 사용해본 Scrapy, selenium, beautifulsoup(requests or urllib) 에 대해, 개발하면서 느낀 각각의 장,단점을 공유하고자 합니다.

웹 크롤링 프로젝트를 진행하실 때 많은 도움이 되었으면 좋겠습니다.

requests or urllib(beautifulsoup)

beautifulsoup는 HTML, XML 파일의 정보를 추출해내는 python 라이브러리입니다.

이 방식은 python 내장 모듈인 requests 혹은 urllib을 이용해 HTML를 다운로드 받고, beautifulsoup로 데이터를 추출하는 방식입니다.

이 방식은 서버에서 HTML을 다운로드 받기때문에, 서버사이드렌더링을 사용하지 않는 SPA 사이트나, javascript 렌더링을 필요로하는 사이트들은 크롤링하기가 까다롭습니다.

하지만 사용하기 매우 쉽고, 심플합니다. 멀티프로세스나 멀티스레드를 사용하면 속도도 매우 빠릅니다.

  • 장점 — 쉬움, 심플함, 빠름 (멀티프로세스, 멀티 스레드 적용시 해당)
  • 단점 — javascript 렌더링이 필요한 사이트들을 크롤링하기 어려움. 병렬처리 로직을 별도로 작성하지 않으면 느린편.

selenium

Selenium은 웹 자동화 테스트 (버튼 클릭, 스크롤 조작 등등)에 사용되는 프레임워크입니다.

셀레니움을 이용한 크롤러는 웹 페이지에서 javascript 렌더링을 통해 생성되는 데이터들을 손쉽게 가져올 수 있습니다.

인터넷 브라우저를 통해 크롤링을 하는 개념이라, 실제 보여지는 웹페이지의 전부를 가져올 수 있고, 디버깅 방법또한 직관적입니다.

하지만 웹 브라우저를 실제로 실행시키는 방법이기 때문에 속도도 많이 느리고, 메모리도 상대적으로 많이 차지합니다.

멀티프로세스를 사용해서 여러 브라우저로 크롤링하도록 하면 속도를 일정부분 개선할 수 있습니다.

팁으로 셀레니움을 사용하실 때 Docker를 사용하시면 매우 편리합니다(특히 headless 모드로 크롤링할 때 리소스 정리가 매우 쉽습니다)

  • 장점 — 사용자가 보는 웹 페이지의 모든 정보를 가져올 수 있음, javascript rendering 기능 지원, 사용방법이 직관적이고 쉬움.
  • 단점 — 느림, 메모리를 많이 차지.

scrapy

Scrapy는 크롤링을 위해 개발된 프레임워크입니다.

미들웨어, 파이프라인, javascript renderer(splash), proxy, xpath, CLI 등 다양한 기능들과 플러그인들을 사용할 수 있습니다.

병렬처리, robots.txt 준수 여부, 다운로드 속도 제어등도 설정할 수 있습니다.

Scrapy로 개발된 크롤러를 올릴 수 있는 클라우드 서비스도 제공합니다.

(물론 유료입니다 $_$)

Django 와 같은 백엔드 서비스와 연동하기도 좋고, 플러그인도 다양해서 여러모로 만능인 프레임워크입니다.

문서화도 잘 되있고, 구조도 심플해서 동작 메커니즘만 파악하시면 크롤러에 날개를 달아줄 수 있는 프레임워크입니다.

scrapy를 django와 함께 사용하실 계획이시면, 아래 포스팅을 한번 읽어보시면 좋을 것 같습니다.

굳이 단점을 꼽자면 플러그인들이 호환이 잘 안되는 편입니다.

저같은 경우에는 javascript renderer 플러그인(scrapy-splash)과 proxy(scrapy-rotating-proxies) 플러그인이 서로 호환이 안되는 문제가 있었습니다.

관련된 이슈 링크

  • 장점 — 다양한 플러그인 보유, 훌륭한 커뮤니티와 문서화, 크롤링에 필요한 다양한 기능
  • 단점 — 플러그인들끼리 서로 호환이 안되는 경우가 있을 수 있음.

정리

저는 Requests, urllib + selenium 기반으로 개발하다가, proxy, http 재요청 기능등이 필요해서 scrapy를 사용하고 있습니다.

Scrapy를 찬양하는 글이 되버린 감이 있지만, 여러가지 옵션이 있으니 진행하시는 프로젝트에 적합한 도구를 선택하시는데 도움이 되었으면 좋겠습니다.

--

--