【问题标题】:Scrapy on a JSON response抓取 JSON 响应
【发布时间】:2018-01-28 18:12:30
【问题描述】:

我在 Scrapy 中抓取 json 响应时遇到问题。我收到以下错误:

TypeError:JSON 对象必须是 str,而不是 'Response'

我尝试通过导入编解码器并解码对 utf-8 的响应使用以下方法对其进行解码,但由于某种原因它无法正常工作。代码:

import scrapy
import json

class SrealitkyBuySpiderSpider(scrapy.Spider):
    name = "srealitky_buy"
    allowed_domains = ["https://www.sreality.cz/"]
    start_urls = ['https://www.sreality.cz/api/cs/v2/estates?category_main_cb=1&category_type_cb=1&per_page=20&region=Praha']

    def parse(self, response):
        jsonresponse = json.loads(response)
        print(jsonresponse)

我也尝试在使用 json.loads 时将 .text 添加到响应中,但随后出现“响应没有属性 'text'”的错误。

jsonresponse = json.loads(response.text)

有谁知道怎么回事?

【问题讨论】:

  • 谢谢 Cuber,我刚刚编辑了我的第一个问题。我尝试将 reponse.text 添加到 json.loads,但随后出现错误“AttributeError: Response object has no attribute 'text'”...

标签: python json scrapy


【解决方案1】:

如果您查看type(response),它将是scrapy.http.response.text.TextResponse

response.body 将给b'{"meta_description": "5192 realit v nab\\u00eddce prodej byt\\u016f, .... "collective"}}'

所以你需要使用

jsonresponse = json.loads(response.body)
print(jsonresponse["meta_description"])
'5192 realit v nabídce prodej bytů, Praha. Vyberte si novou nemovitost na sreality.cz s hledáním na mapě a velkými náhledy fotografií nabízených bytů.'

Edit-1

如果上面因为 Python 版本对你不起作用,请尝试下面

jsonresponse = json.loads(response.body.decode("utf-8"))

【讨论】:

  • 谢谢!它仍然无法正常工作,使用 json.loads(response.body) 我收到一个新错误:“TypeError: JSON must be str, not 'bytes'”
  • 哪个版本的 Python?
  • python 版本 3.4.2,我实际上看了一下类型(响应),它实际上说 ,所以没有得到与你相同的响应有吗?
  • 我希望你使用的是最新的 Scrapy 版本?我测试最新的
  • Scrapy 1.1.1版本,我今天早上才通过Conda安装的?