Ubuntu 18.04 python 2.7 urllib请求未获取数据

Ubuntu 18.04 python 2.7 urllib请求未获取数据,python,python-requests,urllib2,urllib,ubuntu-18.04,Python,Python Requests,Urllib2,Urllib,Ubuntu 18.04,我有一个pyhton脚本,它在ubuntu 16.04上运行没有问题 但是它不会在ubuntu 18.04中获取数据,你知道问题出在哪里吗? 没有错误 try: exchrate=float(json.loads(requests.get("http://api.coindesk.com/v1/bpi/currentprice.json").read())['bpi'][currency]['rate_float']) print exchrate

我有一个pyhton脚本,它在ubuntu 16.04上运行没有问题 但是它不会在ubuntu 18.04中获取数据,你知道问题出在哪里吗? 没有错误

    try:
        exchrate=float(json.loads(requests.get("http://api.coindesk.com/v1/bpi/currentprice.json").read())['bpi'][currency]['rate_float'])
        print exchrate
    except:
            try:
                print("Can not get data from coindesk.com")
                print("Trying to get data from coinbase.com")
                exchrate=float(json.loads(urllib2.urlopen("https://api.coinbase.com/v2/exchange-rates?currency=BTC").read())["data"]["rates"][currency])
                print exchrate
            except:
                try:
                    print("Can not get data from coinbase.com")
                    print("Trying to get data from blockchain.info")
                    exchrate=float(json.loads(urllib2.urlopen("https://blockchain.info/ticker").read())[currency]["last"])
                    print exchrate
                except:
                    print("Can not get data from blockchain.info")
                    print("Failed to get BTC exchange rate")
                    sys.exit()
输出:

Can not get data from coindesk.com
Trying to get data from coinbase.com
Can not get data from coinbase.com
Trying to get data from blockchain.info
Can not get data from blockchain.info
Failed to get BTC exchange rate
6366.6563
完整代码如下:

请求可以。试试这个:

response = requests.get("http://api.coindesk.com/v1/bpi/currentprice.json")
rate_float = response.json()['bpi']["USD"]['rate_float']
print(rate_float)
输出:

Can not get data from coindesk.com
Trying to get data from coinbase.com
Can not get data from coinbase.com
Trying to get data from blockchain.info
Can not get data from blockchain.info
Failed to get BTC exchange rate
6366.6563
编辑:

没有错误

您可以默默地接受抛出的任何错误。这是一个坏主意,尤其是当您尝试调试时。不要这样做:

try:
    this_breaks()
except:
    try_other_thing()
你永远不会知道为什么这个坏掉了()。不要使用
try/except
并让异常显示,或者至少打印它:

try:
    this_breaks()
except Error as e:
    print("error: ", e)
    try_other_thing()
请参见请求可以。试试这个:

response = requests.get("http://api.coindesk.com/v1/bpi/currentprice.json")
rate_float = response.json()['bpi']["USD"]['rate_float']
print(rate_float)
输出:

Can not get data from coindesk.com
Trying to get data from coinbase.com
Can not get data from coinbase.com
Trying to get data from blockchain.info
Can not get data from blockchain.info
Failed to get BTC exchange rate
6366.6563
编辑:

没有错误

您可以默默地接受抛出的任何错误。这是一个坏主意,尤其是当您尝试调试时。不要这样做:

try:
    this_breaks()
except:
    try_other_thing()
你永远不会知道为什么这个坏掉了()。不要使用
try/except
并让异常显示,或者至少打印它:

try:
    this_breaks()
except Error as e:
    print("error: ", e)
    try_other_thing()

请参见

因为您正在使用请求库,所以应该在每个API上使用它。请求提供了提取JSON的方法,因此您不需要自己调用
JSON
模块

当多件事情可能出错时,将它们捆绑在一行中不是一个好主意。分阶段执行这些操作,这样您就可以准确地看到错误发生的位置,并对其进行适当的处理。此外,除了块之外,使用未命名的
块很少是一个好主意:您可能会捕获一些您不知道如何处理的内容

这是代码的重新组织版本

import requests

currency = "USD"

apis = [
    {
        "name": "coindesk.com",
        "url": "https://api.coindesk.com/v1/bpi/currentprice.json",
        "keys": ("bpi", currency, "rate_float"),
    },
    {
        "name": "coinbase.com",
        "url": "https://api.coinbase.com/v2/exchange-rates?currency=BTC",
        "keys": ("data", "rates", currency),
    },
    {
        "name": "blockchain.info",
        "url": "https://blockchain.info/ticker",
        "keys": (currency, "last"),
    },
]

for d in apis:
    name, url, keys = d["name"], d["url"], d["keys"]
    print("Trying", name)
    try:
        req = requests.get(url)
        req.raise_for_status()
    except requests.exceptions.RequestException as e:
        print(e)
        print("Cannot get data from", name)
        continue

    try:
        # Extract the exchange rate
        data = req.json()
        for k in keys:
            data = data[k]
    except KeyError as e:
        print("Bad key!:", e)
        continue

    try:
        # Convert the exchange rate to a float.
        # Some APIs return it as a float, but coinbase.com returns
        # a string. This code also handles None, which in JSON is null
        # If you just want to print the rate, this conversion is not needed.
        rate = float(data) 
        print("Rate", rate)
        break
    except (ValueError, TypeError) as e:
        print("Invalid exchange rate data", data, type(data))
else:
    print("Failed to get BTC exchange rate")
典型输出

Trying coindesk.com
Rate 6440.64

更新:我改进了此代码的错误处理。

既然您正在使用请求库,那么您应该在每个API上使用它。请求提供了提取JSON的方法,因此您不需要自己调用
JSON
模块

当多件事情可能出错时,将它们捆绑在一行中不是一个好主意。分阶段执行这些操作,这样您就可以准确地看到错误发生的位置,并对其进行适当的处理。此外,除了
块之外,使用未命名的
块很少是一个好主意:您可能会捕获一些您不知道如何处理的内容

这是代码的重新组织版本

import requests

currency = "USD"

apis = [
    {
        "name": "coindesk.com",
        "url": "https://api.coindesk.com/v1/bpi/currentprice.json",
        "keys": ("bpi", currency, "rate_float"),
    },
    {
        "name": "coinbase.com",
        "url": "https://api.coinbase.com/v2/exchange-rates?currency=BTC",
        "keys": ("data", "rates", currency),
    },
    {
        "name": "blockchain.info",
        "url": "https://blockchain.info/ticker",
        "keys": (currency, "last"),
    },
]

for d in apis:
    name, url, keys = d["name"], d["url"], d["keys"]
    print("Trying", name)
    try:
        req = requests.get(url)
        req.raise_for_status()
    except requests.exceptions.RequestException as e:
        print(e)
        print("Cannot get data from", name)
        continue

    try:
        # Extract the exchange rate
        data = req.json()
        for k in keys:
            data = data[k]
    except KeyError as e:
        print("Bad key!:", e)
        continue

    try:
        # Convert the exchange rate to a float.
        # Some APIs return it as a float, but coinbase.com returns
        # a string. This code also handles None, which in JSON is null
        # If you just want to print the rate, this conversion is not needed.
        rate = float(data) 
        print("Rate", rate)
        break
    except (ValueError, TypeError) as e:
        print("Invalid exchange rate data", data, type(data))
else:
    print("Failed to get BTC exchange rate")
典型输出

Trying coindesk.com
Rate 6440.64

更新:我改进了此代码的错误处理。

货币从cfg文件中读取,其通常USDcurrency从cfg文件中读取,其通常USDThank。它看起来不错,但当链接没有响应时会给出一些错误。@papmpi如果链接没有响应,它应该打印一条错误消息,然后尝试下一个URL。如果您不想看到该错误消息,只需删除或注释掉
print(e)
行即可。但我建议你在编写脚本时打印这样的信息。拥有一些多余的调试信息总比没有足够的调试信息要好。我花了几分钟测试这段代码(例如,使用格式错误的URL),但您可能应该进行更广泛的测试,以确保它能够处理所有可能的错误条件。它只是在出现一些错误时退出,例如尝试一个断开的链接,如:1api.coindesk.com而不是api.coindesk.com…@papampi这很奇怪。在我的系统上,它不会在那个坏的URL上“退出”,它会打印一大堆异常消息。无论如何,我已经通过使用所有请求异常继承自的通用请求异常修复了这个问题。我还添加了一些错误处理,可以处理任何错误的汇率数据。@papampi这很酷,但是当你逐字使用别人的代码时,你应该给他们属性(提到他们的名字)。每个堆栈溢出页面的底部都会显示“需要属性的授权用户贡献”。至少,这意味着您应该提到代码作者的姓名和堆栈溢出。有关详细信息,请参阅和。谢谢。它看起来不错,但当链接没有响应时会给出一些错误。@papmpi如果链接没有响应,它应该打印一条错误消息,然后尝试下一个URL。如果您不想看到该错误消息,只需删除或注释掉
print(e)
行即可。但我建议你在编写脚本时打印这样的信息。拥有一些多余的调试信息总比没有足够的调试信息要好。我花了几分钟测试这段代码(例如,使用格式错误的URL),但您可能应该进行更广泛的测试,以确保它能够处理所有可能的错误条件。它只是在出现一些错误时退出,例如尝试一个断开的链接,如:1api.coindesk.com而不是api.coindesk.com…@papampi这很奇怪。在我的系统上,它不会在那个坏的URL上“退出”,它会打印一大堆异常消息。无论如何,我已经通过使用所有请求异常继承自的通用请求异常修复了这个问题。我还添加了一些错误处理,可以处理任何错误的汇率数据。@papampi这很酷,但是当你逐字使用别人的代码时,你应该给他们属性(提到他们的名字)。每个堆栈溢出页面的底部都会显示“需要属性的授权用户贡献”。至少,这意味着您应该提到代码作者的姓名和堆栈溢出。有关更多详细信息,请参阅和。