3

Scrapyでカスタムダウンローダーミドルウェアを定義して、特定のURLへのすべてのリクエストを無視しようとしています(これらのリクエストは他のURLからリダイレクトされるため、最初にリクエストを生成するときにフィルターで除外できません)。

私は次のコードを持っています、そのアイデアは応答処理段階でこれをキャッチすることです(他のリクエストにリダイレクトするリクエストがどのように機能するか正確にはわからないため)、URLをチェックし、それが私が試しているものと一致するかどうかフィルターで除外してからIgnoreRequest例外を返します。そうでない場合は、通常どおり応答を返し、処理を続行できるようにします。

from scrapy.exceptions import IgnoreRequest
from scrapy import log

class CustomDownloaderMiddleware:

    def process_response(request, response, spider):
        log.msg("In Middleware " + response.url, level=log.WARNING)
        if response.url == "http://www.achurchnearyou.com//":
            return IgnoreRequest()
        else:
            return response

そして私はこれをミドルウェアの口述に追加します:

DOWNLOADER_MIDDLEWARES = {
    'acny.middlewares.CustomDownloaderMiddleware': 650
}

値は650で、RedirectMiddlewareの直後に実行する必要があります。

ただし、クローラーを実行すると、次のようなエラーが発生します。

ERROR: Error downloading <GET http://www.achurchnearyou.com/venue.php?V=00001>: process_response() got multiple values for keyword argument 'request'

このエラーはクロールされた最初のページで発生しており、なぜ発生しているのか理解できません。マニュアルの説明に従っていると思います。私は何が間違っているのですか?

4

2 に答える 2

10

私は自分の問題の解決策を見つけました-それはPythonでクラスとメソッドを作成する際のばかげた間違いでした。上記のコードは次のようにする必要があります。

from scrapy.exceptions import IgnoreRequest
from scrapy import log

class CustomDownloaderMiddleware(object):

   def process_response(self, request, response, spider):
       log.msg("In Middleware " + response.url, level=log.WARNING)
       if response.url == "http://www.achurchnearyou.com//":
           raise IgnoreRequest()
       else:
           return response

つまりself、最初のパラメーターとしてメソッドのパラメーターが必要であり、クラスはから継承する必要がありますobject

于 2012-12-29T00:01:15.087 に答える
0

問題のあるリクエストにリダイレクトされるリクエストがわかっている場合は、次のようになります。

def parse_requests(self, response):
    ....
    meta = {'handle_httpstatus_list': [301, 302]}
    callback = 'process_redirects'
    yield Request(url, callback=callback, meta=meta, ...)

def process_redirects(self, response):
    url = response.headers['location']
    if url is no good:
        return
    else:
        ...

このようにして、無駄な応答をダウンロードすることを回避します。

また、いつでも独自のカスタムリダイレクトミドルウェアを定義できます。

于 2017-10-23T10:00:50.563 に答える