Jestem nowy w złomowaniu. Piszę pająka zaprojektowanego do sprawdzania długiej listy adresów URL dla kodów statusu serwera i, w razie potrzeby, jakie adresy URL są przekierowywane. Co ważne, jeśli istnieje łańcuch przekierowań, podczas każdego skoku muszę znać kod statusu i adres URL. Używam response.meta ['redirect_urls'] do przechwytywania adresów URL, ale nie jestem pewien, jak przechwycić kody stanu - nie wydaje się, aby był to klucz meta odpowiedzi.Przechwytywanie kodów stanu http za pomocą scrapy pająk
Zdaję sobie sprawę, że być może będę musiał napisać niestandardową odzież sportową, aby ujawnić te wartości, ale nie jestem do końca jasny, 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, by ktoś to zrobił. Jeśli ktokolwiek może wskazać mi właściwy kierunek, byłoby to bardzo cenne.
Na przykład
items = []
item = RedirectItem()
item['url'] = response.url
item['redirected_urls'] = response.meta['redirect_urls']
item['status_codes'] = #????
items.append(item)
Edit - W oparciu o informacje zwrotne od warawauk a niektóre naprawdę aktywnej pomocy ze strony facetów na kanale IRC (freenode #scrappy) udało mi się to zrobić. Uważam, że to trochę hacky więc żadnych komentarzy do poprawy powitanie:
(1) Wyłącz domyślny middleware w ustawieniach, a także dodawać własne:
DOWNLOADER_MIDDLEWARES = {
'scrapy.contrib.downloadermiddleware.redirect.RedirectMiddleware': None,
'myproject.middlewares.CustomRedirectMiddleware': 100,
}
(2) Utwórz CustomRedirectMiddleware w swoich middleware .py. Dziedziczy z głównej klasy redirectmiddleware i oddaje 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żna uzyskać dostęp do listy przekierowań w pająka z
request.meta['redirect_status']
Powinieneś zamieścić swoje rozwiązanie jako odpowiedź – raben