2016-02-11 18 views
7

Wir haben scrapy-splash middleware verwendet, um die geschabte HTML-Quelle über die JavaScript-Engine Splash zu übergeben, die in einem Andock-Container ausgeführt wird.Scrapy Shell und Scrapy Splash

Wenn wir Splash in der Spinne verwenden möchten, konfigurieren wir mehr required project settings und ergeben ein Request spezifische meta arguments Angabe:

yield Request(url, self.parse_result, meta={ 
    'splash': { 
     'args': { 
      # set rendering arguments here 
      'html': 1, 
      'png': 1, 

      # 'url' is prefilled from request url 
     }, 

     # optional parameters 
     'endpoint': 'render.json', # optional; default is render.json 
     'splash_url': '<url>',  # overrides SPLASH_URL 
     'slot_policy': scrapyjs.SlotPolicy.PER_DOMAIN, 
    } 
}) 

Dies als dokumentiert funktioniert. Aber wie können wir scrapy-splash innerhalb der Scrapy Shell verwenden?

+2

Es stimmt, es gibt keine 'DEFAULT_REQUEST_META' wie es a [DEFAULT_REQUEST_HEADERS] (http://doc.scrapy.org/en/latest/topics/settings.html?#std:setting-DEFAULT_REQUEST_HEADERS), die eine schön wäre, Zusatz. Es gibt offene Diskussionen darüber, Splash standardmäßig über eine Middleware zu aktivieren (siehe https://github.com/scrapinghub/scrapyps-splash/issues/11). Eine weitere Option ist die Unterklasse scrapy-splash mdw und erzwingt Einstellungen dort. Ideen willkommen auf https://github.com/scrapinghub/scrapy-splash/issues –

Antwort

12

Umwickeln Sie einfach die URL, die Sie shell in splash http api.

So würden Sie so etwas wie:

scrapy shell 'http://localhost:8050/render.html?url=http://domain.com/page-with-javascript.html&timeout=10&wait=0.5' 

wo localhost:port ist, wo Ihr Splash-Dienst ausgeführt wird
url url ist Sie durchsuchen wollen, und nicht, um es zu urlquote vergessen!
render.html ist eine der möglichen http api Endpunkte, gibt redered HTML-Seite in diesem Fall
timeout Zeit in Sekunden Timeout
wait Zeit in Sekunden zu warten, für Javascript vor dem Lesen/Speichern der HTML auszuführen.

+0

Sie können wahrscheinlich einen Bash-Alias ​​machen, um dies bequemer zu machen. – Granitosaurus

9

Sie können scrapy shell ohne Argumente innerhalb eines konfigurierten Scrapy-Projekts ausführen, dann erstellen Sie req = scrapy_splash.SplashRequest(url, ...) und rufen Sie fetch(req).