问题描述
我缺少什么?
我正在尝试抓取一些 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。