如何在调用API时避免或跳过python中的错误400

时间:2016-05-05 09:41:01

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

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

我有一个python脚本,其中循环使用Instagram API进行迭代。我将user_id作为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版。主要问题是如果循环运行并且特定调用被阻止并且出现此错误,如何避免它并继续运行下一次迭代?此外,如果帐户是私人帐户,我想附加&#34;私人帐户&#34;列表。

1 个答案:

答案 0 :(得分:1)

看起来实际获取URL的代码在您的自定义类型中 - &#34; Myopen&#34; (未显示)。看起来它不会抛出你期望的HTTPError,因为你的&#34; json.load&#34;行仍在执行(并导致 被抛出的ValueError)。

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

我并不熟悉getcode,但看起来它支持url = myopener.open('yoururl') if url.getcode() == 400: data1.append('Private Account') data2.append('Private Account') data3.append('Private Account') continue 方法。也许尝试类似这样的东西而不是期待HTTPError:

CREATE TABLE #TableName (Code int, percentage int, nCollects int, nDels int, [day] varchar(3))
INSERT INTO #TableName (Code, percentage, nCollects, nDels, [day])
VALUES
('101','100','4','4','SUN')
,('102','100','4','4','SUN')
,('104','100','6','6','MON')
,('101','50','4','8','TUE')
,('102','50','4','8','TUE')
,('104','100','2','2','TUE')
,('105','50','1','2','TUE')
,('106','100','2','2','TUE')
,('106','50','2','4','WED')