본문 바로가기
Back-end/Python

[크롤링] 무작정 시작하기 (7) - scrapyd

by 허도치 2019. 11. 27.

 

2019/11/19 - [Back-end/Python] - [크롤링] 무작정 시작하기 (1) - 패키지 선택

2019/11/19 - [Back-end/Python] - [크롤링] 무작정 시작하기 (2) - 프로젝트 준비

2019/11/19 - [Back-end/Python] - [크롤링] 무작정 시작하기 (3) - Spider

2019/11/20 - [Back-end/Python] - [크롤링] 무작정 시작하기 (4) - Selenium + Scrapy

2019/11/21 - [Back-end/Python] - [크롤링] 무작정 시작하기 (5) - Item

2019/11/24 - [Back-end/Python] - [크롤링] 무작정 시작하기 (6) - 파일 다운로드

 

 

  지금까지 Scrapy와 Selenium을 함께 사용하는 크롤러를 만들어 보았다. 그러나, 뭔가 부족하다. 크롤링을 요청하고 처리가 완료될때까지 기다려야하고 매번 명령어를 입력하여 처리하는 것도 번거롭다. 그래서 Flask랑 Celery로 scrapy API를 만들어 보려고 찾아보다가 쉽게 사용할 수 있는 패키지를 찾았다. Scrapy를 API로 요청하여 병렬처리까지 해주는 scrapyd이다.

 

 

 

1. Scrapyd란?

   1-1. scrapy를 API로 서비스해주며 요청에 대해 비동기 처리를 함.

   1-2. 설정한 프로세스의 수 만큼 병렬처리가 가능함.

   1-3. 요청한 크롤링을 취소할 수 있음.

   1-4. 비슷한 패키지로 scrapyrt가 있음.

          - scrapyrt는 한번에 하나의 요청만 가능함.

          - 결과를 반환받을 때까지 대기해야 함. (동기처리)

 

 

2. Scrapyd 설정 및 실행.

   2-1. 패키지 설치.

1
pip install scrapyd scrapyd-client
cs

          - [ scrapyd-client ]: scrapyd를 deploy 하기위해 필요한 패키지.

 

   2-2. scrapyd 실행.

1
scrapyd
cs

실행결과

 

   2-3. scrapyd-deploy 실행.

1
scrapyd-deploy --project=crawler
cs

           - [ --project=프로젝트명 ]: 프로젝트에 있는 모든 Spider를 deploy함.

실행결과

 

   2-4. API 요청.

           - OSX or LINUX.

1
curl -X POST 'http://localhost:6800/schedule.json' -'project=crawler&spider=navernews'
cs

실행결과

           - POST method로 요청해야하기 때문에 windows에서는 Postman을 사용하는 것을 추천. 

 

Postman | The Collaboration Platform for API Development

Simplify workflows and create better APIs – faster – with Postman, a collaboration platform for API development.

www.getpostman.com

 

   2-5. 크롤링 결과 확인.

           - [ ./logs/crawler/navernews ] 폴더에서 로그 확인.

 

 

3. scrapyd 상세 설정.

    3-1. scrapyd.conf 작성.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
[scrapyd]
eggs_dir          = eggs
logs_dir          = logs
dbs_dir           = dbs
items_dir         =
jobs_to_keep      = 5
max_proc          = 0
max_proc_per_cpu  = 4
finished_to_keep  = 100
poll_interval     = 5.0
bind_address      = 127.0.0.1
http_port         = 6800
debug             = on
runner            = scrapyd.runner
application       = scrapyd.app.application
launcher          = scrapyd.launcher.Launcher
webroot           = scrapyd.website.Root
 
[services]
schedule.json     = scrapyd.webservice.Schedule
cancel.json       = scrapyd.webservice.Cancel
addversion.json   = scrapyd.webservice.AddVersion
listprojects.json = scrapyd.webservice.ListProjects
listversions.json = scrapyd.webservice.ListVersions
listspiders.json  = scrapyd.webservice.ListSpiders
delproject.json   = scrapyd.webservice.DeleteProject
delversion.json   = scrapyd.webservice.DeleteVersion
listjobs.json     = scrapyd.webservice.ListJobs
daemonstatus.json = scrapyd.webservice.DaemonStatus
cs

           - [ scrapyd ]는 실행 옵션이며, [ services ]는 API 서비스 목록.

           - 상세한 옵션 설명은 공식 문서를 참고하자. 

 

Scrapyd — Scrapyd 1.2.0 documentation

Docs » Scrapyd Edit on GitHub © Copyright 2013-2017, Scrapy group. Revision 1713747e. Built with Sphinx using a theme provided by Read the Docs.

scrapyd.readthedocs.io

 

 

 

  지금까지 scrapyd를 설치하고 실행하여 보았다. 설치와 빌드만 해주면 바로 API를 서비스할 수 있기 때문에 매우 간단하다. 크롤러를 관리하는 페이지를 만들면 매우 편하게 크롤링할 수 있을 것 같다. Flask랑 Celery를 좀 더 공부해서 병렬처리가 아니라 Task Queue를 이용해서 처리할 수 있도록 처리해보도록 하겠다.

댓글