微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

飞溅返回嵌入式响应

如何解决飞溅返回嵌入式响应

我希望从网站返回嵌入式响应。这个网站在没有 javascript 的情况下很难达到这个嵌入式响应,所以我希望使用飞溅。我对返回呈现的 HTML 不感兴趣,而是对一个嵌入式响应感兴趣。下面是我希望从飞溅中恢复的确切响应的屏幕截图。

enter image description here

这个响应返回一个 JSON 对象给站点进行渲染,我想要这个响应返回的原始 JSON,我如何在 Lua 中做到这一点?

解决方法

事实证明这有点棘手。以下是我发现这样做的kludge:

使用 LUA 脚本的 Splash 调用,从 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 对象中搜索准确的嵌入响应。

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。