강의 50 : Scrapy 배포, Scrapyd의 원리 및 사용에 대해 걱정하지 마십시오.

마지막 강의에서 분산 크롤러 배포가 완료되고 성공적으로 실행할 수 있지만 매우 번거로운 링크, 즉 코드 배포가 있습니다.

우리는 다음과 같은 시나리오를 상상합니다.

  • 파일을 업로드하여 코드를 배포하는 경우 먼저 코드를 압축 한 다음 SFTP 또는 FTP를 통해 서버에 파일을 업로드 한 다음 서버에 연결하여 파일의 압축을 풀어야합니다. 각 서버는 이와 같이 구성해야합니다.

  • Git 동기화를 사용하여 코드를 배포하는 경우 먼저 코드를 Git 리포지토리에 푸시 한 다음 원격으로 각 호스트에 연결하여 Pull 작업을 수행하고 코드를 동기화하려면 각 서버도 작업을 수행해야합니다.

코드가 갑자기 업데이트되면 각 서버를 업데이트해야하며 호스트의 버전이 제대로 제어되지 않으면 전체 분산 크롤링 상태에도 영향을 미칠 수 있습니다.

따라서 Scrapy 프로젝트를 배포하기 위해서는 좀 더 편리한 도구가 필요하며, 서버에 로그인하는 작업을 하나씩 저장할 수 있다면 훨씬 편리 할 것입니다.

이 섹션에서는 분산 배포를 제공하는 도구 인 Scrapyd를 살펴 보겠습니다.

1. Scrapyd 이해

다음으로 Scrapyd에 대해 자세히 살펴 보겠습니다. Scrapyd는 Scrapy 크롤러를 실행하는 서비스 프로그램으로, 크롤러를 배포, 시작, 중지 및 삭제할 수 있도록 일련의 HTTP 인터페이스를 제공합니다. Scrapyd는 버전 관리를 지원하고 여러 크롤러 작업을 관리 할 수 ​​있으며이를 통해 Scrapy 크롤러 프로젝트의 배포 작업 예약을 쉽게 완료 할 수 있습니다.

작업 준비

먼저 scrapyd를 설치해야합니다. 일반적으로 배포하는 서버는 Linux이므로 여기서는 Linux를 예로 들어 보겠습니다.

pip 설치를 사용하는 것이 좋습니다. 명령은 다음과 같습니다.

pip3 install scrapyd 

프로젝트가 의존으로 성공적으로 실행할 수있는 우리의 프로젝트의 준비 외에도, 환경에 프로젝트 자체가 따라 설치해야합니다 Scrapy, Scrapy-Redis, Gerapy-Pyppeteer및 기타 라이브러리, 그렇지 않으면 실패 배포의 문제가있을 것입니다, 또한 서버에 설치해야합니다.
설치 후 새 구성 파일을 생성해야합니다 /etc/scrapyd/scrapyd.conf. Scrapyd는 실행될 때이 구성 파일 을 읽습니다.

Scrapyd 1.2 버전 이후에는이 파일이 자동으로 생성되지 않으므로 직접 추가해야합니다. 먼저 다음 명령을 실행하여 새 파일을 만듭니다.

sudo mkdir /etc/scrapyd   
sudo vi /etc/scrapyd/scrapyd.conf 

그런 다음 다음을 작성하십시오.

[scrapyd]   
eggs_dir    = eggs   
logs_dir    = logs   
items_dir   =   
jobs_to_keep = 5   
dbs_dir     = dbs   
max_proc    = 0   
max_proc_per_cpu = 10   
finished_to_keep = 100   
poll_interval = 5.0   
bind_address = 0.0.0.0   
http_port   = 6800   
debug       = off   
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 

구성 파일의 내용은 공식 문서 https://scrapyd.readthedocs.io/en/stable/config.html#example-configuration-file 에서 찾을 수 있습니다 . 여기에있는 구성 파일이 수정되었습니다. 그 중 하나는 max_proc_per_cpu입니다. 공식 기본값은 4입니다. 즉, 호스트는 CPU 당 최대 4 개의 Scrapy 작업을 실행할 수 있으며 10 개로 늘어납니다. 다른 하나는 bind_address로, 기본값은 로컬 127.0.0.1이며, 외부 네트워크에 액세스 할 수 있도록 여기서 0.0.0.0으로 수정됩니다.

Scrapyd는 순수한 Python 프로젝트이므로 여기에서 직접 호출하여 실행할 수 있습니다. 프로그램을 백그라운드에서 계속 실행하기 위해 Linux 및 Mac은 다음 명령을 사용할 수 있습니다.

(scrapyd > /dev/null &) 

이러한 방식으로 Scrapyd는 백그라운드에서 계속 실행될 수 있으며 콘솔 출력은 직접 무시됩니다. 물론 출력 로그를 기록하려면 다음과 같이 출력 대상을 수정할 수 있습니다.

(scrapyd> ~/scrapyd.log &) 

이때 Scrapyd의 실행 결과는 ~ / scrapyd.log 파일에 출력됩니다. 물론 화면, tmux, 감독자 및 기타 도구를 사용하여 프로세스 보호를 구현할 수도 있습니다.

Scrapyd를 설치하고 실행 한 후 서버의 6800 포트를 방문하여 WebUI 페이지를 볼 수 있습니다. 예를 들어 내 서버 주소는 120.27.34.25입니다. Scrapyd를 설치하고 성공적으로 실행 한 후 로컬 브라우저에서 열 수 있습니다. : http://120.27.34.25:6800, Scrapyd의 홈페이지를 볼 수 있습니다. 여기에서 그림과 같이 서버 주소로 바꾸십시오.
여기에 사진 설명 삽입
이 페이지에 성공적으로 액세스 할 수 있으면 Scrapyd 구성에 문제가 없음을 증명합니다.

2. Scrapyd의 특징

Scrapyd는 다양한 작업을 구현하기 위해 일련의 HTTP 인터페이스를 제공합니다. 여기에서 인터페이스의 기능을 분류하고 Scrapyd의 IP 120.27.34.25를 예로 들어 설명 할 수 있습니다.

2.1 daemonstatus.json

이 인터페이스는 Scrapyd 서비스 및 작업의 현재 상태를 확인하는 역할을합니다. curl 명령을 사용하여이 인터페이스를 요청할 수 있습니다. 명령은 다음과 같습니다.

curl http://139.217.26.30:6800/daemonstatus.json 

따라서 다음과 같은 결과를 얻을 수 있습니다.

{
    
    "status": "ok", "finished": 90, "running": 9, "node_name": "datacrawl-vm", "pending": 0} 

반환 된 결과는 Json 문자열, status는 현재 실행 상태, completed는 현재 완료된 Scrapy 작업, running은 실행중인 Scrapy 작업, pending은 예약 대기중인 Scrapyd 작업, node_name은 호스트 이름입니다.

2.2 addversion.json

이 인터페이스는 주로 Scrapy 프로젝트를 배포하는 데 사용됩니다. 배포 할 때 먼저 프로젝트를 Egg 파일로 패키징 한 다음 프로젝트 이름과 배포 버전을 전달해야합니다.

다음과 같은 방법으로 프로젝트 배포를 구현할 수 있습니다.

curl http://120.27.34.25:6800/addversion.json -F project=wenbo -F version=first -F egg=@weibo.egg 

여기서 -F는 매개 변수 추가를 의미하며 프로젝트를 Egg 파일로 패키징하고 로컬에 배치해야합니다.
이 방법으로 요청을 한 후 다음과 같은 결과를 얻을 수 있습니다.

{
    
    "status": "ok", "spiders": 3} 

이 결과는 배포에 성공했으며 그 안에 포함 된 Spider의 수가 3 개임을 나타냅니다. 이 방법은 배포하기가 번거로울 수 있지만 나중에 프로젝트 배포를 구현하기위한보다 편리한 도구를 소개하겠습니다.

2.3 schedule.json

이 인터페이스는 배포 된 Scrapy 프로젝트를 실행하도록 예약하는 역할을합니다. 다음 인터페이스를 통해 작업 스케줄링을 구현할 수 있습니다.

curl http://120.27.34.25:6800/schedule.json -d project=weibo -d spider=weibocn 

여기에 두 개의 매개 변수를 전달해야합니다. project는 Scrapy 프로젝트의 이름이고 spider는 spider의 이름입니다. 반환 된 결과는 다음과 같습니다.

{
    
    "status": "ok", "jobid": "6487ec79947edab326d6db28a2d86511e8247444"} 

status는 Scrapy 프로젝트의 시작 상태를 나타내고 jobid는 현재 실행중인 크롤링 작업의 코드를 나타냅니다.

2.4 취소 .json

이 인터페이스를 사용하여 검색 작업을 취소 할 수 있습니다. 작업이 보류 중이면 제거되고 작업이 실행 중이면 종료됩니다.

다음 명령을 사용하여 작업 실행을 취소 할 수 있습니다.

curl http://120.27.34.25:6800/cancel.json -d project=weibo -d job=6487ec79947edab326d6db28a2d86511e8247444 

여기에 두 개의 매개 변수를 전달해야합니다. project는 프로젝트 이름이고 job은 크롤링 태스크의 코드입니다. 반환 된 결과는 다음과 같습니다.

{
    
    "status": "ok", "prevstate": "running"} 

status는 요청의 실행을 나타내고 prevstate는 이전 실행 상태를 나타냅니다.

2.5 listprojects.json

이 인터페이스는 Scrapyd 서비스에 배포 된 모든 프로젝트 설명을 나열하는 데 사용됩니다. 다음 명령을 사용하여 Scrapyd 서버의 모든 프로젝트 설명을 가져올 수 있습니다.

curl http://120.27.34.25:6800/listprojects.json 

매개 변수를 전달할 필요가 없습니다. 반환 된 결과는 다음과 같습니다.

{
    
    "status": "ok", "projects": ["weibo", "zhihu"]} 

status는 요청의 실행 상태를 나타내고 projects는 프로젝트 이름 목록입니다.

2.6 listversions.json

이 인터페이스는 프로젝트의 모든 버전 번호를 가져 오는 데 사용되며 버전 번호는 순서대로 정렬되며 마지막 항목은 최신 버전 번호입니다.

다음 명령을 사용하여 프로젝트의 버전 번호를 가져올 수 있습니다.

curl http://120.27.34.25:6800/listversions.json?project=weibo 

여기에 프로젝트의 이름 인 매개 변수 프로젝트가 필요합니다. 반환 된 결과는 다음과 같습니다.

{
    
    "status": "ok", "versions": ["v1", "v2"]} 

status는 요청의 실행 상태를 나타내고 versions은 버전 번호 목록입니다.

2.7 listpiders.json

이 인터페이스는 프로젝트의 최신 버전의 모든 Spider 이름을 가져 오는 데 사용됩니다. 다음 명령을 사용하여 프로젝트의 스파이더 이름을 가져올 수 있습니다.

curl http://120.27.34.25:6800/listspiders.json?project=weibo 

여기에 프로젝트의 이름 인 매개 변수 프로젝트가 필요합니다. 반환 된 결과는 다음과 같습니다.

{
    
    "status": "ok", "spiders": ["weibocn"]} 

status는 요청의 실행 상태를 나타내고 spiders는 스파이더 이름 목록입니다.

2.8 listjobs.json

이 인터페이스는 프로젝트에서 현재 실행중인 모든 작업의 ​​세부 정보를 가져 오는 데 사용됩니다. 다음 명령을 사용하여 모든 작업 세부 정보를 가져올 수 있습니다.

curl http://120.27.34.25:6800/listjobs.json?project=weibo 

여기에 프로젝트의 이름 인 매개 변수 프로젝트가 필요합니다. 반환 된 결과는 다음과 같습니다.

{
    
    "status": "ok", 
 "pending": [{
    
    "id": "78391cc0fcaf11e1b0090800272a6d06", "spider": "weibocn"}], 
 "running": [{
    
    "id": "422e608f9f28cef127b3d5ef93fe9399", "spider": "weibocn", "start_time": "2017-07-12 10:14:03.594664"}], 
 "finished": [{
    
    "id": "2f16646cfcaf11e1b0090800272a6d06", "spider": "weibocn", "start_time": "2017-07-12 10:14:03.594664", "end_time": "2017-07-12 10:24:03.594664"}]} 

status는 요청의 실행을 나타내고, pendings는 현재 대기중인 작업을, running은 현재 실행중인 작업을, finish는 완료된 작업을 나타냅니다.

2.9 delversion.json

이 인터페이스는 프로젝트의 특정 버전을 삭제하는 데 사용됩니다. 다음 명령으로 프로젝트 버전을 삭제할 수 있습니다.

curl http://120.27.34.25:6800/delversion.json -d project=weibo -d version=v1 

여기에 프로젝트의 이름 인 매개 변수 프로젝트와 프로젝트의 버전 인 매개 변수 버전이 필요합니다. 반환 된 결과는 다음과 같습니다.

{
    
    "status": "ok"} 

상태는 요청의 실행을 나타내므로 삭제가 성공합니다.

2.10 delproject.json

이 인터페이스는 항목을 삭제하는 데 사용됩니다. 다음 명령으로 항목을 삭제할 수 있습니다.

curl http://120.27.34.25:6800/delproject.json -d project=weibo 

여기에 프로젝트의 이름 인 매개 변수 프로젝트가 필요합니다. 반환 된 결과는 다음과 같습니다.

{
    
    "status": "ok"} 

상태는 요청의 실행을 나타내므로 삭제가 성공합니다.
위는 Scrapyd의 모든 인터페이스이며 HTTP 인터페이스를 직접 요청하여 프로젝트의 배포, 시작 및 운영을 제어 할 수 있습니다.

3. ScrapydAPI 사용

위의 인터페이스는 사용하기 매우 편리하지 않을 수 있습니다. 중요하지 않습니다. 이러한 인터페이스를 다시 캡슐화하는 ScrapydAPI 라이브러리가 있으며 설치 방법은 다음과 같습니다.

pip3 install python-scrapyd-api 

ScrapydAPI의 사용 방법을 살펴 보겠습니다. 실제로 핵심 원칙은 HTTP 인터페이스 요청 방법과 동일하지만 Python으로 패키징하여 사용하는 것이 더 편리합니다.
다음과 같은 방법으로 ScrapydAPI 개체를 만들 수 있습니다.

from scrapyd_api import ScrapydAPI 
scrapyd = ScrapydAPI('http://120.27.34.25:6800') 

그런 다음 해당 메서드를 호출하여 해당 인터페이스 작업을 구현할 수 있습니다. 예를 들어 배포 작업에서 다음 메서드를 사용할 수 있습니다.

egg = open('weibo.egg', 'rb') 
scrapyd.add_version('weibo', 'v1', egg) 

이런 식으로 프로젝트를 Egg 파일로 패키징 한 다음 로컬로 패키징 된 Egg 프로젝트를 원격 Scrapyd에 배포 할 수 있습니다.

또한 ScrapydAPI는 Scrapyd가 제공하는 모든 API 인터페이스를 동일한 이름과 동일한 매개 변수로 구현합니다.

예를 들어 list_projects 메서드를 호출하여 Scrapyd에 배포 된 모든 프로젝트를 나열 할 수 있습니다.

scrapyd.list_projects() 
['weibo', 'zhihu'] 

또한 여기에 나열되지 않은 다른 메소드도 있습니다. 이름과 매개 변수는 동일합니다. 자세한 작업은 공식 문서 http://python-scrapyd-api.readthedocs.io/ 를 참조하세요 .
HTTP 인터페이스를 통해 프로젝트를 배포하고 작업의 동작을 제어하는 ​​데 사용할 수 있습니다.하지만 여기에는 배포 과정이 불편합니다. 먼저 Egg 파일을 패키징 한 다음 업로드해야합니다. 여전히 번거 롭습니다. 다른 하나가 있습니다. 도구 Scrapyd-Client.

4. Scrapyd-Client 배포

Scrapy 프로젝트의 배포를 용이하게하기 위해 Scrapyd-Client는 두 가지 기능을 제공합니다.

  • 프로젝트를 Egg 파일로 패키징합니다.

  • addversion.json 인터페이스를 통해 패키지화 된 Egg 파일을 Scrapyd에 배포합니다.

즉, Scrapyd-Client모든 배포를 구현 하는 데 도움 주기 위해 더 이상 Egg 파일이 생성되는 방식에 신경 쓸 필요가 없으며 Egg 파일을 읽고 업로드 할 인터페이스를 요청할 필요가 없습니다. 이러한 모든 작업은 명령을 실행하기 만하면됩니다. 원 클릭 배포.

Scrapy 프로젝트를 배포하려면 먼저 프로젝트의 구성 파일을 수정해야합니다. 예를 들어 이전에 작성한 Scrapy 프로젝트의 경우 프로젝트의 첫 번째 레이어에 scrapy.cfg 파일이 있습니다. 내용은 다음과 같습니다.

[settings] 
default = scrapypyppeteer.settings 
​ 
[deploy] 
#url = http://localhost:6800/ 
project = scrapypyppeteer 

여기서 배포를 구성해야합니다. 예를 들어 프로젝트를 120.27.34.25에 Scrapyd에 배포하려면 다음과 같이 수정해야합니다.

[deploy] 
url = http://120.27.34.25:6800/ 
project = scrapypyppeteer 

그런 다음 scrapy.cfg 파일이있는 경로에서 다음 명령을 실행합니다.

scrapyd-deploy 

결과는 다음과 같습니다.

Packing version 1501682277 
Deploying to project "weibo" in http://120.27.34.25:6800/addversion.json 
Server response (200): 
{
    
    "status": "ok", "spiders": 1, "node_name": "datacrawl-vm", "project": "scrapypyppeteer", "version": "1501682277"} 

이 결과를 반환하면 배포가 성공했음을 의미합니다.

프로젝트 버전을 지정할 수도 있습니다. 지정하지 않으면 현재 타임 스탬프가 기본값으로 설정됩니다. 지정된 경우 버전 매개 변수를 전달합니다. 예를 들면 다음과 같습니다.

scrapyd-deploy --version 201707131455 

Scrapyd 1.2.0 버전의 Python3에서는 버전 번호를 문자가있는 문자열로 지정하지 않고 순수한 숫자 여야합니다. 그렇지 않으면 오류가 발생할 수 있습니다.

또한 호스트가 여러 개인 경우 각 호스트의 별칭을 구성 할 수 있습니다. 예를 들어 구성 파일을 다음과 같이 수정할 수 있습니다.

[deploy:vm1] 
url = http://120.27.34.24:6800/ 
project = scrapypyppeteer 
​ 
[deploy:vm2] 
url = http://139.217.26.30:6800/ 
project = scrapypyppeteer 

호스트가 여러 개인 경우 여기에서 구성하세요. 하나의 호스트는 구성 집합에 해당합니다. 배포 후 호스트의 별칭을 추가하므로 IP 139.217.26.30을 사용하여 vm2 호스트에 프로젝트를 배포하려는 경우에만 필요합니다. 다음 명령을 실행하십시오.

scrapyd-deploy vm2 

따라서 vm2라는 호스트에 프로젝트를 배포 할 수 있습니다.
이런 식으로 호스트가 여러 개인 경우 scrapy.cfg 파일에서 각 호스트의 Scrapyd 주소를 구성한 다음 scrapyd-deploy 명령과 호스트 이름을 호출하여 배포를 구현하면 매우 편리합니다.

Scrapyd가 액세스 제한을 설정 한 경우 구성 파일에 사용자 이름과 암호 구성을 추가하고 동시에 포트를 수정하여 Nginx 프록시 포트로 변경할 수 있습니다. 모듈 1에서 6801을 사용하는 경우 6801로 변경하고 수정해야합니다. 다음과 같이 :

[deploy:vm1] 
url = http://120.27.34.24:6801/ 
project = scrapypyppeteer 
username = admin 
password = admin 
​ 
[deploy:vm2] 
url = http://139.217.26.30:6801/ 
project = scrapypyppeteer 
username = germey 
password = germey 

이러한 방식으로 사용자 이름 및 비밀번호 필드를 추가하여 배포 중에 자동으로 인증 확인을 수행 한 다음 배포를 성공적으로 구현할 수 있습니다.

5. 요약

위에서 Scrapyd, Scrapyd-API 및 Scrapyd-Client의 배포 방법을 소개했습니다. 더 많은 것을 시도해 보시기 바랍니다.

추천

출처blog.csdn.net/weixin_38819889/article/details/108685372