[英]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.