2017-07-18 5 views
2

Ich versuche eine Seite zu scrappen, während ich einen Screenshot von jeder Seite mache. Bisher habe ich es geschafft, die folgenden Code um Stück zusammen:Scrapy Splash Screenshots?

import json 
import base64 
import scrapy 
from scrapy_splash import SplashRequest 


class ExtractSpider(scrapy.Spider): 
    name = 'extract' 

    def start_requests(self): 
     url = 'https://stackoverflow.com/' 
     splash_args = { 
      'html': 1, 
      'png': 1 
     } 
     yield SplashRequest(url, self.parse_result, endpoint='render.json', args=splash_args) 

    def parse_result(self, response): 
     png_bytes = base64.b64decode(response.data['png']) 

     imgdata = base64.b64decode(png_bytes) 
     filename = 'some_image.png' 
     with open(filename, 'wb') as f: 
      f.write(imgdata) 

Es wird auf dem Gelände in Ordnung (zB Stackoverflow) und gibt Daten für png_bytes, aber wenn in eine Datei geschrieben - gibt ein gebrochenes Bild (doesn 't laden).

Gibt es eine Möglichkeit, dies zu beheben oder alternativ eine effizientere Lösung zu finden? Ich habe gelesen, dass Splash Lua Scripts dies tun können, aber keine Möglichkeit gefunden haben, dies zu implementieren. Vielen Dank.

Antwort

3

Sie sind von base64 Dekodieren zweimal:

 png_bytes = base64.b64decode(response.data['png']) 
     imgdata = base64.b64decode(png_bytes) 

einfach tun:

def parse_result(self, response): 
     imgdata = base64.b64decode(response.data['png']) 
     filename = 'some_image.png' 
     with open(filename, 'wb') as f: 
      f.write(imgdata) 
+0

Danke soviel - sehr hilfreich !! –

+0

Noch eine Frage, wenn es Ihnen nichts ausmacht, ist, wissen Sie, wie man die ganze Seite screenshot? Ich habe versucht, 'render_all' auf True als Teil der Argumente zu setzen, aber habe diesen Fehler:' WARNUNG: Ungültige Anfrage an Splash: {'info': {'argument': 'render_all', 'type': 'bad_argument', 'description ': "Pass nicht-null' warte ', um volle Webseite zu rendern"},' type ':' BadOption ',' description ':' Falsche HTTP-API-Argumente ',' error ': 400} ' –

+2

Ich fand die Lösung - es sollte eine Verzögerung hinzufügen, damit der vollständige Rendervorgang stattfinden kann! Alle jetzt sortiert, danke nochmal für die Hilfe. –