2014-12-03 2 views
1

는 내가 충분히 효율적이지 않습니다 2 초까지의 지연 시간을 설정하면 일정 지연, 그러나 치료에서 동적 다운로드 지연을 설정할 수 있습니까?

settings.py 
DOWNLOAD_DELAY = 2 

에서 설정 될 수 있다는 것을 알고. DOWNLOAD_DELAY = 0으로 설정 한 경우

크롤러는 약 10 페이지를 크롤링 할 수 있습니다. 그 후, 대상 페이지는 "당신이 너무 자주 요청하고 있습니다"와 같은 것을 반환 할 것입니다.

내가 원하는 것은 html에서 "너무 자주 요청하는"msg가 발견되면 download_delay를 0으로 유지하는 것입니다. 지연을 2 초로 변경합니다. 잠시 후 다시 0으로 전환됩니다.

어떤 모듈이 이것을 할 수 있습니까? 또는 그와 같은 경우를 다룰 수있는 더 좋은 아이디어가 있습니까?

업데이트 : 연장 전화입니다. AutoThrottle 하지만 이런 논리를 사용자 정의 할 수 있습니까 ??

if (requesting too frequently) is found 
    increase the DOWNLOAD_DELAY 
+0

정확하게 Autothrottle이하는 것입니다. 당신은 또한 한계를 설정할 수 있습니다. – nramirezuy

답변

-2

예, 시간 지연 모듈을 사용하여 동적 지연을 설정할 수 있습니다.

import time 

for i in range(10): 
    *** Operations 1**** 
    time.sleep(i) 
    *** Operations 2**** 

이제 작업 1과 작업 사이의 지연을 볼 수 있습니다 2.

참고 :

변수 '내가'초의 형태이다.

+1

수면은 병 치료에 효과가 없으며 꼬인 상태의 asyc api를 사용합니다. – nramirezuy

0

반 스파이더 페이지를 얻은 직후 2 초 이내에 데이터 페이지를 가져올 수 있습니다. 그런 다음 안티 스파이더 페이지를 확인하는 다운로더 미들웨어 을 작성해야합니다. renew-queue에서 spider가 유휴 상태 일 때 루핑 호출을 시작하여 갱신 대기열에서 요청을 얻습니다 (루핑 간격은 새로운 다운로드 지연에 대한 해킹입니다). 다운로드 지연이 다시 필요하지 않을 때를 결정하십시오 (일부는 테스트), 루핑을 중지하고 갱신 대기열에서 스 I 줄 스케줄러로의 모든 요청을 다시 스케줄하십시오. 분산 크롤링의 경우 Redis 대기열을 사용해야합니다.

다운로드 지연을 0으로 설정하면 처리량이 1000 항목/분 이상으로 쉽게 올라갈 수 있습니다. 반대로 거미 페이지가 10의 응답 후에 튀는 경우에, 노력의 값이있는이지 않습니다.

대신 대상 서버의 속도가 1.5s, 1s, 0.7s, 0.5s 등 얼마나 빨라지는지 확인할 수 있습니다. 그런 다음 제품을 재 설계하면 크롤러가 처리 할 수있는 처리량이 고려 될 수 있습니다.

0

지금 Auto Throttle extension을 사용할 수 있습니다. 기본적으로 해제되어 있습니다. 이 매개 변수를 프로젝트의 settings.py 파일에 추가하여 활성화 할 수 있습니다.

AUTOTHROTTLE_ENABLED = True 
# The initial download delay 
AUTOTHROTTLE_START_DELAY = 5 
# The maximum download delay to be set in case of high latencies 
AUTOTHROTTLE_MAX_DELAY = 300 
# The average number of requests Scrapy should be sending in parallel to 
# each remote server 
AUTOTHROTTLE_TARGET_CONCURRENCY = 1.0 
# Enable showing throttling stats for every response received: 
AUTOTHROTTLE_DEBUG = True 
관련 문제