2011-12-16 77 views
6

我有一個CrawlSpider設立以下的某些環節和刮新聞雜誌,其中的鏈接,每一個問題遵循下列URL方案:Scrapy是繼刮不允許的鏈接

http://example.com/YYYY/DDDD/index.htm其中YYYY是年份, DDDD是三位或四位數問題編號。

我只想問題928以上,並有我的規則下面。我沒有任何問題連接到網站,抓取鏈接或提取項目(所以我沒有包括我的代碼的其餘部分)。蜘蛛似乎決定遵循不允許的鏈接。它試圖刮掉377,398等問題,並遵循「culture.htm」和「feature.htm」鏈接。這會引發很多錯誤,並且不是非常重要,但它需要大量的數據清理。任何關於發生了什麼問題的建議?

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',)),), 
    ) 

編輯:我解決了這個問題用一個更簡單的正則表達式FOT 2009年,2010年,2011年,但我仍然好奇,爲什麼上面的,如果任何人有任何建議不起作用。

回答

8

您需要將deny參數傳遞給SgmlLinkExtractor,該參數收集指向follow的鏈接。如果他們調用一個函數parse_item,則不需要創建如此多的Rule。我會寫你的代碼爲:

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', 
     ), 
    ) 

如果它在您使用的是parse_item規則真正的URL模式,它可以簡化爲這樣:

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

神奇。謝謝您的幫助! – Trey 2011-12-17 19:56:55