2016-10-07 2 views
0

Я пытаюсь получить доступ к API (Scopus) через питон, загрузку несколько тезисов в для цикла ниже:Обработка ошибок при обращении к API

for t in eid: 
    url = "http://api.elsevier.com/content/abstract/eid/"+str(t)+"?view=FULL" 
    # url = "http://api.elsevier.com/content/abstract/eid/2-s2.0-84934272190?view=FULL" 
    resp2 = requests.get(url, 
         headers={'Accept':'application/json', 
         'X-ELS-APIKey': MYAPIKEY}) 

    retrieval = resp2.json() 

    dep = retrieval['abstracts-retrieval-response']['item']['bibrecord']['head']['author-group'] 
    sub = retrieval['abstracts-retrieval-response']['subject-areas']['subject-area'] 
    iD = retrieval['abstracts-retrieval-response']['coredata']['intid'] 
    date = retrieval['abstracts-retrieval-response']['coredata']['prism:coverDate'] 

    department.append(dep) 
    subj.append(sub) 
    ident.append(iD) 
    dates.append(date) 

Однако при этом я продолжаю получать следующие ошибки вдоль строки ниже (всегда в разных точках цикла for). Мне сказали, что обработка ошибок - это способ обойти это, но, будучи новым для Python, я понятия не имею, что это такое. Может ли кто-нибудь помочь? Благодаря

EDIT: Вот все сообщение об ошибке, которое должно включать в себя все правильную информации (извините, что долго)

Traceback (most recent call last): 
    File "C:\Users\User\Anaconda3\lib\site-packages\requests\packages\urllib3\connection.py", line 142, in _new_conn 
    (self.host, self.port), self.timeout, **extra_kw) 
    File "C:\Users\User\Anaconda3\lib\site-packages\requests\packages\urllib3\util\connection.py", line 91, in create_connection 
    raise err 
    File "C:\Users\User\Anaconda3\lib\site-packages\requests\packages\urllib3\util\connection.py", line 81, in create_connection 
    sock.connect(sa) 
ConnectionAbortedError: [WinError 10053] An established connection was aborted by the software in your host machine 

During handling of the above exception, another exception occurred: 

Traceback (most recent call last): 
    File "C:\Users\User\Anaconda3\lib\site-packages\requests\packages\urllib3\connectionpool.py", line 578, in urlopen 
    chunked=chunked) 
    File "C:\Users\User\Anaconda3\lib\site-packages\requests\packages\urllib3\connectionpool.py", line 362, in _make_request 
    conn.request(method, url, **httplib_request_kw) 
    File "C:\Users\User\Anaconda3\lib\http\client.py", line 1106, in request 
    self._send_request(method, url, body, headers) 
    File "C:\Users\User\Anaconda3\lib\http\client.py", line 1151, in _send_request 
    self.endheaders(body) 
    File "C:\Users\User\Anaconda3\lib\http\client.py", line 1102, in endheaders 
    self._send_output(message_body) 
    File "C:\Users\User\Anaconda3\lib\http\client.py", line 934, in _send_output 
    self.send(msg) 
    File "C:\Users\User\Anaconda3\lib\http\client.py", line 877, in send 
    self.connect() 
    File "C:\Users\User\Anaconda3\lib\site-packages\requests\packages\urllib3\connection.py", line 167, in connect 
    conn = self._new_conn() 
    File "C:\Users\User\Anaconda3\lib\site-packages\requests\packages\urllib3\connection.py", line 151, in _new_conn 
    self, "Failed to establish a new connection: %s" % e) 
requests.packages.urllib3.exceptions.NewConnectionError: <requests.packages.urllib3.connection.HTTPConnection object at 0x000002058C7E1C18>: Failed to establish a new connection: [WinError 10053] An established connection was aborted by the software in your host machine 

During handling of the above exception, another exception occurred: 

Traceback (most recent call last): 
    File "C:\Users\User\Anaconda3\lib\site-packages\requests\adapters.py", line 403, in send 
    timeout=timeout 
    File "C:\Users\User\Anaconda3\lib\site-packages\requests\packages\urllib3\connectionpool.py", line 623, in urlopen 
    _stacktrace=sys.exc_info()[2]) 
    File "C:\Users\User\Anaconda3\lib\site-packages\requests\packages\urllib3\util\retry.py", line 281, in increment 
    raise MaxRetryError(_pool, url, error or ResponseError(cause)) 
requests.packages.urllib3.exceptions.MaxRetryError: HTTPConnectionPool(host='api.elsevier.com', port=80): Max retries exceeded with url: /content/abstract/eid/2-s2.0-84978766692?view=FULL (Caused by NewConnectionError('<requests.packages.urllib3.connection.HTTPConnection object at 0x000002058C7E1C18>: Failed to establish a new connection: [WinError 10053] An established connection was aborted by the software in your host machine',)) 

During handling of the above exception, another exception occurred: 

Traceback (most recent call last): 
    File "<stdin>", line 5, in <module> 
    File "C:\Users\User\Anaconda3\lib\site-packages\requests\api.py", line 71, in get 
    return request('get', url, params=params, **kwargs) 
    File "C:\Users\User\Anaconda3\lib\site-packages\requests\api.py", line 57, in request 
    return session.request(method=method, url=url, **kwargs) 
    File "C:\Users\User\Anaconda3\lib\site-packages\requests\sessions.py", line 475, in request 
    resp = self.send(prep, **send_kwargs) 
    File "C:\Users\User\Anaconda3\lib\site-packages\requests\sessions.py", line 585, in send 
    r = adapter.send(request, **kwargs) 
    File "C:\Users\User\Anaconda3\lib\site-packages\requests\adapters.py", line 467, in send 
    raise ConnectionError(e, request=request) 
requests.exceptions.ConnectionError: HTTPConnectionPool(host='api.elsevier.com', port=80): Max retries exceeded with url: /content/abstract/eid/2-s2.0-84978766692?view=FULL (Caused by NewConnectionError('<requests.packages.urllib3.connection.HTTPConnection object at 0x000002058C7E1C18>: Failed to establish a new connection: [WinError 10053] An established connection was aborted by the software in your host machine',)) 

ответ

0

К сожалению, вы не включили «вышеуказанное исключение», описанная в ваш выход.

Но в целом, когда во время выполнения фрагмента кода возникает исключительная ситуация, например ошибка, вы можете поймать это исключение и справиться с ним. Исключением является объект с информацией на борту о том, что пошло не так. Обработка исключений в целом является большой темой, и вы можете начать читать по адресу: https://docs.python.org/3/tutorial/errors.html

Примером устранения исключения является просто указание об обстоятельствах и исключении. Это уже может дать вам понять, в чем заладилось:

for t in eid: 
    try: 
     url = "http://api.elsevier.com/content/abstract/eid/"+str(t)+"?view=FULL" 
     # url = "http://api.elsevier.com/content/abstract/eid/2-s2.0-84934272190?view=FULL" 
     resp2 = requests.get(url, 
          headers={'Accept':'application/json', 
          'X-ELS-APIKey': MYAPIKEY}) 

     retrieval = resp2.json() 

     dep = retrieval['abstracts-retrieval-response']['item']['bibrecord']['head']['author-group'] 
     sub = retrieval['abstracts-retrieval-response']['subject-areas']['subject-area'] 
     iD = retrieval['abstracts-retrieval-response']['coredata']['intid'] 
     date = retrieval['abstracts-retrieval-response']['coredata']['prism:coverDate'] 

     department.append(dep) 
     subj.append(sub) 
     ident.append(iD) 
     dates.append(date) 
    except Exception as exception: 
     print (url) # 'print' will only work on a console 
     print (exception) 

[EDIT]

Я принял взглянуть на сообщение об ошибке, и кажется, что сервер, который вы пытаетесь подключиться, закрыл соединение. См. Также Why is host aborting connection?, хотя причина может быть совершенно иной. Попробуйте код выше, чтобы узнать, если это происходит все время или только с определенной URL в

[/ EDIT]

Для построения некоторых попыток, используйте:

import time 

nrOfTries = 10 

for t in eid: 
    for count in range (nrOfTries): 
     try: 
      url = "http://api.elsevier.com/content/abstract/eid/"+str(t)+"?view=FULL" 
      # url = "http://api.elsevier.com/content/abstract/eid/2-s2.0-84934272190?view=FULL" 
      resp2 = requests.get(url, 
           headers={'Accept':'application/json', 
           'X-ELS-APIKey': MYAPIKEY}) 

      retrieval = resp2.json() 

      dep = retrieval['abstracts-retrieval-response']['item']['bibrecord']['head']['author-group'] 
      sub = retrieval['abstracts-retrieval-response']['subject-areas']['subject-area'] 
      iD = retrieval['abstracts-retrieval-response']['coredata']['intid'] 
      date = retrieval['abstracts-retrieval-response']['coredata']['prism:coverDate'] 

      department.append(dep) 
      subj.append(sub) 
      ident.append(iD) 
      dates.append(date) 

      break # Don't do the else 

     except Exception as exception: 
      print ('Problem accessing: {}' .format (url)) 
      print (exception) 
      time.sleep (2) # Seconds 
    else: # Done after for-loop exhausted, but not if 'break' was encountered 
     print ('Gave up accessing: {}' .format (url)) 

нотабене Я не проверял это, но должен передать общую идею. «Сон» должен позволить серверу перехватить дыхание ...

+0

Извините сообщение об ошибке было очень длинным, и поэтому я опубликовал его только фрагмент. Я сделаю EDIT, чтобы включить всю ошибку, которая будет включать в себя действительное исключение –

+0

Я включил все сообщение об ошибке, извините, что он довольно длинный, но он должен содержать необходимую информацию. Я считаю, –

+0

Похоже, что есть исключение случайные URL-адреса (не уверен, почему), но как только исключение поднято, цикл продолжается как обычно. Его, как хост, случайно случайным образом вырывается из строя. –

Смежные вопросы