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可以做到这一点,但是一直无法找到实现的方法。谢谢。

点赞
用户2572383
用户2572383

你正尝试对 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)
2017-07-18 16:41:33