6

Scrapy でクロールしているときに、いくつかのファイル タイプ リンク .exe .zip .pdf をスキップしたいのですが、特定の URL を定期的に使用するルールを使用したくありません。どのように?

アップデート:

そのため、本文がダウンロードされていない場合に応答する Content-Type だけで、このリンクをたどるかどうかを判断するのは困難です。ダウンローダのミドルウェアで URL をドロップするように変更します。ピーターとレオに感謝します。

4

3 に答える 3

15

Scrapy ルート ディレクトリ内の linkextractor.py に移動すると、次のように表示されます。

"""
Common code and definitions used by Link extractors (located in
scrapy.contrib.linkextractor).
"""

# common file extensions that are not followed if they occur in links
IGNORED_EXTENSIONS = [
    # images
    'mng', 'pct', 'bmp', 'gif', 'jpg', 'jpeg', 'png', 'pst', 'psp', 'tif',
    'tiff', 'ai', 'drw', 'dxf', 'eps', 'ps', 'svg',

    # audio
    'mp3', 'wma', 'ogg', 'wav', 'ra', 'aac', 'mid', 'au', 'aiff',

    # video
    '3gp', 'asf', 'asx', 'avi', 'mov', 'mp4', 'mpg', 'qt', 'rm', 'swf', 'wmv',
    'm4a',

    # other
    'css', 'pdf', 'doc', 'exe', 'bin', 'rss', 'zip', 'rar',
]

ただし、これは linkextractor に適用されるため (そしてルールを使用したくない場合)、これで問題が解決するかどうかはわかりません (ルールを使用したくないと指定したことに気づきました。ルールで直接指定する必要なく、ファイル拡張子の制限を変更する方法を尋ねました)。

良いニュースは、独自のダウンローダ ミドルウェアを構築して、望ましくない拡張子を持つ URL へのすべてのリクエストをドロップすることもできるということです。ダウンローダーミドルウェアを見る

request次のようにオブジェクトの url 属性にアクセスすることで、要求された URL を取得できます。request.url

基本的に、「.exe」または削除したい拡張子の文字列の末尾を検索し、その拡張子が含まれている場合はIgnoreRequest例外を返します。リクエストはすぐに削除されます。

アップデート

ダウンロードする前にリクエストを処理するには、カスタム ダウンローダー ミドルウェア内で「process_request」メソッドを定義する必要があります。

Scrapyのドキュメントによると

process_request

このメソッドは、ダウンロード ミドルウェアを通過する要求ごとに呼び出されます。

process_request() は、None、Response オブジェクト、または Request オブジェクトのいずれかを返す必要があります。

None を返す場合、Scrapy はこのリクエストの処理を続行し、最後に適切なダウンローダー ハンドラーが実行されたリクエスト (およびそのレスポンスがダウンロードされる) と呼ばれるまで、他のすべてのミドルウェアを実行します。

Response オブジェクトを返す場合、Scrapy は他のリクエストや例外ミドルウェア、または適切なダウンロード機能をわざわざ呼び出すことはありません。その応答を返します。Response ミドルウェアは、すべての Response で常に呼び出されます。

Request オブジェクトが返された場合、返されたリクエストは (Scheduler で) 再スケジュールされ、将来ダウンロードされます。元のリクエストのコールバックは常に呼び出されます。新しいリクエストにコールバックがある場合、ダウンロードされたレスポンスでコールバックが呼び出され、そのコールバックの出力が元のコールバックに渡されます。新しいリクエストにコールバックがない場合、ダウンロードされたレスポンスは元のリクエスト コールバックに渡されます。

IgnoreRequest 例外が返された場合、リクエスト全体が完全に破棄され、そのコールバックは呼び出されません。

基本的には、ダウンローダー クラスを作成し、リクエスト オブジェクトとスパイダー オブジェクトをパラメーターとして受け取るメソッド クラス process_request を追加するだけです。URL に不要な拡張子が含まれている場合は、IgnoreRequest 例外を返します。

これはすべて、ページがダウンロードされる前に発生する必要があります。ただし、代わりに応答ヘッダーを処理する場合は、Web ページに対して要求を行う必要があります。

ダウンローダに process_request と process_response メソッドの両方を常に実装できます。明らかな拡張子はすぐに削除され、何らかの理由で URL にファイル拡張子が含まれていない場合は、リクエストが処理されてキャッチされるという考えがあります。 process_request メソッド (ヘッダーで確認できるため)?

于 2012-08-29T03:53:17.777 に答える
3

.zip と .pdf は、デフォルトでは、scrapy によって無視されます

原則として、正規表現 (この場合は .htm*) に一致する URL のみを含めるようにルールを構成できます。

rules = (Rule(SgmlLinkExtractor(allow=('\.htm')), callback='parse_page', follow=True, ), )

または正規表現に一致するものを除外します:

rules = (Rule(SgmlLinkExtractor(allow=('.*'), deny=('\.pdf', '\.zip')), callback='parse_page', follow=True, ), )

詳細については、ドキュメントを参照してください。

于 2012-08-28T06:33:09.913 に答える