【问题标题】:Access JSON data from SE API using Python urllib使用 Python urllib 从 SE API 访问 JSON 数据
【发布时间】:2014-08-16 19:12:25
【问题描述】:

我正在尝试检索 Stack Exchange 数据以进行研究。

我正在使用此网址提交查询:https://api.stackexchange.com/2.2/users/29407/mentioned?site=stackoverflow。 (“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

我正在密切关注我在一些在线教程中看到的内容,但我对这些东西还很陌生,所以如果我遗漏了一些重要内容,我深表歉意。

【问题讨论】:

  • 如果你在请求前添加print query_url会得到什么?
  • 你的formatted_query在哪里?你必须制作完整的网址。

标签: python json api post urllib


【解决方案1】:

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

【讨论】:

  • 我不确定我是否掌握了这一点。我看过的教程,包括in the python docs,使用类似于上面的过程来生成POST请求。该文档说只有当 no 第二个参数传递给 Request 时才会发出 GET 请求。你是在建议我简单地使用response = urllib2.urlopen('https://api.stackexchange.com/2.2/users/29407/mentioned?site=stackoverflow')吗?我试过了,还是不行。
  • 请求需要是 GET ,因为这就是 API 需要的,所以是的,使用带有查询的 URL 是正确的。您可能会遇到输出被 gzip 编码的问题,但这是一个单独的问题。考虑使用requests 库,否则需要解压缩。
  • 我认为你是对的,jason s,json 输出被压缩了。在我得到奇怪的 unicode 试图读取响应之前,我已经放弃了那个轨道(直接在 url 中输入查询)。我使用了requests 库,它会按照您的建议自动进行压缩,并且我能够访问 JSON。谢谢!
猜你喜欢
  • 2014-11-24
  • 2013-01-10
  • 2017-12-08
  • 2018-12-10
  • 2017-08-18
  • 2020-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多