2012-11-22 45 views
0

我正在爬取一個擁有?locale = en或locale = jp的網站...Scrapy的LinkExtraction - 全球否認?

我只想抓取網址中未指定區域設置的網站。

目前我有這樣的:

# More specific ones at the top please 
    # In general, deny all locale specified links 
    rules = ( 
     # Matches looks 
     # http://lookbook.nu/look/4273137-Galla-Spectrum-Yellow 
     Rule(SgmlLinkExtractor(allow=('/look/\d+'), deny=('\?locale=')), callback='parse_look'), 

     # Matches all looks page under user overview, 
     Rule(SgmlLinkExtractor(allow=('/user/\d+[^/]+/looks/?$'), deny=('\?locale=')), 
      callback='parse_model_looks'), 
     Rule(SgmlLinkExtractor(allow=('/user/\d+[^/]+/looks\?page=\d+$'), deny=('\?locale=')), 
      callback='parse_model_looks'), 

     # Matches all user overview pages 
     Rule(SgmlLinkExtractor(allow=('/user/\d+[^/]*/?$'), deny=('\?locale=')), 
      callback='parse_model_overview'), 

我反覆否認無處不在。

還有更好的方法嗎?

我試圖做一般的規則來拒絕所有的\?locale =但沒有奏效。

+1

如何編寫一個構造規則的函數並始終傳遞拒絕參數。然後在規則元組中使用它。例如。 rules =(mkrule(regex1,callback1),mkrule(regex2,callback2),...) –

回答

2

你可以構建一個複雜的「允許」正則表達式,但寫正則表達式通常是痛苦的。 您還可以使用:在process_links方法,在這裏描述: https://scrapy.readthedocs.org/en/latest/topics/spiders.html?highlight=process_links

這將打開的可能性通話網址解析和分析參數:

Rule(SgmlLinkExtractor(allow=('/look/\d+')), 
     process_links='process_links', 
     callback='parse_look') 

def process_links(self,links): 
    return [link for link in links if self.valid_links(link)) 

def valid_links(self,link): 
    import urlparse 
    urlp=urlparse.urlparse(link.url) 
    querydict=urlparse.parse_qs(urlp.query) 
    return "locale" not in querydict 

這是一個更安全的技術檢查參數