urllib 不适用于 api 请求

Posted

技术标签:

【中文标题】urllib 不适用于 api 请求【英文标题】:urllib not working with api request 【发布时间】:2018-06-07 07:17:55 【问题描述】:

我正在尝试编写此代码,我通过 api 从 openweathermap.org 请求此信息,并尝试打印当前时间的温度和位置。

大部分代码都是我在互联网上找到的技巧的混合体。

现在我收到此错误并且卡住了。谁能再次帮​​助我走上正确的道路?

这是我的代码:

import urllib.request, urllib.parse, urllib.error
import json

while True:
    zipcode = input('Enter zipcode: ')
    if len(zipcode) < 1: break

    url = 'http://api.openweathermap.org/data/2.5/weather?
zip='+zipcode+',nl&appid=db071ece9a338a36e9d7a660ec4f0e37?'

    print('Retrieving', url)
    uh = urllib.request.urlopen(url)
    data = uh.read().decode()
    print('Retrieved', len(data), 'characters')

    try:
        js = json.loads(data)
    except:
        js = None

    temp = js["main"]["temp"]
    loc = js["name"]

    print("temperatuur:", temp)
    print("locatie:", loc)

所以网址是这样的:http://api.openweathermap.org/data/2.5/weather?zip=3032,nl&appid=db071ece9a338a36e9d7a660ec4f0e37

我得到的错误是:

输入邮政编码:3343 正在检索http://api.openweathermap.org/data/2.5/weather?zip=3343,nl&appid=db071ece9a338a36e9d7a660ec4f0e37? 回溯(最近一次通话最后): 文件“weatherapi2.py”,第 12 行,在 呃 = urllib.request.urlopen(url) 文件“C:\Users\ErfanNariman\AppData\Local\Programs\Python\Python36\lib\urllib\request.py”,第 223 行,在 urlopen 返回 opener.open(url, 数据, 超时) 文件“C:\Users\ErfanNariman\AppData\Local\Programs\Python\Python36\lib\urllib\request.py”,第 532 行,打开 响应=方法(请求,响应) http_response 中的文件“C:\Users\ErfanNariman\AppData\Local\Programs\Python\Python36\lib\urllib\request.py”,第 642 行 'http', 请求, 响应, 代码, msg, hdrs) 文件“C:\Users\ErfanNariman\AppData\Local\Programs\Python\Python36\lib\urllib\request.py”,第 570 行,错误 返回 self._call_chain(*args) _call_chain 中的文件“C:\Users\ErfanNariman\AppData\Local\Programs\Python\Python36\lib\urllib\request.py”,第 504 行 结果 = 函数(*args) 文件“C:\Users\ErfanNariman\AppData\Local\Programs\Python\Python36\lib\urllib\request.py”,第 650 行,位于 http_error_default 引发 HTTPError(req.full_url, code, msg, hdrs, fp) urllib.error.HTTPError:HTTP 错误 401:未经授权

【问题讨论】:

【参考方案1】:

经过一些故障排除后,我发现了您的问题。你有一个额外的'?在你的 python 中你的 url 的末尾。

删除它,您的请求就可以正常工作。用这段代码试了一下,效果很好 -

import urllib.request, urllib.parse, urllib.error
import json

while True:
    zipcode = input('Enter zipcode: ')
    if len(zipcode) < 1: break

    url = 'http://api.openweathermap.org/data/2.5/weather?zip='+zipcode+',nl&appid=db071ece9a338a36e9d7a660ec4f0e37'

    print('Retrieving', url)
    uh = urllib.request.urlopen(url)
    data = uh.read().decode()
    print('Retrieved', len(data), 'characters')

    try:
        js = json.loads(data)
    except:
        js = None

    temp = js["main"]["temp"]
    loc = js["name"]

    print("temperatuur:", temp)
    print("locatie:", loc)

【讨论】:

以上是关于urllib 不适用于 api 请求的主要内容,如果未能解决你的问题,请参考以下文章

CORS 问题:C# API 请求适用于一个域,但不适用于另一个域

对外部 API 的 HTTP 请求适用于 .NET,但不适用于 React(CORS 问题)

PayPal REST API 送货地址不适用于 cURL 请求

对 PHP API 的 Axios GET 请求不适用于自定义标头

POST 请求适用于 Postman,但不适用于 Guzzle

Java Spring REST API CORS 不适用于通过 jQuery 和 Chrome 的 DELETE 请求