使用Python urllib从SE API访问JSON数据

使用Python urllib从SE API访问JSON数据,python,json,api,post,urllib,Python,Json,Api,Post,Urllib,我正在尝试检索堆栈交换数据以用于研究目的 我正在使用此url提交查询:。(随机选择“users/”后的id#,但为真实id。) 当我在浏览器中输入url时,我会看到我想在代码中使用的JSON数据。当我使用urllib编码并提交请求时,我得到一个错误。我哪里做错了?以下是我正在使用的代码: url = 'https://api.stackexchange.com/2.2/users/29407/mentioned' query = {'site': 'stackoverflow'} formatt

我正在尝试检索堆栈交换数据以用于研究目的

我正在使用此url提交查询:。(随机选择“users/”后的id#,但为真实id。)

当我在浏览器中输入url时,我会看到我想在代码中使用的JSON数据。当我使用urllib编码并提交请求时,我得到一个错误。我哪里做错了?以下是我正在使用的代码:

url = 'https://api.stackexchange.com/2.2/users/29407/mentioned'
query = {'site': 'stackoverflow'}
formatted_query = urllib.urlencode(query)
request = urllib2.Request(url,query_url)
response = urllib2.urlopen(request)
错误:

   File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/urllib2.py", line 126, in urlopen
    return _opener.open(url, data, timeout)
  File "/usr/lib/python2.7/urllib2.py", line 406, in open
    response = meth(req, response)
  File "/usr/lib/python2.7/urllib2.py", line 519, in http_response
    'http', request, response, code, msg, hdrs)
  File "/usr/lib/python2.7/urllib2.py", line 444, in error
    return self._call_chain(*args)
  File "/usr/lib/python2.7/urllib2.py", line 378, in _call_chain
    result = func(*args)
  File "/usr/lib/python2.7/urllib2.py", line 527, in http_error_default
    raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
urllib2.HTTPError: HTTP Error 400: Bad Request
文件“”,第1行,在
文件“/usr/lib/python2.7/urllib2.py”,第126行,在urlopen中
return\u opener.open(url、数据、超时)
文件“/usr/lib/python2.7/urllib2.py”,第406行,打开
响应=方法(请求,响应)
http_响应中的文件“/usr/lib/python2.7/urllib2.py”,第519行
“http”、请求、响应、代码、消息、hdrs)
文件“/usr/lib/python2.7/urllib2.py”,第444行出错
返回自我。调用链(*args)
文件“/usr/lib/python2.7/urllib2.py”,第378行,在调用链中
结果=func(*args)
文件“/usr/lib/python2.7/urllib2.py”,第527行,默认为http\u error\u
raise HTTPError(请求获取完整url(),代码,消息,hdrs,fp)
urllib2.HTTPError:HTTP错误400:错误请求

我正在密切关注我在一些在线教程中看到的内容,但我对这些内容还比较陌生,所以如果我遗漏了一些重要内容,我向您道歉

urllib2.Request()的第二个参数是POST数据,而不是GET查询参数。您需要将您的查询参数(和
)直接添加到url的末尾,而不是像那样传递它们,因为您正在进行POST请求。

如果您在请求之前添加
打印查询url
,您会得到什么?您的
格式化的查询
在哪里?你必须创建完整的url。我不确定我是否掌握了这个。我所看到的教程,包括其中一个,使用类似于上面的过程来生成POST请求。该文档说明,只有在未向请求传递第二个参数的情况下,才会发出GET请求。您是否建议我只使用
response=urllib2.urlopen('https://api.stackexchange.com/2.2/users/29407/mentioned?site=stackoverflow)
?我已经试过了,但它不起作用。请求需要被获取,因为API就是这样做的,所以是的,使用URL和查询是正确的。您可能会遇到输出被gzip编码的问题,但这是另一个问题。考虑使用<代码>请求< /代码>库,否则您需要unggip。我想您是对的,杰森s,JSON输出是GZIPP。当我试图读取响应时,我已经放弃了这一途径(将查询直接放在url中)。我使用了
请求
库,正如您所建议的那样,它会自动gunzips,并且我能够访问JSON。非常感谢。