2016-10-07 6 views
0

나는 아래 for 루프 내에서 여러 초록을 다운로드, 파이썬을 통해 API (스코 푸스)에 액세스하려고 : 그렇게에,오류 처리에 접근 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 루프의 다른 지점에도 있음). 오류 처리가이 문제를 해결하는 방법이라고 들었지만, 파이썬에 익숙하지 않은 것은 무엇인지 모르겠습니다. 누구든지 도와 줄 수 있습니까? 감사합니다

편집 : 여기에 불행하게도 당신이 언급 한 '위의 예외'를 포함하지 않은

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

(이 긴 점에 대해 유감으로) 올바른 정보를 모두 포함해야 전체 오류 메시지입니다 귀하의 산출물.

일반적으로 코드 조각 실행 중에 예외 상황 (예 : 오류)이 발생하면 해당 예외를 catch하여 처리 할 수 ​​있습니다. 예외는 무엇이 잘못되었는지에 관한 정보가있는 객체입니다. 예외 처리는 일반적으로 큰 문제이므로 다음 위치에서 읽기 시작할 수 있습니다. 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) 

[편집]

나는 오류 메시지에서 살펴 보았다 그것은 보인다 당신이에 연결을 시도하고있는 서버, 연결을 종료했습니다. 원인은 완전히 다를 수 있지만 Why is host aborting connection?을 참조하십시오. 사용이 모든 시간을 발생 또는 유일한

일부 시도에서 빌드로 특정 URL의

[/ 편집]에 있는지 확인하려면 위의 코드를 사용해보십시오 :

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)) 

N.B. 나는 이것을 시험하지는 않았지만 일반적인 생각을 전달해야한다. 'sleep'은 서버가 숨을들이 쉬도록 허용하는 것입니다 ...

+0

죄송합니다. 오류 메시지가 매우 길어서 그 내용 만 게시했습니다. 유효한 예외가 포함될 전체 오류를 포함하도록 편집합니다. –

+0

전체 오류 메시지를 포함했지만 오랜 시간 동안 미안하지만 필요한 정보가 포함되어야합니다. –

+0

예외가있는 것으로 보입니다 무작위 URL (이유는 확실하지 않음)에 있지만 예외가 발생하면 루프는 정상적으로 수행됩니다. 그것의 호스트처럼 무작위로 무작위로 glitchches –

관련 문제