【问题标题】:How can I scrape the JSON file off this website?我怎样才能从这个网站上刮掉 JSON 文件?
【发布时间】:2021-10-08 17:24:33
【问题描述】:

我找不到任何解决我遇到的问题的方法。

我想从https://www.armadarealestate.com/Inventory.aspx抓取 JSON 文件

当我进入网络并选择从中加载 JSON 的 url 时,我只是被发送到另一个 HTML 页面,但响应部分说它包含有关我需要的属性的信息。

那么如何从网站中提取 JSON 文件?


import json
import requests

resp = requests.get(url='https://buildout.com/plugins/3e0f3893dc334368bb1ee6274ad5fd7b546414e9/inventory?utf8=%E2%9C%93&page=-3&brandingId=&searchText=&q%5Bsale_or_lease_eq%5D=&q%5Bs%5D%5B%5D=&viewType=list&q%5Btype_eq_any%5D%5B%5D=2&q%5Btype_eq_any%5D%5B%5D=5&q%5Btype_eq_any%5D%5B%5D=1&q%5Bcity_eq%5D=')

print(json.loads(resp.text))

JSONDecodeError: Expecting value: line 1 column 1 (char 0)

事实上,当我拉取属于 JSON 文件的请求时,我会从“https://buildout.com/plugins/3e0f3893dc334368bb1ee6274ad5fd7b546414e9/inventory?utf8=%E2%9C%93&page= 0&brandingId=&searchText=&q%5Bsale_or_lease_eq%5D=&q%5Bs%5D%5B%5D=&viewType=list&q%5Btype_eq_any%5D%5B%5D=2&q%5Btype_eq_any%5D%5B%5D=5&q%5Btype_eq_any%5D%5B% 5D=1&q%5Bcity_eq%5D=' 这是一个html文件。

我该如何解决这个问题?

【问题讨论】:

  • 404,你确定这个网址是好的吗?
  • 是的,抱歉,我认为该网址现在应该可以使用了。
  • 我尝试添加 headers={'content-type' : 'application/json; charset=utf-8'} 到请求,但它仍然获得 HTML。
  • 许多 REST API 根据通知的标头返回不同的格式;尝试查看他们的 API 文档(如果可用),或者,如果您可以访问工作页面,请尝试使用浏览器调试工具的“网络”查看正在发送的标头。
  • 通过向您的请求添加用户代理重试...可能是 firefox、chrome 之一...否则您发送请求默认值,服务器可能不喜欢刮板!在这里查看stackoverflow.com/questions/68633248/… 和用户代理 'Mozilla/5.0 (X11; Linux x86_64; rv:89.0) Gecko/20100101 Firefox/88.0'

标签: python json web-scraping python-requests scrapy


【解决方案1】:

您的响应对象 "resp" 不是有效的 JSON 格式。它只是一个html内容。 您可以使用beautifulsoup 从 html 中抓取内容。

您没有得到 JSON 对象的原因是 html 中的 Javascript。 Python 只要求单独下载 html 文档,如果你想渲染 Javascript 使用 selenium 之类的库。

否则,找到通过ajax加载JSON的URL并使用请求获取JSON。

在您的情况下,用于抓取 JSON 的测试代码:

import requests
url = "https://buildout.com/plugins/3e0f3893dc334368bb1ee6274ad5fd7b546414e9/inventory?utf8=%E2%9C%93&page=0&brandingId=&searchText=&q%5Bsale_or_lease_eq%5D=&q%5Bs%5D%5B%5D=&viewType=list&q%5Btype_eq_any%5D%5B%5D=2&q%5Btype_eq_any%5D%5B%5D=5&q%5Btype_eq_any%5D%5B%5D=1&q%5Bcity_eq%5D="
h = {'accept': 'application/json', 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.85 Safari/537.36'}  
r = requests.get(url, headers=h) 
print(r.json())

#prints the JSON data

【讨论】:

  • 但我不想要 HTML 内容,我想要 JSON 文件。当我请求 JSON 文件的 URL 时,我会返回 HTML。
  • @AlexObrien 这就是生活,我们常常得不到想要的东西
  • 您完全确定 URL 应该返回 JSON 吗?并非所有网站都使用 JSON。
  • 我不完全确定,但是响应选项卡包含 JSON 数据,但是当我请求 GET url 时它不返回 json 数据
  • 我做了一些测试。它似乎工作。添加了上面的代码。让我知道它是否适合您。
猜你喜欢
  • 2010-11-21
  • 2018-08-29
  • 1970-01-01
  • 1970-01-01
  • 2021-09-30
  • 1970-01-01
  • 2021-01-21
  • 2019-01-12
  • 1970-01-01
相关资源
最近更新 更多