Scrapy로 웹사이트 크롤링 해보기
웹 사이트 몇 개(=네xx카페)를 지속적으로 크롤링 할 일이 생겨서 몇 가지 라이브러리를 뒤적여봤다.
처음 시도한 것은 selenium. 하지만 UI 요소에 의미있는 텍스트가 없거나, 반복해서 나타나는데 문맥 의존적으로 해석하게되면 완전 노가다. 그리고 내가 아는 범위 내에선 서버 데몬을 따로 띄우지 않고는 안되는 녀석이라 따로 돌리기 불편해서 중도 포기.
다음으론 항상 잘 써먹던, 비교적 규모가 작은 웹사이트에서 잘 써먹던 requests + html5lib. 근데 이것도 UI 요소에 의미있는 클래스나 아이디가 없어서 불편하긴 하더라. 그리고 동적으로 링크를 발견하고, 이걸 다시 특정 형태로 크롤링하게 하려니 작업량이 많아서 작업 중단.
마지막으로 scrapy를 썼고, 이런 류의 작업이 맞춘 툴이어서 이걸로 완성. 다음과 같은 방식으로 동작한다:
- 시작 url 지정
- 페이지를 긁고, 이것에 대한 parse 콜백 2-a. HTTP 요청에 대한 응답을 xpath로 뒤져서 적당한 값을 읽기 2-b. 추가로 크롤할 url을 yield. (별도로 파싱할 때 쓸 콜백도 지정) 2-c. 원하는 값을 찾으면 이걸 미리 지정한 아이템 타입으로 yield.
- 처리할 url이 남으면 2로.
2-b, c를 혼용할 수 있는게 정말 편했다.
더불어, 실재로 작업을 하는 2-a~c만 쓸 수 있는 scrapy shell {URL} 명령이 무진장 유용했음. 해당 url에 대해서 딱 콜백 시작 부분까지 진행한 ipython shell이 뜨더라. 여기서 이거저거 테스트해보고 파싱 코드를 작성하면 되더라.
그리고 작업하다가 깨달음을 하나 얻었는데, 모바일 페이지를 크롤링하는게 몇 배 쉽다. 노가다 좀 하면 requests + html5lib 로도 가능할 듯.
세 줄 요약:
- scrapy가 웹 크롤링 작업의 반복적인 부분을 줄여주고 꽤 편하게 만들어주더라
- scrapy shell {URL or file path} 완전 편함
- 모바일 페이지가 있고, 필요한 정보가 다 나온다면 이쪽을 크롤링하는게 쉽다