【问题标题】:How to avoid or skip error 400 in python while calling the API如何在调用 API 时避免或跳过 python 中的错误 400
【发布时间】:2016-08-31 01:04:30
【问题描述】:

注意:- 在参考堆栈溢出中的几个示例后,我已经编写了代码,但仍然无法获得所需的输出

我有一个 Python 脚本,其中循环使用 Instagram API 进行迭代。我将 user_id 作为 API 的输入,该 API 获得帖子数、关注者数和关注数。每次收到响应时,我都会将其加载到 JSON 模式中并附加到列表 data1、data2 和 data3。

问题是:= 某些帐户是私人帐户,不允许对其进行 API 调用。当我在 IDLE Python shell 中运行脚本时,它给出了错误

Traceback (most recent call last):
  File "<pyshell#144>", line 18, in <module>
beta=json.load(url)
File "C:\Users\rnair\AppData\Local\Programs\Python\Python35\lib\site-  packages\simplejson-3.8.2-py3.5-win-amd64.egg\simplejson\__init__.py", line 455,  in load
 return loads(fp.read(),
File "C:\Users\rnair\AppData\Local\Programs\Python\Python35\lib\tempfile.py", line 483, in func_wrapper
return func(*args, **kwargs)
**ValueError: read of closed file**

但 JSON 包含以下内容:-

{
  "meta":  {
  "error_type": "APINotAllowedError",
  "code": 400,
  "error_message": "you cannot view this resource"
 }
}

我的代码是:-

for r in range(307,601):
 var=r,sheet.cell(row=r,column=2).value
 xy=var[1]
 ij=str(xy)
 if xy=="Account Deleted":
    data1.append('null')
    data2.append('null')
    data3.append('null')
    continue
myopener=Myopen()
try:           
    url=myopener.open('https://api.instagram.com/v1/users/'+ij+'/?access_token=641567093.1fb234f.a0ffbe574e844e1c818145097050cf33')
except urllib.error.HTTPError as e:  // I want the change here
    data1.append('Private Account')
    data2.append('Private Account')
    data3.append('Private Account')
    continue
beta=json.load(url)
item=beta['data']['counts']
data1.append(item['media'])
data2.append(item['followed_by'])
data3.append(item['follows'])

我使用的是 Python 版本 3.5.2。主要问题是 如果循环运行并且特定调用被阻塞并出现此错误,如何避免它并继续运行下一次迭代?另外,如果帐户是私人帐户,我想将“私人帐户”附加到列表中。

【问题讨论】:

    标签: python json python-3.x for-loop error-handling


    【解决方案1】:

    看起来实际获取 URL 的代码在您的自定义类型中 - “Myopen”(未显示)。它看起来也没有抛出您所期望的 HTTPError,因为您的“json.load”行仍在执行(并导致抛出 is 的 ValueError)。

    如果您希望触发错误处理块,则需要检查响应状态代码以查看其在 Myopen 中是否 != 200 并抛出您期望的 HTTPError 而不是它现在正在执行的任何操作。


    我个人不熟悉FancyURLOpener,但它看起来支持getcode 方法。也许尝试这样的事情,而不是期待一个 HTTPError:

    url = myopener.open('yoururl')
    if url.getcode() == 400:
      data1.append('Private Account')
      data2.append('Private Account')
      data3.append('Private Account')
      continue
    

    【讨论】:

    • 感谢您的回复!我以这种方式使用了 FancyURLopener class Myopen(FancyURLopener): version='Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36' 这是我正在使用的用户代理。我不知道在 IDLE 中,我收到值错误,但是在 API 检查网站 apigee.com 中,错误的原因显示为我在此处显示的 json 代码。我不知道该怎么办
    • 你能帮我看看如何检查响应状态代码!=200 如你所建议的那样?
    • 绝对正确!十分感谢你的帮助。 @wilcosprey
    猜你喜欢
    • 2021-07-02
    • 2019-09-14
    • 1970-01-01
    • 1970-01-01
    • 2014-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-23
    相关资源
    最近更新 更多