Скриншоты Scrapy Splash?

Я пытаюсь очистить сайт, делая скриншот каждой страницы. До сих пор мне удалось собрать воедино следующий код:

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)

На сайт попадает нормально (пример, stackoverflow) и возвращает данные для png_bytes, но при записи в файл - возвращает битое изображение (не загружается).

Есть ли способ исправить это или найти более эффективное решение? Я читал, что Splash Lua Scripts может это сделать, но не смог найти способ реализовать это. Спасибо.


person Exam Orph    schedule 18.07.2017    source источник


Ответы (1)


Вы дважды декодируете из base64:

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

Просто сделайте:

    def parse_result(self, response):
        imgdata = base64.b64decode(response.data['png'])
        filename = 'some_image.png'
        with open(filename, 'wb') as f:
            f.write(imgdata)
person paul trmbrth    schedule 18.07.2017
comment
Спасибо большое - очень помогло!! - person Exam Orph; 18.07.2017
comment
Еще один вопрос, если вы не возражаете, вы знаете, как сделать скриншот всей страницы? Я попытался установить render_all в True как часть аргументов, но получил эту ошибку: WARNING: Bad request to Splash: {'info': {'argument': 'render_all', 'type': 'bad_argument', 'description': "Pass non-zero 'wait' to render full webpage"}, 'type': 'BadOption', 'description': 'Incorrect HTTP API arguments', 'error': 400} - person Exam Orph; 18.07.2017
comment
Я нашел решение - это было добавить задержку, позволяющую выполнить полный рендеринг! Теперь все в порядке, еще раз спасибо за помощь. - person Exam Orph; 18.07.2017
comment
@ExamOrph, где и как мне добавить задержку? благодарю вас - person Ami Hollander; 05.11.2017