Przechwytywanie kodów statusu http za pomocą pająka do scrapy

Jestem nowy na scrapie. Piszę pająka przeznaczonego do sprawdzania długiej listy adresów URL dla kodów statusu serwera i, w stosownych przypadkach, do jakich adresów URL są przekierowywane. Co ważne, jeśli istnieje łańcuch przekierowań, muszę znać kod statusu i adres URL przy każdym skoku. Używam response.meta ['redirect_urls'] do przechwytywania adresów URL, ale nie mam pewności, jak przechwycić kody statusu - nie wydaje się, aby był dla nich meta klucz odpowiedzi.

Zdaję sobie sprawę, że być może będę musiał napisać niestandardową odzież pośrednią, aby ujawnić te wartości, ale nie jestem całkiem pewien, jak rejestrować kody statusu dla każdego skoku, ani jak uzyskać dostęp do tych wartości z pająka. Spojrzałem, ale nie mogę znaleźć przykładu tego, kto to robi. Jeśli ktoś może wskazać mi właściwy kierunek, byłoby to bardzo mile widziane.

Na przykład,

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

Edytować - Na podstawie opinii od warawauk i naprawdę proaktywnej pomocy chłopaków z kanału IRC (freenode #scrappy) udało mi się to zrobić. Wierzę, że jest to trochę hacky, więc wszelkie komentarze dotyczące poprawy są mile widziane:

(1) Wyłącz domyślne oprogramowanie pośrednie w ustawieniach i dodaj własne:

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

(2) Utwórz swój CustomRedirectMiddleware w swoim middlewares.py. Dziedziczy z głównej klasy redirectmiddleware i przechwytuje przekierowanie:

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) Możesz teraz uzyskać dostęp do listy przekierowań w swoim pająku

request.meta['redirect_status']

questionAnswers(3)

yourAnswerToTheQuestion