2016-10-26 2 views
0

Ich habe Probleme bei der Kommunikation zwischen Selen und Scrapy-Objekt.Wie schreibe anpassen Downloader Middleware für Selen und Scrapy?

Ich benutze Selen, um mich auf einer Site anzumelden, sobald ich diese Antwort bekomme, möchte ich die Scrape-Funktionäre zum Parsen und Verarbeiten benutzen. Bitte helfen Sie mir, Middleware zu schreiben, so dass jede Anfrage Selen Web-Treiber durchlaufen sollte und die Antwort sollte an scrapy übergeben werden.

Vielen Dank!

Antwort

3

Es ist ziemlich einfach, eine Middleware mit einem WebDriver erstellen und verwenden process_request die Anforderung abfangen, verwerfen sie und verwenden Sie die URL es es zu einem Selen WebDriver passieren musste:

from scrapy.http import HtmlResponse 
from selenium import webdriver 


class DownloaderMiddleware(object): 
    def __init__(self): 
     self.driver = webdriver.Chrome() # your chosen driver 

    def process_request(self, request, spider): 
     # only process tagged request or delete this if you want all 
     if not request.meta.get('selenium'): 
      return 
     self.driver.get(request.url) 
     body = self.driver.page_source 
     response = HtmlResponse(url=self.driver.current_url, body=body) 
     return response 

Die Kehrseite der Medaille ist dass du die Nebenläufigkeit in deiner Spinne beseitigen musst, da selen webdrive immer nur eine URL gleichzeitig verarbeiten kann. Siehe hierzu settings documentation page.

+0

Hallo Granitosaurus, danke für die Antwort. Ich würde gerne wissen, welche Änderungen ich an setting.py vornehmen muss und welchen Namen ich dieser Middleware geben soll und wo ich sie in meinem Projekt speichern soll. danke. – world

+0

@world Sie können sehen, wie man eine benutzerdefinierte Middleware [hier] aktivieren kann (https://doc.scrapy.org/en/latest/topics/downloader-middleware.html#activating-a-downloader-middleware) – Granitosaurus

+0

Es ist unaufrichtig zu sagen Sie, es ist einfach, da Sie auf diese Weise viel mehr als nur Nebenläufigkeit brechen, da Sie den gesamten Downloader umgehen. Throttling, Cookies, Header, Proxy und mehr werden nicht richtig eingestellt und Selenium wird mit dem, was es standardmäßig ist, holen. Außerdem werden die Eigenschaften des Antwortobjekts nicht korrekt eingestellt, wie zum Beispiel 'status' und' headers'. – Rejected

Verwandte Themen