2016-09-24 1 views
0

일부 콘텐츠를 크롤링하기 위해 scrapyd와 scrapyd를 사용하고 있습니다. 나는 달리는 28 개의 크롤러가 있지만, 한 번에 8 개의 크롤러 만 있습니다. 각 크롤러는 완료하는 데 10 분에서 수 시간이 걸립니다. 그래서 서버를 사용하는 시간을 최소화하기 위해 올바르게 주문하는 방법을 찾고 있습니다.스크립트를 올바른 순서로 실행하도록 명령하여 실행 시간 최소화

각 크롤링 소요 시간에 대한 정보를 이미 수집 했으므로 최소화 문제 또는 공식화 방법에 대한 정보 만 수집했습니다.

스크립트는 PHP를 사용하여 시작되므로 솔루션은 PHP로 실행하는 것이 가장 바람직합니다.

답변

0

내가 발견 한 가장 좋은 방법은 특정 시간에 실행되도록 cronjob으로 설정하는 것입니다. 나는 약 30 개의 cronjob을 여러 번 시작하도록 구성하여 스크랩 당 특정 시간을 설정할 수 있습니다. 오후 5 매일 cronjob에 의해 PHP의 cmmand 실행

:

* 17 * * * php /opt/test.php 

을 당신은 cronjob를 통해 scrapy 파이썬 명령을 실행하면, 그 :

* 17 * * * cd /opt/path1/ && scrapy crawl site1 

당신이 다음 파이썬에 대한 당신의 VIRTUALENV 사용하는 경우는

* 17 * * * source /opt/venv/bin/activate && cd /opt/path1/ && scrapy crawl site1 
+0

고마워요,하지만 정말로 무엇을 찾고 있어요. 최적의 시작 순서 (대기열)를 계산하는 스크립트가 필요합니다. 최소화 문제와 비슷합니다. 나는 그것을 계획하기 위해 Laravel을 사용한다. 그래서 그들을 시작하는 것은 문제가 아니다. –

0

실망시키지 않으니까요. 크롤링 작업 간의 종속성에 대해 언급하지 않기 때문에 설명하는 문제. 독립적 인 일자리는 주문 방법에 관계없이 ~ TOTAL_TIME/THROUGHPUT이 소요됩니다.

scrapyd는 완료되면 바로 다음 작업 처리를 시작합니다. "한 번에 8 개"는 일종의 양동이가 아니므로 여기에 조합/동적 프로그래밍 문제가 없습니다. scrapyd에 28 개의 모든 일을 던져서 실행 시키십시오. 폴링하고 유휴 상태가되면 서버를 종료 할 수 있습니다.

가장 긴 작업을 먼저 예약하면 약간의 이점을 얻을 수 있습니다. 마지막 몇 개의 긴 작업이 완료되는 동안 유휴 슬롯에서 몇 가지 작은 작업을 신속하게 집어 넣을 수 있습니다. 그러나 어떤 병이 나지 않는 한, 그 혜택은 중요하지 않습니다.

max_proc_per_cpu 및/또는 max_proc에 의해 시행되는이 숫자는 다소 임의적입니다. 그것이 100 % CPU 나 다른 것을 치는 숫자가 아니라면 더 큰 숫자가 더 적합 할 것입니다.

큰 이점을 얻으려면 2-3 위의 가장 큰 일자리를 찾고이를 절반으로 줄이는 방법을 찾으십시오. 자동차로 사이트를 크롤링하는 경우 단일 크롤링을 두 개로 분할합니다. 하나는 자동차 용이고 다른 하나는 오토바이 용입니다. 이것은 일반적으로 가능하며 재정렬보다 더 중요한 이점을 제공합니다. 예를 들어 장시간 작업이 8 시간이고 다음 시간이 5 시간 인 경우 가장 긴 작업을 2 ~ 4 시간 크롤링으로 분할하면 서버를 3 시간 절약 할 수있는 병목 현상이 발생할 수 있습니다.

관련 문제