2012-03-03 4 views
10

크롤러가 시퀀스를 따라야하는 웹 사이트가 있습니다. 예를 들어 a1, b1 및 c1이 a2 등으로 시작하기 전에 먼저 a1, b1 및 c1을 검색해야합니다. 각각의 a, b 및 c는 서로 다른 구문 분석 함수로 처리되며 해당 URL은 Request 객체에 만들어져 반환됩니다. , I 크롤링 시퀀스는 A1, A2, A3, B1, B2, B3, C1, C2 것으로 보인다 찾을 그러나 이상한 C3를치료가 DFO를 수행하지 않는 것처럼 보입니다

class aspider(BaseSpider): 

    def parse(self,response): 
     yield Request(b, callback=self.parse_b, priority=10) 

    def parse_b(self,response): 
     yield Request(c, callback=self.parse_c, priority=20) 

    def parse_c(self,response) 
     final_function()   

다음 대략 I가 사용하고있는 코드를 도시 나는 Scrapy가 깊이를 먼저 보장하기로되어 있다고 생각했기 때문에.

시퀀스가 ​​엄격 할 필요는 없지만 내가 긁고있는 사이트에는 제한이 있으므로 Scrapy는 레벨 5를 크롤링하기 전에 가능한 한 빨리 레벨을 긁어 모으기 시작해야합니다. 어떻게이 일을 성취 할 수 있습니까?

+0

우선 순위 설정을 생략하면 어떻게됩니까? –

+0

동일하지만, 우선 순위를 추가하려는 시도는 결과에 영향을 줄 수 있는지 확인하려고 시도하는 것이 었습니다. – Mishari

+1

Srcrapy는 BaseSpider를 사용하여 자동으로 크롤링하지 않습니다. 'BaseSpider'를 사용하고 있기 때문에, a1, b1, c1, a2, b2, c2의 요청을 생성하는 코드를 보여주는 것이 매우 중요합니다 (일부는 "Start-Urls" c ". – wuliang

답변

8

깊이 첫 번째 검색은 설명 정확히 무엇인가 이러한 설정 :

DEPTH_PRIORITY = 1 
SCHEDULER_DISK_QUEUE = 'scrapy.squeue.PickleFifoDiskQueue' 
SCHEDULER_MEMORY_QUEUE = 'scrapy.squeue.FifoMemoryQueue' 

* doc.scrapy.org FAQ

+0

OP의 예에서 DFS는'(a1, b1 (GFSL), (c1, a2, ...)'BFS는 (a1, a2, a3, b1, b2, b3, ...)'입니다. //github.com/scrapy/scrapy/issues/1739). – JayStrictor

1

당신이 깊이 우선과 폭 우선 탐색 알고리즘의 차이를 알아 차리지 있다고 생각 (모두에서 정보를 원하시면 위키 백과를 참조하십시오.)

Scrapy이 사용됩니다 알고리즘을 변경할 수 있습니다

을 "기본적으로 Scrapy는 보류중인 요청을 저장하기 위해 LIFO 대기열을 사용합니다. 이는 기본적으로 DFO 순서로 크롤링한다는 것을 의미합니다.이 순서는 대부분의 경우 더 편리합니다. 실제 BFO 순서로 크롤링하려면, 다음 설정 : "

자세한 내용은 http://doc.scrapy.org/en/0.14/faq.html을 참조하십시오. 에.

search as deep into a's as possible before moving to b's 

은 폭 우선 검색 할 Scrapy을 변경하려면 (A1, B1, C1을, A2 등) 변경 :

0

Scrapy 사용 DFO에서 발견 기본적으로. 크롤링 시퀀스의 이유는 페이지가 비동기 적으로 크롤링되기 때문입니다. DFO를 사용하더라도 시퀀스가 ​​네트워크 지연 등으로 인해 비합리적 순서로 표시됩니다.

관련 문제