Ich bin neu auf dem Schrottplatz. Ich schreibe eine Spinne, die entworfen wurde, um eine lange Liste von URLs auf die Serverstatuscodes und gegebenenfalls auf die URLs zu überprüfen, an die sie weitergeleitet werden. Wichtig ist, dass, wenn es eine Kette von Weiterleitungen gibt, ich den Statuscode und die URL bei jedem Sprung wissen muss. Ich benutze response.meta ['redirect_urls'], um die URLs zu erfassen, bin mir aber nicht sicher, wie ich die Statuscodes erfassen soll - es scheint keinen Antwort-Metaschlüssel dafür zu geben.
Mir ist klar, dass ich vielleicht ein paar benutzerdefinierte Middlewear schreiben muss, um diese Werte zu enthüllen, aber ich weiß nicht genau, wie ich die Statuscodes für jeden Hop aufzeichnen soll und auch nicht, wie ich auf diese Werte zugreifen kann. Ich habe es mir angeschaut, kann aber kein Beispiel dafür finden. Wenn mir jemand in die richtige Richtung zeigen könnte, wäre es sehr geschätzt.
Zum Beispiel
%Vor%Bearbeiten - Basierend auf dem Feedback von warawauk und einiger wirklich proaktiver Hilfe von den Jungs auf dem IRC-Kanal (freenode #scrappy) habe ich es geschafft. Ich glaube, es ist ein wenig hacky, also Kommentare zur Verbesserung begrüßen:
(1) Deaktivieren Sie die Standard-Middleware in den Einstellungen und fügen Sie Ihre eigenen hinzu:
%Vor%(2) Erstelle deine CustomRedirectMiddleware in deiner middlewares.py. Er erbt von der Hauptklasse redirectmiddleware und erfasst die Umleitung:
%Vor%(3) Sie können jetzt mit
auf die Liste der Weiterleitungen in Ihrem Spider zugreifen %Vor% response.meta['redirect_urls'
wird von RedirectMiddleware . Ihr Spider-Callback erhält niemals Antworten dazwischen, nur die letzte nach allen Weiterleitungen.
Wenn Sie den Prozess steuern möchten, deaktivieren Sie die Unterklasse RedirectMiddleware
, deaktivieren Sie die ursprüngliche und aktivieren Sie Ihre. Dann können Sie den Umleitungsprozess steuern, einschließlich der Verfolgung der Antwortzustände.
Hier ist die ursprüngliche Implementierung (scrapy.contrib.downloadermiddleware.redirect.RedirectMiddleware):
%Vor% Wie Sie sehen, erstellt _redirect
method, das aus verschiedenen Teilen aufgerufen wird, meta['redirect_urls']
Und in der process_response
Methode wird return self._redirect(redirected, request, spider, response.status)
aufgerufen, was bedeutet, dass die ursprüngliche Antwort nicht an die Spinne weitergegeben wird.
KISS-Lösung: Ich dachte, es wäre besser, das strikte Minimum an Code hinzuzufügen, um das neue Weiterleitungsfeld zu erfassen, und RedirectMiddleware erledigt den Rest:
%Vor%Wenn Sie dann BaseSpider unterklassifizieren, können Sie mit folgendem Befehl auf den redirect_status zugreifen:
%Vor%Tags und Links python web-scraping scrapy