2012-03-03 31 views
10

Tôi có một trang web mà trình thu thập thông tin của tôi cần theo dõi một chuỗi. Vì vậy, ví dụ, nó cần phải đi a1, b1, c1 trước khi nó bắt đầu đi a2 vv mỗi a, b và c được xử lý bởi các hàm phân tích khác nhau và các url tương ứng được tạo trong đối tượng Yêu cầu và được sinh ra. Sau đây khoảng minh họa mã Tôi đang sử dụng:Phế liệu dường như không hoạt động trên 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()   

Tuy nhiên, tôi thấy rằng chuỗi các crawl dường như là a1, a2, a3, b1, b2, b3, c1, c2, c3 đó là lạ kể từ khi tôi nghĩ rằng Scrapy là nghĩa vụ phải đảm bảo độ sâu đầu tiên.

Trình tự không cần phải nghiêm ngặt, nhưng trang web mà tôi đang cào có giới hạn tại chỗ nên Scrapy cần phải bắt đầu cào cấp c ngay khi có thể trước 5 cấp bs được thu thập thông tin. Làm thế nào điều này có thể đạt được?

+0

Điều gì xảy ra nếu bạn bỏ cài đặt ưu tiên? –

+0

Tương tự, nỗ lực của tôi trong việc thêm ưu tiên là cố gắng xem liệu tôi có thể ảnh hưởng đến kết quả hay không. – Mishari

+1

Srcrapy sẽ không thu thập dữ liệu tự động bằng BaseSpider. Vì bạn đang sử dụng 'BaseSpider', điều rất quan trọng là hiển thị mã mà bạn đưa ra Yêu cầu a1, b1, c1, a2, b2, c2 (một số có thể được đặt bởi "Start-Urls" ... không chỉ 'b, c ". – wuliang

Trả lời

8

Depth tìm kiếm đầu tiên là chính xác những gì bạn đang mô tả:

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

Để thay đổi Scrapy làm tìm kiếm chiều rộng đầu tiên (a1, b1, c1, a2, vv ...), thay đổi các thiết lập này:

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

* Tìm thấy trong doc.scrapy.org FAQ

+0

Câu trả lời này không đúng. Trong ví dụ của OP, DFS là' (a1, b1 , c1, a2, ...) 'trong khi BFS là' (a1, a2, a3, b1, b2, b3, ...) '. Scrapy không sử dụng đúng DFS, hãy xem [vấn đề GitHub] mở (https: //github.com/scrapy/scrapy/issues/1739). – JayStrictor

1

Tôi tin rằng bạn đang nhận thấy sự khác biệt giữa các thuật toán tìm kiếm sâu-đầu tiên và chiều rộng đầu tiên (xem Wikipedia để biết trên cả hai.)

Scrapy có khả năng thay đổi mà thuật toán được sử dụng:

"Theo mặc định, Scrapy sử dụng hàng đợi LIFO để lưu trữ các yêu cầu đang chờ xử lý, về cơ bản có nghĩa là nó thu thập thông tin theo thứ tự DFO.Đơn đặt hàng này thuận tiện hơn trong hầu hết các trường hợp. các cài đặt sau: "

Xem http://doc.scrapy.org/en/0.14/faq.html để biết thêm thông tin trên.

0

Scrapy sử dụng DFO theo mặc định. Lý do của chuỗi các lần thu thập thông tin là các trang thu thập thông tin không chính xác thu thập dữ liệu một cách không đồng bộ. Mặc dù nó sử dụng DFO, trình tự có vẻ theo thứ tự không hợp lý vì sự chậm trễ mạng hoặc cái gì khác.

Các vấn đề liên quan