scrapy

한상우·2022년 5월 19일
0

때는 2021년 7월 교내 여름 학기 현장 프로젝트로 나와 동기 2명을 포함해 3명은 stackLounge 라는 개발자들에게 기업의 기술 스택을 공유해주는 프로젝트를 진행하고 있었다.


나의 역할은 단순했다.
  1. 각 기업별 사용하는 기술스택을 받아오기
  2. 받아온 데이터를 DB에 저장하기
  3. 위 과정을 컨테이너로 묶어 배포하기

지금 생각해보면 되게 간단했지만, 당시의 나는 DB를 한번도.. 사용해보지 않았다.
또한 당시로서는 굉장히 트렌디하다고 생각한 도커 라는 기술을 사용해보자고 으쌰으쌰 했다.

그렇게 시작된 프로젝트는 처음부터 막혔다. 바로 크롤링 부분


그 당시에 내가 아는 크롤링이란 파이썬으로 selenium을 사용하거나 bs4를 써보는게 전부였다.
그리고 내가 크롤링하고자 하는 사이트는 programmers, kiwizzle, jumpit 이 3군데 였다.

크롤링 순서는 단순하다.

  1. 웹 사이트가 제공하는 기업의 채용공고 페이지로 간다.
  2. 페이지의 맨 마지막 부분이 어디인지 알아낸다. (마지막 페이지)
  3. 현재 페이지의 각 기업의 공고문에 들어간다.
  4. 공고문에 보통 요구하는 기술 스택이 있어 이를 받아온다.
  5. 3-4 과정을 마지막 페이지까지 반복한다.

이렇게 순서도를 생각하고 바로 구현을 시작했다. chrome driver를 다운받고 selenium으로 구현을 쉽게 할 수 있었고, 코드를 실행시켰다.


뭔가 잘못되었다는 것을 깨달았다.

selenium의 속도가 너무 느리다.

위 순서는 단순했지만, 너무 느렸다. 프로그래머스 하나의 사이트만 크롤링하는데 32분 가량 소모되었다. 당시의 나는 개발에 대해 잘 모르는 상태였지만, 이 속도는 용납하지 못했다. 오랜 고민 끝에 나는 코드를 뒤엎었다. 처음부터 시작이다.


문제가 어디인지 고민했다. 그리고 난 selenium의 속도가 너무 느리다는 것이 문제점이라 판단했다. 그렇다면 selenium을 대체할 크롤링 도구가 뭐가 있을지 찾아보니 scrapy라는 도구를 발견했다. (scrapy는 비동기 네트워킹 라이브러리를 기반으로 합니다)

발견하고 너무 좋아했지만, 이내 scrapy는 selnium처럼 페이지를 렌더링 하지 않는다는 것을 확인했다. 이는 지정된 url만 조회 가능하다는 것인데, 내가 크롤링하고자 하는 사이트에서는 js 렌더링을 해야 이후 과정이 진행되었기에 문제가 생겼다.

이때 api의 개념에 대해 알게 되었다.

결국에는 웹사이트에서도 어떤 데이터를 클라이언트에세 보여주기위해 어딘가에서 api를 받아오는 것이라 생각했다. 그리고 페이지가 새로고침 되는 과정을 분석한 결과 각 사이트별로 데이터를 받아오는 api가 존재한다는 사실을 알게 되었다. 이를 활용하니 화면을 렌더링 할 필요도 없어 scrapy를 사용할 수 있었다. 특정 api에 들어가보니 json 형태로 데이터들이 나열되어 있었기에 이를 잘 가공하여 원하는 데이터만 뽑아냈다.

scrapy의 사용으로 크롤링을 다시 진행하자 30 ~ 40초가 나왔다.

개선할 여지가 있다 느끼면 바로 개선해버리자!!

깃허브

profile
안녕하세요 ^^

0개의 댓글