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

複雑な「allow」正規表現を作成することはできますが、正規表現を書くのはしばしば苦痛です。また、使用することもできます: ここで説明されている 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 に答える