이번 프로젝트에서는 서버에서 블로그 본문 데이터를 크롤링해 온 다음 이를 분석하여 클라이언트에 반환하는 기능을 구현했다. 이 과정에서 Scrapy를 공부하고 사용한 내용을 기록하고자 한다.
Scrapy 튜토리얼2 - 네이버 검색결과 크롤링(크롤러 설정)
Scrapy 튜토리얼3 - 네이버 검색결과 크롤링(데이터 추출)
웹 크롤링은 대표적으로 BeautifulSoup와 Selenium을 사용한다. 배우기 쉽고, 한국어 자료도 방대한 장점이 있다.
다만 내가 프로젝트에서 두 라이브러리 대신 Scrapy를 사용한 이유는 3가지가 있다.
Webdriver를 호출하는 Selenium의 속도저하 문제
Selenium은 실제 웹페이지를 띄우고, 렌더링되는 시간을 기다려야 크롤링이 가능하다. 지도나 무한 스크롤같은 동적인 페이지를 크롤링해야 한다면 Selenium을 사용하는 것이 맞다.
그러나 나는 정적인 페이지를 크롤링하고, BeautifulSoup이나 Scrapy와 비교했을때 훨씬 많은 시간을 소요해 선택하지 않았다.
동기적으로 동작하는 BeautifulSoup
BeautifulSoup와 Scrapy는 둘 다 request를 보냈을 때 response를 그대로 받아온다는 점에서 동일하다.
이 둘의 차이점은 BeautifulSoup은 동기적으로, Scrapy는 비동기적으로 동작한다는 것이다.
쉽게 말해 BeautifulSoup은 페이지 크롤링하는 동안 어떤 코드도 수행할 수 없어 대기해야 한다. 그러나 Scrapy는 페이지를 크롤링하는 동안 다른 동작을 수행할 수 있다.
따라서 시간적으로 봤을때 BeautifulSoup는 Scrapy보다 더 많은 시간을 소요한다. BeautifulSoup와 multiprocessing을 함께 사용하면 상당히 빨라지지만 프로젝트 특성상 이후에도 많은 멀티스레딩을 동원하기 때문에 추가적으로 멀티프로세스를 호출하는 것이 오버헤드 측면에서 부담스러웠다.
Scrapy의 확장성 및 편의
BeautifulSoup가 단순히 html에서 정보를 가져오는데 그친다면 Scrapy는 확장성 측면에서 상당히 유연하다. middleware를 사용자가 직접 손볼 수 있고 데이터를 다운로드 하거나 하는 등의 여러 확장이 자유롭다.
더불어, 필자는 블로그에서 본문데이터를 가져오는 작업을 진행했는데 BeautifulSoup보다는 Scrapy가 하위 태그에서 텍스트만 골라 가져오는 것이 더 편리했다.(이것은 개인적인 의견일 수도 있다.)
한국에서는 Scrapy를 잘 사용하지 않는지 한국어 자료보다는 영어자료가 훨씬 많았다. 다행스러운 점은 스택오버플로우 등 영어권에는 Scrapy 자료가 훨씬 방대하다.
이러저러한 이유로 결론은 Scrapy를 선택했다는 것이다.
Scrapy가 BeautifulSoup와 Selenium에 비해서 배우기 어렵고 한국어 자료도 많이 없는 단점은 있다.
그러나 공식문서 튜토리얼을 따라가며 배우다보면 대략적으로 어떻게 동작하는지 이해하는 데에는 오래걸리지 않는다.
다음 포스트에서 본격적으로 Scrapy를 어떻게 사용하는지에 대해 소개하도록 하겠다.
'Python' 카테고리의 다른 글
[Scrapy] Scrapy 튜토리얼3 - 네이버 검색 결과 크롤링(데이터 추출) (0) | 2022.03.17 |
---|---|
[Scrapy] Scrapy 튜토리얼2 - 네이버 검색 결과 크롤링(크롤러 설정) (0) | 2022.03.17 |
[Python] string to Json (Json.loads()) 파싱 문제 (0) | 2022.03.10 |
[셀레니움 Selenium] 네이버 검색결과 스크롤 크롤링 (0) | 2022.01.08 |
[pandas] Dataframe append 속도 저하 문제 (0) | 2021.12.08 |