2017-05-18 6 views
1

http://www.example.com/ABC/1は、http://www.example.com/abc/1と同じページであるように、大文字と小文字を区別しない、一連のURLを大文字と小文字を区別せずにクロールしています。私のCrawlSpiderでは、私は次のようになります実行した:両方のバリアントをピックアップいる重複のない大文字と小文字を区別しないURLのクロール

Rule(LinkExtractor(allow=('(?i)http://www.example.com/abc/\d+',)) 

を、私は重複フィルタがそれらを別々のページであることを考慮するため、二重のページをクロールしてしまいます。

RFPDupeFilterをサブクラス化せずにDUPEFILTER_CLASSの設定を変更せずに、1つのバリアントまたは他の(ただし両方ではなく)を訪問するように強制する簡単な方法はありますか?それとも最善の解決策ですか?

答えて

3

Scrapyのルールクラスには、小文字へのすべてのリンクを正規化するために使用できる属性process_linksがあります。要旨では:

def links_as_lower(links): 
    for link in links: 
     link.url = link.url.lower() 
     yield link 

Rule(LinkExtractor(allow=('(?i)http://www.example/abc/\d+',), process_links=links_as_lower) 

scrapyのルールについての完全なドキュメントは、私は答えとしてこれを受け入れるつもりですが、この答えを探して、誰の参考のために、process_links` `で撮影した機能がかかるhere

+0

ですリンクのリストと修正されたリンクのリストを返すので、この回答のコードは最初に投稿されたとおりに失敗します。 – JoshAdel

+0

ありがとうございます。私はこの特異性を忘れていました - はい、ルールは1つの座席で複数のリンクを抽出する可能性が高いので、 'process_links'メソッドはこれを反映しなければなりません。それに応じてコードを調整しました。 – rrschmidt

+0

'links_as_lower'はまだ間違っています。 'l'は' Link'オブジェクトであり、生のURLではなく、 'links'の各' link'に対して 'l.url = l.url.lower()'を設定する必要があります。 – JoshAdel

関連する問題