2017-07-18 3 views
2

J'essaie de gratter un site tout en prenant une capture d'écran de chaque page. Jusqu'à présent, je suis parvenu à rassembler le code suivant:Scrapy Splash Captures d'écran?

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) 

Il obtient sur le bien du site (par exemple, stackoverflow) et renvoie les données pour png_bytes, mais lorsqu'il est écrit dans un fichier - renvoie une image brisée (doesn charge pas).

Existe-t-il un moyen de résoudre ce problème ou de trouver une solution plus efficace? J'ai lu que Splash Lua Scripts peut le faire, mais n'a pas réussi à trouver un moyen de l'implémenter. Merci.

Répondre

3

Vous décodent de base64 deux fois:

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

simplement:

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

Merci beaucoup - très utile !! –

+0

Une question de plus si cela ne vous dérange pas s'il vous plaît est, savez-vous comment faire pour capturer la page entière? J'ai essayé de placer 'render_all' à True dans le cadre des arguments, mais j'ai obtenu cette erreur:' AVERTISSEMENT: Mauvaise requête pour Splash: {'info': {'argument': 'render_all', 'type': 'bad_argument', 'description ': "Passe non nul' wait 'pour afficher la page web complète"},' type ':' BadOption ',' description ':' Arguments API HTTP incorrects ',' error ': 400} ' –

+2

J'ai trouvé la solution - it était d'ajouter un délai, permettant le rendu complet à prendre place! Tous triés maintenant, merci encore pour l'aide. –