Festlegen, dass die Scrapy-Proxy-Middleware bei jeder Anforderung rotiert

Diese Frage gibt es zwangsläufig in zwei Formen, weil ich den besseren Weg zu einer Lösung nicht kenne.

Eine Website, die ich crawle, führt mich häufig zu einer umgeleiteten "Benutzer blockierten" Seite, aber die Häufigkeit (nach Anforderungen / Zeit) scheint zufällig zu sein, und es scheint, dass sie eine schwarze Liste enthält, die viele der von mir verwendeten "offenen" Proxy-Listen blockiert durch Proxymesh. Damit...

Wenn Scrapy eine "Weiterleitung" zu seiner Anfrage erhält (z.DEBUG: Redirecting (302) to (GET http://.../you_got_blocked.aspx) from (GET http://.../page-544.htm)), wird es weiterhin versuchen, zu Seite-544.htm zu gelangen, oder wird es weiter zu Seite-545.htm gehen und Seite-544.htm für immer verlieren? Wenn es "vergisst" (oder es als besucht zählt), gibt es eine Möglichkeit, es anzuweisen, diese Seite weiterhin zu wiederholen? (Wenn es das natürlich tut, dann yay und gut zu wissen ...)

Was ist die effizienteste Lösung?

(a) Was ich gerade mache: Verwenden eines Proxy-Rotations-Proxys über die Umgebungsvariable http_proxy, die anscheinend die Proxys häufig genug rotiert, um zumindest ziemlich regelmäßig die Umleitungen des Zielstandorts zu durchlaufen. (Nachteile: Die offenen Proxies klingeln nur langsam, es gibt nur so viele, dass Proxymesh mich nach 10 Gigs pro Gig auflädt, ich nurbrauchen Ich weiß nicht, wie oft oder bei welchem Auslöser sie sich drehen, und ob: Ich weiß nicht, ob die Seiten, von denen ich umgeleitet werde, von Scrapy erneut in die Warteschlange gestellt werden ...) ( Wenn Proxymesh bei jeder Anfrage wechselt, kann ich angemessene Kosten bezahlen.)

(b) Wäre es sinnvoll (und einfach), Middleware zu verwenden, um bei jeder Umleitung einen neuen Proxy auszuwählen? Was ist mit jeder einzelnen Anfrage? Wäre das durch etwas anderes wie TOR oder Proxifier sinnvoller? Wenn dies relativ einfach ist, wie würde ich es einrichten? Ich habe so etwas an einigen Stellen gelesen, aber die meisten sind mit kaputten Links oder veralteten Scrapy-Befehlen veraltet.

Als Referenz habe ich Middleware für Proxy Mesh eingerichtet (ja, ich verwende die Umgebungsvariable http_proxy, aber ich bin ein Fan von Redundanz, wenn es darum geht, keine Probleme zu bekommen). Das ist also, was ich aktuell für den Fall habe, dass es darauf ankommt:

 class ProxyMiddleware(object):
  def process_request(self, request, spider):
    request.meta['proxy'] = "http://open.proxymesh.com:[port number]"

    proxy_user_pass = "username:password"
    encoded_user_pass = base64.encodestring(proxy_user_pass)
    request.headers['Proxy-Authorization'] = 'Basic ' + encoded_user_pass

Antworten auf die Frage(1)

Ihre Antwort auf die Frage