-
728x90
Pyspider는 웹 크롤링을 위해 개발된 모듈이다.
웹 크롤링에는 2가지 지켜야할 특성이 있다.
1. 100-200개의 웹사이트를 수집했을 시 그들은 온/오프라인에서 그들의 템플릿을 때때로 변화시킨다.
- 우리는 웹사이트의 변화 여부를 확인하기 위해 강력한 감시도구가 필요하며, 각각의 웹사이트에 스크립트(템플릿)를 작성하게 해주는 좋은 도구가 필요하다.
2. 데이터는 반드시 웹사이트가 업데이트 되었을 때 5분 내로 수집되어야만 한다.
- 다음과 같은 문제를 인덱스 페이지를 빈번하게 확인하고, 최근 업데이트 시간(혹은 최근 응답 시간)과 같은 것들을 사용해 페이지의 변화요부를 확인함으로써 해결하였다. 게다가, 우리는 빠진 부분이 없는지 확인하기 위해 x일 이후 페이지들을 재확인한다.
Pyspider는 www가 바뀔수록 멈추지 않는다.
오픈 소스로 개방되어 있어 자유롭게 사용할 수 있다.
https://github.com/binux/pyspider
Overview
Pyspider의 아키텍처는 다음의 데이터 플로우를 가진다.
- 컴포넌트들은 메시지 큐를 통해 연결
- 메시지 큐에 포함된 매 컴포넌트들은 그들 자체의 프로세스 혹은 스레드에서 작동되며, 대체 가능. (즉, 프로세스가 느려지면 프로세스의 많은 인스턴스들을 가지고 다중 CPU의 완전 작동을 만들고, 다양한 기기들에 배포하는 것을 의미)
이러한 아키텍처는 pyspider를 정말 빠르게 만든다.
Scheduler
- processor나 newtask_queue로부터 작업을 받는다.
- 신규 작업인지, re-crawling이 필요한 작업인지 판단
- 우선순위에 따라 작업을 정렬하고 정렬한 작업들을 트래픽 조정을 통해 fetcher로 전달
- 주기적 작업, 손실된 작업, 실패한 작업들에 주의
scheduler는 오픈 소스 내 self.crawl API를 통해 설정이 가능하다.
Fetcher
- 웹 페이지를 fetch하고 processor에게 전달
- fetcher는 자바스크립트로 렌더링된 Data URI와 페이지들을 지원(Phantomjs)
- Fetch method, headers, cookies, proxy, etag 등은 API를 이용한 스크립트로 조정이 가능하다.
Phantomjs Fetcher
- 프록시와 같은 역할
- Fetcher와 연결되어 자바스크립트로 페이지들을 렌더링하고 fetch
- 결과값들을 HTML로 Fetcher에게 보낸다.
Processor
- 정보를 파싱하고 추출하기 위해 사용자가 작성한 스크립트를 실행하는 역할
- 스크립트는 제한적이지 않은 환경에서 구동
정보를 추출하기 위한 다양한 툴들이 있지만 응답을 다루는 것을 원하는 모든 것을 사용할 수 있다. 이 스크립트에 관해 더 자세한 정보는 API 명세나 스크립트 환경을 참고하면 된다. Processor는 예외와 로그들을 파악하며, 상태(작업 상태)와 새로운 작업들을 scheduler에게 보내며, Result Worker에게 결과를 보낸다.
Result Worker
- Processor로부터 결과들을 습득
- Pyspider는 resultdb에 저장하기 위해 빌트인된 result worker를 가지고 있음
- 필요하다면 덮어쓰기 가능
WebUI
- Web Frontend
- Script Editor, Debugger
- Project Manager
- Task Monitor
- Result Viewer, Exporter
pyspider의 강력한 UI로 스크립트를 단계별로 디버깅할 수 있으며, 프로젝트를 시작/중지할 수 있다. 또한 이 프로젝트가 잘못되었느지에 대한 여부를 파악하고 요청이 실패했는지, 그리고 디버거와 함께 다시 진행할 수 있다.
DataFlow
1. 각 스크립트는 WebUI에서 run 버튼을 눌렀을 때 on_start로 불리는 콜백함수를 가지고 있다. on_start의 새 작업은 프로젝트의 엔트리로 Scheduler에게 전달된다.
2. Scheduler는 Fetcher에게 전달하는 작업으로, Data URI를 통해 on_start 작업을 포착한다.
3. Fetcher는 요청과 응답을 생성하며, Processor에게 전달한다.
4. Processor는 on_start method를 호출하고 새로운 URL을 크롤링하기 위해 생성한다. Processor는 Scheduler에게 작업의 종료에 대한 메시지를 전달하며 메시지 큐를 통해 새로운 작업들을 Scheduler에게 전달한다.
5. Scheduler은 새로운 작업들을 받으며 데이터베이스를 살펴본다. 이 과정에서 작업이 재크롤링을 필요하거나 새로운 작업인지를 결정한다.
6. 이 과정은 반복되며 www가 멈출때까지 작업이 중단되지 않는다. Scheduler는 최근 데이터를 크롤링하기 위해 주기적으로 작업을 검사한다.
728x90'Project' 카테고리의 다른 글
웹 크롤러 설계 (0) 2023.07.12 [Parsing] Scrapy를 활용하여 웹 스크래핑 하기 (0) 2023.07.09 웹 크롤링 데이터를 MySQL에 저장하기 (0) 2023.07.03 Requests 알아보기 (0) 2023.06.28 Client와 Server, REST API, JSON (0) 2023.06.26