Splash return 嵌入式响应

Splash return embedded response

我正在寻找 return 来自网站的嵌入式响应。这个网站很难在没有 javascript 的情况下实现这种嵌入式响应,所以我希望使用 splash。我对 return 呈现的 HTML 不感兴趣,而是对一个嵌入式响应感兴趣。下面是我希望从 splash 返回的确切响应的屏幕截图。

此响应 return 是要呈现的站点的 JSON 对象,我想要来自此响应的原始 JSON return,我该怎么做在 Lua?

事实证明这有点棘手。以下是我发现的拼凑方法:

Splash 调用 LUA 脚本,从 Scrapy 调用:

scrpitBusinessUnits = """
            function main(splash, args)
                splash.request_body_enabled = true
                splash.response_body_enabled = true
                assert(splash:go(args.url))
                assert(splash:wait(18))
                splash:runjs('document.getElementById("RESP_INQA_WK_BUSINESS_UNIT$prompt").click();')
                assert(splash:wait(20))
                return {
                    har = splash:har(),
                }
            end
        """
        yield SplashRequest(
            url=self.start_urls[0],
            callback=self.parse, 
            endpoint='execute',
            magic_response=True,
            meta={'handle_httpstatus_all': True},
            args={'lua_source': scrpitBusinessUnits,'timeout':90,'images':0}, 
        )

此脚本通过返回整个页面加载的HAR文件来工作,关键是设置splash.request_body_enabled = truesplash.response_body_enabled = true以获取HAR文件中的实际响应内容。

HAR 文件只是一个具有不同名称的美化 JSON 对象...所以:

def parse(self, response):
        harData = json.loads(response.text)
        responseData = harData['har']['log']['entries']
        ...
        # Splash appears to base64 encode large content fields, 
        # you may have to decode the field to load it properly
        bisData = base64.b64decode(bisData['content']['text']) 

从那里您可以搜索 JSON 对象以获得准确的嵌入响应。

我真的不认为这是一个非常有效的方法,但它确实有效。