簡體   English   中英

Scrapy正在關注並抓取非允許的鏈接

[英]Scrapy is following and scraping non-allowed links

我有一個CrawlSpider設置為遵循某些鏈接並刮取一個新聞雜志,其中每個問題的鏈接遵循以下URL方案:

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

編輯:我使用一個更簡單的正則表達式2009年,2010年,2011年修復此問題,但我仍然很好奇為什么如果有人有任何建議上述不起作用。

您需要將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',
        ),
 )

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM