2016-08-23 5 views
0

私は5-6ドメインをクロールする必要があります。オフサイトURLに上記のセットの部分文字列が含まれていて、それを処理してフィルタリングしない場合は、[aaa、bbb、ccc] と設定された一部の部分文字列の例が含まれているように、クローラを作成します。私はカスタムミドルウェアを書くべきですか、または私はちょうど許可されたドメインで正規表現を使用することができます。Scrapy - 正規表現に基づいて処理されるオフサイトリクエスト

答えて

3

オフサイトミドルウェアは既定でregexを既に使用していますが、公開されていません。あなたが正規表現に提供するドメインをコンパイルしますが、ドメインはエスケープされるので、allowed_domainsの正規表現コードは動作しません。

あなたができることは、ミドルウェアを拡張し、get_host_regex()メソッドをオーバーライドして独自のオフサイトポリシーを実装することです。

scrapy.spidermiddlewares.offsite.OffsiteMiddlewareで元のコード:

# middlewares.py  
class MyOffsiteMiddleware(OffsiteMiddleware): 
    def get_host_regex(self, spider): 
     allowed_regex = getattr(spider, 'allowed_regex', '') 
     return re.compile(allowed_regex) 

# spiders/myspider.py 
class MySpider(scrapy.Spider): 
    allowed_regex = '.+?\.com' 

# settings.py 
DOWNLOADER_MIDDLEWARES = { 
    'myproject.middlewares.MyOffsiteMiddleware': 666, 
} 
+0

が、これは私が私で指定された部分文字列が含まれている特定のURLをクロールすることができます:あなたはあなた自身の正規表現を返すようにオーバーライドすることができ

def get_host_regex(self, spider): """Override this method to implement a different offsite policy""" allowed_domains = getattr(spider, 'allowed_domains', None) if not allowed_domains: return re.compile('') # allow all by default regex = r'^(.*\.)?(%s)$' % '|'.join(re.escape(d) for d in allowed_domains if d is not None) return re.compile(regex) 

? –

+0

私は質問をしたときにこれに遭遇しました。 –

+0

@RishiSaraswatはい。私が提供した例では、 'allowed_regex = 'aaa | bbb | ccc'' – Granitosaurus

関連する問題