首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Splash返回嵌入式响应

Splash返回嵌入式响应
EN

Stack Overflow用户
提问于 2021-04-30 06:14:15
回答 1查看 45关注 0票数 0

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

此响应将一个JSON对象返回到站点进行呈现,我希望从此响应返回原始JSON,我如何在Lua中做到这一点?

EN

Stack Overflow用户

回答已采纳

发布于 2021-05-03 05:18:18

事实证明,这有点棘手。下面是我找到的用来做这件事的方法:

使用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对象中搜索确切的嵌入式响应。

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

票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67325733

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档