【问题标题】:How to read JSON from URL in Python?如何在 Python 中从 URL 读取 JSON?
【发布时间】:2015-10-26 10:34:22
【问题描述】:

我正在尝试使用 Python 从 Web 获取 JSON 文件。如果我在浏览器(Mozilla 或 Chromium)中打开 URL,我会看到 JSON。但是当我使用 Python 执行以下操作时:

response = urllib2.urlopen(url)
data = json.loads(response.read())

我收到一条错误消息,告诉我以下内容(英文翻译后):Errno 10060,a connection troughs an error,因为服务器在一段时间后没有反应,或者连接错误,或者主机没有反应。

添加

看起来有很多人遇到了所描述的问题。类似(或相同)问题也有一些答案。比如here我们可以看到如下解决方案:

import requests

r = requests.get("http://www.google.com", proxies={"http": "http://61.233.25.166:80"})
print(r.text)

这对我来说已经向前迈进了一步(我认为代理很可能是问题的原因)。但是,我仍然没有完成它,因为我不知道我的代理的 URL,我可能需要用户名和密码。我怎样才能找到它们?为什么我的浏览器没有我的浏览器?

增加了 2 个

我想我现在更进一步了。我已经使用这个网站来了解我的代理是什么:http://www.whatismyproxy.com/

然后我使用了以下代码:

proxies = {'http':'my_proxy.blabla.com/'}
r = requests.get(url, proxies = proxies)
print r

结果我得到了

<Response [404]>

看起来不太好,但至少我认为我的代理是正确的,因为当我随机更改代理的地址时,我得到另一个错误:

Cannot connect to proxy

所以,我可以连接到代理,但没有找到。

【问题讨论】:

标签: python json urllib2 urllib


【解决方案1】:

当您尝试从在线资源(URL)获取 json 时,我认为可能有问题。只是为了说清楚,这里有一个小代码sn-p

#!/usr/bin/env python

try:
    # For Python 3+
    from urllib.request import urlopen
except ImportError:
    # For Python 2
    from urllib2 import urlopen

import json

def get_jsonparsed_data(url):
    response = urlopen(url)
    data = str(response.read())
    return json.loads(data)

如果您仍然遇到连接错误,您可以尝试几个步骤:

  1. 尝试 urlopen() 来自解释器(交互模式)的随机站点。如果您能够获取源代码,那您就很好。如果不检查互联网条件或尝试请求模块。 Check here

  2. 检查并查看 URL 中的 json 语法是否正确。对于示例 json 语法检查 here

  3. 试试 simplejson 模块。

编辑 1: 如果您想使用系统范围的代理访问网站,则必须使用代理处理程序来使用环回(本地主机)连接到该代理。示例代码如下所示。

proxy = urllib2.ProxyHandler({
    'http': '127.0.0.1',
    'https': '127.0.0.1'
})
opener = urllib2.build_opener(proxy)
urllib2.install_opener(opener)
# this way you can send both http and https request using proxies
urllib2.urlopen('http://www.google.com')
urllib2.urlopen('https://www.google.com')

我没有经常使用 ProxyHandler。我只知道理论和代码。我确信有更好的方法通过代理访问网站;一种不涉及每次运行程序时都安装开启程序的方法。但希望它能为您指明正确的方向。

【讨论】:

  • 我的问题发生在第 1 步(因此,这与解析 JSON 无关)。我试图打开不同的 URL,但它不起作用。这与互联网连接无关,因为我确实在浏览器中看到了这些 URL。我认为这与代理有关。不知何故,我的浏览器请求可以通过它,而 Python 不是。
  • 如果您的计算机使用代理设置,您必须安装代理处理程序才能使用系统范围的代理设置访问网站。我将编辑上面的答案以包含代码。
  • 上面的代码会将您的程序路由到您的本地主机(127.0.0.1),然后再次路由到您的代理(系统集),然后到请求的网站。
猜你喜欢
  • 2016-08-26
  • 1970-01-01
  • 2012-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-05
  • 1970-01-01
  • 2015-01-20
相关资源
最近更新 更多