2011-12-16 29 views
6

Tôi đã một CrawlSpider thiết lập để liên kết nhất định sau đây và cạo một tạp chí tin tức nơi các liên kết đến từng vấn đề theo các chương trình URL sau:Scrapy được sau và cào các liên kết không phép

http://example.com/YYYY/DDDD/index.htm nơi YYYY là năm và DDDD là số có ba hoặc bốn chữ số.

Tôi chỉ muốn các vấn đề 928 trở đi và có các quy tắc của tôi bên dưới. Tôi không gặp bất kỳ sự cố nào khi kết nối với trang web, thu thập thông tin liên kết hoặc trích xuất các mục (vì vậy tôi không bao gồm phần còn lại của mã của mình). Con nhện dường như được xác định theo các liên kết không được phép. Nó đang cố gắng để loại bỏ các vấn đề 377, 398, và nhiều hơn nữa, và theo các liên kết "culture.htm" và "feature.htm". Điều này ném rất nhiều lỗi và không phải là rất quan trọng nhưng nó đòi hỏi rất nhiều làm sạch dữ liệu. Bất kỳ đề xuất nào về những gì đang xảy ra?

class crawlerNameSpider(CrawlSpider): 
name = 'crawler' 
allowed_domains = ["example.com"] 
start_urls = ["http://example.com/issues.htm"] 

rules = (
     Rule(SgmlLinkExtractor(allow = ('\d\d\d\d/(92[8-9]|9[3-9][0-9]|\d\d\d\d)/index\.htm',)), follow = True), 
     Rule(SgmlLinkExtractor(allow = ('fr[0-9].htm',)), callback = 'parse_item'), 
     Rule(SgmlLinkExtractor(allow = ('eg[0-9]*.htm',)), callback = 'parse_item'), 
     Rule(SgmlLinkExtractor(allow = ('ec[0-9]*.htm',)), callback = 'parse_item'), 
     Rule(SgmlLinkExtractor(allow = ('op[0-9]*.htm',)), callback = 'parse_item'), 
     Rule(SgmlLinkExtractor(allow = ('sc[0-9]*.htm',)), callback = 'parse_item'), 
     Rule(SgmlLinkExtractor(allow = ('re[0-9]*.htm',)), callback = 'parse_item'), 
     Rule(SgmlLinkExtractor(allow = ('in[0-9]*.htm',)), callback = 'parse_item'), 
     Rule(SgmlLinkExtractor(deny = ('culture.htm',)),), 
     Rule(SgmlLinkExtractor(deny = ('feature.htm',)),), 
    ) 

EDIT: Tôi đã cố định điều này bằng cách sử dụng đơn giản hơn nhiều regex 2009, 2010, nhưng tôi vẫn tò mò vì sao ở trên không có tác dụng nếu có bất kỳ đề xuất nào.

Trả lời

8

Bạn cần chuyển các đối số deny tới SgmlLinkExtractor để thu thập liên kết đến follow. Và bạn không cần phải tạo quá nhiều Rule nếu họ gọi một hàm parse_item. Tôi sẽ viết mã của bạn như:

rules = (
     Rule(SgmlLinkExtractor(
        allow = ('\d\d\d\d/(92[8-9]|9[3-9][0-9]|\d\d\d\d)/index\.htm',), 
        deny = ('culture\.htm', 'feature\.htm'), 
        ), 
      follow = True 
     ), 
     Rule(SgmlLinkExtractor(
       allow = (
        'fr[0-9].htm', 
        'eg[0-9]*.htm', 
        'ec[0-9]*.htm', 
        'op[0-9]*.htm', 
        'sc[0-9]*.htm', 
        're[0-9]*.htm', 
        'in[0-9]*.htm', 
        ) 
       ), 
       callback = 'parse_item', 
     ), 
    ) 

Nếu đó là mẫu url thực trong các quy tắc bạn đang sử dụng để parse_item, nó có thể được đơn giản hóa như sau:

Rule(SgmlLinkExtractor(
       allow = ('(fr|eg|ec|op|sc|re|in)[0-9]*\.htm',), 
       callback = 'parse_item', 
     ), 
) 
+0

Fantastic. Cảm ơn đã giúp đỡ! – Trey

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