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

为什么 Splash+Scrapy 将 html 标头添加到 json 响应

如何解决为什么 Splash+Scrapy 将 html 标头添加到 json 响应

我缺少什么?

我正在尝试抓取一些 json,但我一直收到带有 json 响应的 html 标头:

response.data['html'] 返回:

2021-02-18 10:35:57 [bcb] DEBUG: b'<html><head></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">{"TotalRows":132,"RowCount":15,"Rows":[{"tit`....

代码如下:

    yield scrapy.Request(address_pesquisa,self.parse,Meta={
            'splash': {
                'args': {
                    # set rendering arguments here
                    'html': 1,'png': 0,},# optional parameters
                'endpoint': 'render.json',# optional; default is render.json
                'splash_url': 'http://192.168.15.100:8050',# optional; overrides SPLASH_URL
                'slot_policy': scrapy_splash.SlotPolicy.PER_DOMAIN,'splash_headers': {},# optional; a dict with headers sent to Splash
                'dont_process_response': False,# optional,default is False
                'dont_send_headers': True,default is False
                'magic_response': True,default is True
            }
        })

我必须自己用一些正则表达式或什么来删除这个标题? 还是我的scrapy配置错误

解决方法

提取 HTML 中的 JSON 的直接选项是使用 XPath(或 CSS 选择器)。 Here's the documentation for Scrapy Selectors.

scrapy.Request 回调函数(self.parse)中的类似内容

json_response = response.xpath('html/body/pre/text()').get()
json_response = json.loads(json_response)

请注意,我没有测试代码,因此您可能需要对其进行一些更改(如果我输入了 XPath 或其他内容)。

此外,您可能想尝试使用 curl 或 Scrapy shell 下载页面,并检查 HTML 部分是否仍在响应中。如果没有,以某种方式使用 Splash 可能会使网站返回包含 HTML 的响应。


更新为什么使用 curl 时 HTML 不在响应中:

一种可能性是使用浏览器时 Web 服务器返回的响应与使用 curl 时不同。这样做的原因之一是使 JSON 对使用浏览器的用户更具可读性。我的意思是,当 JSON 格式正确时,尝试阅读 JSON 会更容易,而不仅仅是一行中的所有内容:D

因此,如果是这种情况,我的猜测是 Splash 将一些数据传递给服务器(即用户代理,能够呈现 JavaScript),使服务器返回 HTML 响应。

跳过 Splash 并仅使用 Scrapy Request 来发出请求可能会有所帮助(并且还可以使爬虫更快一点)。

无论如何,如果 XPath 工作正常(并且小且唯一可能的速度增加无关紧要),请使用 XPath。

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