0

我正在抓取具有 ?locale=en 或 locale=jp... 的网站

我只对在 url 中没有指定语言环境的网站感兴趣。

目前我有这个:

  # 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= 但这没有用。

4

1 回答 1

2

您可以构建一个复杂的“允许”正则表达式,但编写正则表达式通常很痛苦。您还可以使用:此处描述的 process_links 方法: https ://scrapy.readthedocs.org/en/latest/topics/spiders.html?highlight=process_links

这将打开调用 url 解析器和分析参数的可能性:

  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

这是一种更安全的检查参数的技术

于 2012-11-27T13:33:30.620 回答