对Cointdesk的Python API调用返回403或405。如何排除故障?

对Cointdesk的Python API调用返回403或405。如何排除故障?,python,nginx,urllib,Python,Nginx,Urllib,我试图从Cointdesk的API中提取json数据,我尝试了两种方法(直接的urllib.request,然后是我传递UA数据的方法)。 两者都阻止了我(每个代码下面都有错误,命令行输出) 有没有办法让代码更健壮?更能抵抗阻塞?据我所知,没有文档,也没有repo,我可以查看它们的API是如何符合的。但是,我知道我正在直接访问Cointdesk希望人们使用的API,所以我觉得这有点奇怪(与您正在抓取web数据的情况相反) 谢谢你的帮助 此代码抛出了一个403,并带着错误退出: urllib.er

我试图从Cointdesk的API中提取json数据,我尝试了两种方法(直接的urllib.request,然后是我传递UA数据的方法)。 两者都阻止了我(每个代码下面都有错误,命令行输出)

有没有办法让代码更健壮?更能抵抗阻塞?据我所知,没有文档,也没有repo,我可以查看它们的API是如何符合的。但是,我知道我正在直接访问Cointdesk希望人们使用的API,所以我觉得这有点奇怪(与您正在抓取web数据的情况相反)

谢谢你的帮助

此代码抛出了一个403,并带着错误退出:

urllib.error.HTTPError:HTTP错误403:禁止

import urllib.request
import json
req = 'https://api.coindesk.com/v1/bpi/currentprice.json'
readdata = urllib.request.urlopen(req)
json_data = readdata.read()
print json_data
此代码引发405错误,错误为:

urllib.error.HTTPError:HTTP错误405:nginx/1.12.1

import json
import urllib.request

exchange_url = 'https://api.coindesk.com/v1/bpi/currentprice.json'
user_agent= 'Mozilla/5.0 (Windows NT 6.1; Win64; X64)'
values = {'name' : 'Mischa Kolding',
    'location' : 'Los Angeles',
    'language' : 'Python' }
headers = {'User-Agent' : user_agent }

data = urllib.parse.urlencode(values)
data = data.encode('ascii')
req = urllib.request.Request(exchange_url, data, headers)
with urllib.request.urlopen(req) as response:
    the_json = response.read()
print(the_json)   
我应该指出,直接导航到json链接会在浏览器中显示json

以下是Cointdesk的API页面:

编辑:

多亏了t.m.adam,我解决了这个问题。除了添加标题,我什么都做了,这才是真正需要的。谢谢你帮我解决noob问题:

#This is the API for BTC price request.  
import json
import urllib.request

url = 'https://api.coindesk.com/v1/bpi/currentprice.json'
hdr = { 'User-Agent' : 'Mozilla/5.0 (Windows NT 6.1; Win64; x64)' }

req = urllib.request.Request(url, headers=hdr)
readdata = urllib.request.urlopen(req)
json_data = readdata.read()
print(json_data)                        

如上图所示,这段代码有效。标题细节缺失(就像我脸上的鼻子一样清晰)


他们的api似乎只支持GET请求。你是从python文档中获得这些
值的吗?我从python文档中剪下了表单,并添加了符合示例的假值。我在链接的api文档中找不到任何接受post参数的示例。但是如果包含用户代理,你的第一个代码片段就可以正常工作在标题中。谢谢你的提示!我知道了。我将更新代码:)
#This is the API for BTC price request.  
import json
import urllib.request

url = 'https://api.coindesk.com/v1/bpi/currentprice.json'
hdr = { 'User-Agent' : 'Mozilla/5.0 (Windows NT 6.1; Win64; x64)' }

req = urllib.request.Request(url, headers=hdr)
readdata = urllib.request.urlopen(req)
json_data = readdata.read()
print(json_data)