Erfassen von http-Statuscodes mit Scrapy Spider

Ich bin neu in Scrapy. Ich schreibe eine Spinne, mit der eine lange Liste von URLs nach den Serverstatuscodes und gegebenenfalls nach den URLs durchsucht werden soll, an die sie weitergeleitet werden. Wichtig ist, dass ich bei jeder Weiterleitung den Statuscode und die URL kennen muss. Ich verwende response.meta ['redirect_urls'], um die URLs zu erfassen, bin jedoch nicht sicher, wie die Statuscodes erfasst werden sollen - es scheint keinen Antwort-Metaschlüssel dafür zu geben.

Mir ist klar, dass ich möglicherweise angepasste Middlewear schreiben muss, um diese Werte freizulegen, aber es ist nicht ganz klar, wie die Statuscodes für jeden Hop protokolliert werden und wie ich von der Spinne aus auf diese Werte zugreifen kann. Ich habe nachgesehen, aber kein Beispiel dafür gefunden. Wenn jemand mich in die richtige Richtung lenken kann, wäre er sehr dankbar.

Zum Beispiel,

    items = []
    item = RedirectItem()
    item['url'] = response.url
    item['redirected_urls'] = response.meta['redirect_urls']     
    item['status_codes'] = #????
    items.append(item)

Bearbeiten - Aufgrund des Feedbacks von Warawauk und einiger wirklich proaktiver Hilfe von Leuten im IRC-Kanal (freenode #scrappy) habe ich es geschafft, dies zu tun. Ich glaube, es ist ein bisschen hacky, also sind Kommentare zur Verbesserung willkommen:

(1) Deaktivieren Sie die Standard-Middleware in den Einstellungen und fügen Sie Ihre eigene hinzu:

DOWNLOADER_MIDDLEWARES = {
    'scrapy.contrib.downloadermiddleware.redirect.RedirectMiddleware': None,
    'myproject.middlewares.CustomRedirectMiddleware': 100,
}

(2) Erstellen Sie Ihre CustomRedirectMiddleware in Ihrer middlewares.py. Es erbt von der Hauptklasse redirectmiddleware und erfasst die Weiterleitung:

class CustomRedirectMiddleware(RedirectMiddleware):
    """Handle redirection of requests based on response status and meta-refresh html tag"""

    def process_response(self, request, response, spider):
        #Get the redirect status codes
        request.meta.setdefault('redirect_status', []).append(response.status)
        if 'dont_redirect' in request.meta:
            return response
        if request.method.upper() == 'HEAD':
            if response.status in [301, 302, 303, 307] and 'Location' in response.headers:
                redirected_url = urljoin(request.url, response.headers['location'])
                redirected = request.replace(url=redirected_url)

                return self._redirect(redirected, request, spider, response.status)
            else:
                return response

        if response.status in [302, 303] and 'Location' in response.headers:
            redirected_url = urljoin(request.url, response.headers['location'])
            redirected = self._redirect_request_using_get(request, redirected_url)
            return self._redirect(redirected, request, spider, response.status)

        if response.status in [301, 307] and 'Location' in response.headers:
            redirected_url = urljoin(request.url, response.headers['location'])
            redirected = request.replace(url=redirected_url)
            return self._redirect(redirected, request, spider, response.status)

        if isinstance(response, HtmlResponse):
            interval, url = get_meta_refresh(response)
            if url and interval < self.max_metarefresh_delay:
                redirected = self._redirect_request_using_get(request, url)
                return self._redirect(redirected, request, spider, 'meta refresh')


        return response

(3) Sie können jetzt mit auf die Liste der Weiterleitungen in Ihrer Spinne zugreifen

request.meta['redirect_status']

Antworten auf die Frage(3)

Ihre Antwort auf die Frage