파이썬 웹 스크래핑할 때 이거 쓰세요. 최고의 파이썬 웹 스크래핑 솔루션 scrapy
최근에 부동산에 관심을 많이 가지게 되면서 부동산 공부 및 그와 관련된 데이터를 수집하는 일에 관심을 가지게 되었습니다.
데이터를 수집할 때 쉽게 이용할 수 있는 방법은 데이터의 바다인 웹에서 데이터를 가져오는 것인데요. 이 과정을 크롤링(crawling) 또는 스크래핑(scraping)이라고 합니다.
이번 포스팅에서는 제가 최근에 사용했던 크롤러 솔루션인 scrapy를 소개하고자 합니다.
| 기존 크롤링할 때의 문제점
보통 크롤링을 할 때 수집할 데이터가 적은 경우에는 간단한 프로그래밍만으로도 원하는 데이터를 충분히 가져올 수 있습니다. 하지만 가져올 데이터양과 데이터를 소싱할 URL 수가 많아지면 크롤러의 소스 코드 수도 그만큼 복잡하고 길어지게 됩니다. 그에 따라 유지보수가 아주 어려워 지고 예외사항에 취약한 크롤러가 되기 마련이죠. 이렇게 잘못 작성된 크롤러는 다음과 같은 문제점을 지니고 있습니다.
- 코드 라인 수가 많아짐에 따라 크롤러의 각 부분 (데이터를 받는 부분, 비즈니스 로직 처리하는 부분 등)이 강하게 결합되어 유지보수하기 어려워짐
- 기본적인 예외처리가 되지 않을 경우 한 번의 request error가 날 때 뒤이은 request 및 비즈니스 로직과 함께 어플리케이션이 정지되버림
- 하나의 요청 처리가 길어지게 되면 다른 요청이 처리가 안되기 때문에 데이터 처리 시간이 늦어지게 됨(일종의 critical path가 생겨버림)
| Scrapy?
scrapy는 이러한 단점을 보완하고 유지보수하기 쉬운 크롤러를 제작하기 위한 오픈소스 솔루션입니다. scrapy크롤러를 만들기 위한 코드를 프레임워크로서 제공함으로서 유지보수 및 예외사항에 대비한 견고한 코드를 작성하도록 도와줍니다.
scrapy는 위의 문제점을 아래와 같은 방법으로 보완하고 있습니다.
- spider, item, pipeline, selector 등으로 모듈화하여 유지 보수가 쉬운 코드를 작성하고 그에 따라 불필요한 boilerplate를 작성할 필요가 없어짐
- 기본적으로 비동기 요청으로 크롤링을 하기 때문에 하나의 요청이 에러가 났을 경우 그 요청한 것 외에 다른 요청과 비즈니스 로직들은 그 후에도 스케줄대로 처리됨
- 또한 비동기 요청으로 작동되므로 다른 요청이 늦어짐에 따른 데이터 처리 지연이 일어나지 않음
이 밖에도 크롤링을 할 때 쓰일 유용한 도구들 및 코드 모듈을 제공함으로서 크롤러를 제작하는 데 드는 시간을 획기적으로 줄여줍니다.
| Scrapy 아키텍처
<출처 : https://docs.scrapy.org/en/latest/topics/architecture.html>
위 그림은 scrapy의 전체적인 아키텍처를 나타낸 사진입니다. scrapy를 사용하기 위해서는 위 아키텍처에 대한 이해가 필수입니다! 이 아키텍처를 통해 scrapy가 어떻게 데이터를 요청하는 지 그리고 받아온 데이터를 어떻게 처리하는 지를 모르면 크롤러를 작성하는 것이 매우 어렵게 될 수 밖에 없습니다.
scrapy는 scrapy 내에서 작동되는 Engine를 통해 각 모듈을 효율적으로 동작시키며 데이터를 요청 및 처리하게 됩니다. 이에 따른 메커니즘을 간략하게 설명해보자면
1. Spider 모듈을 통해 웹에 데이터를 요청하게 됩니다. 이때 중요한 것은 각 요청들이 비동기(async)로 작동된다는 것입니다.
2. Spider 모듈을 통해 제출된 요청사항은 Scheduler에 의해 스케줄링됩니다.
3. Engine은 Scheduler에게 Spider에 의해 제출된 요청사항을 요구합니다.
4. Engine은 이 요청사항을 Downloader에게 보내며 이 요청사항을 보내고 난 다음 Scheduler에게 다음 요청 사항을 요구하게 됩니다. 이 요청사항들은 비동기적으로 작동됩니다. 이 요청된 사항들은 Middleware를 통해 이동하게 됩니다. (이때 Download하기 위한 데이터들의 여러 설정사항들이 적용)
5. 요청 사항에 의해 받아온 데이터들은 다시 Middleware를 통해 Engine에게로 전송됩니다.
6. 이 Engine은 응답 데이터를 Spider에게로 보내게 되며 이때 작성된 비즈니스 로직이 적용됩니다.
7. Spider를 적용된 비즈니스 로직을 Engine에게로 보내며 이 Engine은 Item pipeline으로 처리된 데이터를 보내게 됩니다.
8. Item pipeline은 처리된 데이터를 Database나 Excel같은 데이터로 저장하기 위해 응답 데이터를 알맞게 가공하고 저장하게 됩니다.
9. 이러한 1-8번의 일련의 과정들을 더 이상의 요청사항이 없을 때까지 반복하게 됩니다.
다음 포스팅에서는 scrapy를 예제 코드를 통해 어떤 식으로 코드를 작성하게 되며 데이터를 처리하게 되는 지 일련의 과정을 알아보도록 하겠습니다
'Python > Python 프로그래밍' 카테고리의 다른 글
[Python] print 함수 사용시 소수점 자리 찍기 (0) | 2021.03.27 |
---|---|
스크래피(scrapy) 설치 및 scrapy 프로젝트 시작하기 (0) | 2021.03.27 |
파이썬을 이용한 selenium 사용법 및 동적 웹 스크래핑 (0) | 2021.03.27 |
회사 프록시 때문에 pip, npm을 통해 제대로 패키지 다운로드가 안 될 때 (0) | 2021.03.27 |
[Python, 파이썬] Call by assignment, mutable, immutable, 파이썬 복사(Python Copy) (0) | 2021.03.27 |
[Python][TIP]virtualenv 개발 환경 구축 (0) | 2021.01.06 |
[Python][TIP] 소수점 중 불필요한 0 제거 하기 (0) | 2021.01.06 |
[Python][TIP] python 문자열(String) 특수 문자 제거 (0) | 2021.01.06 |