使用来自 python 的请求或 urllib 时获得"OSError: [errno 0] 错误"



我想使用GTEx API。我最近(几周前(确实使用了requests,它效果很好,但由于未知的原因,它已经不起作用了。

例如,我想使用API中提供的48种不同组织检索信息
下面是获取错误的最低可复制代码:

# Import libraries
import json
import urllib
import requests
# Set the paremeters  
gene = 'NOS1AP'
snp = 'rs10918593'
datasetId = 'gtex_v7'
tissues = ['Adipose_Subcutaneous', 'Adipose_Visceral_Omentum', 'Adrenal_Gland', 'Artery_Aorta', 'Artery_Coronary', 'Artery_Tibial', 'Brain_Amygdala', 'Brain_Anterior_cingulate_cortex_BA24', 'Brain_Caudate_basal_ganglia', 'Brain_Cerebellar_Hemisphere', 'Brain_Cerebellum', 'Brain_Cortex', 'Brain_Frontal_Cortex_BA9', 'Brain_Hippocampus', 'Brain_Hypothalamus', 'Brain_Nucleus_accumbens_basal_ganglia', 'Brain_Putamen_basal_ganglia', 'Brain_Spinal_cord_cervical_c-1', 'Brain_Substantia_nigra', 'Breast_Mammary_Tissue', 'Cells_EBV-transformed_lymphocytes', 'Cells_Transformed_fibroblasts', 'Colon_Sigmoid', 'Colon_Transverse', 'Esophagus_Gastroesophageal_Junction', 'Esophagus_Mucosa', 'Esophagus_Muscularis', 'Heart_Atrial_Appendage', 'Heart_Left_Ventricle', 'Liver', 'Lung', 'Minor_Salivary_Gland', 'Muscle_Skeletal', 'Nerve_Tibial', 'Ovary', 'Pancreas', 'Pituitary', 'Prostate', 'Skin_Not_Sun_Exposed_Suprapubic', 'Skin_Sun_Exposed_Lower_leg', 'Small_Intestine_Terminal_Ileum', 'Spleen', 'Stomach', 'Testis', 'Thyroid', 'Uterus', 'Vagina', 'Whole_Blood']

当我运行以下代码时,我会收到一些初始纸巾的错误:

# using requests
for tissue in tissues:
print(f'Getting eQTL for tissue {tissue}...')
server = 'https://gtexportal.org/rest/v1/'
ext = f'association/dyneqtl?gencodeId={gene}&variantId={snp}&tissueSiteDetailId={tissue}&datasetId={datasetId}'
r = requests.get(server+ext, headers={"Accept" : "application/json"})
if not r.ok:
print(f'--- Request for SNP "{snp}" and "{gene}" returned an error! ---')
continue
decoded = r.json()
r.close()

以上代码错误:

Getting eQTL for tissue Adipose_Subcutaneous...
Getting eQTL for tissue Adipose_Visceral_Omentum...
Getting eQTL for tissue Adrenal_Gland...
Getting eQTL for tissue Artery_Aorta...
---------------------------------------------------------------------------
OSError                                   Traceback (most recent call last)
~/miniconda3/lib/python3.8/site-packages/urllib3/connectionpool.py in urlopen(self, method, url, body, headers, retries, redirect, assert_same_host, timeout, pool_timeout, release_conn, chunked, body_pos, **response_kw)
669             # Make the request on the httplib connection object.
--> 670             httplib_response = self._make_request(
671                 conn,
~/miniconda3/lib/python3.8/site-packages/urllib3/connectionpool.py in _make_request(self, conn, method, url, timeout, chunked, **httplib_request_kw)
380         try:
--> 381             self._validate_conn(conn)
382         except (SocketTimeout, BaseSSLError) as e:
~/miniconda3/lib/python3.8/site-packages/urllib3/connectionpool.py in _validate_conn(self, conn)
977         if not getattr(conn, "sock", None):  # AppEngine might not have  `.sock`
--> 978             conn.connect()
979 
~/miniconda3/lib/python3.8/site-packages/urllib3/connection.py in connect(self)
361 
--> 362         self.sock = ssl_wrap_socket(
363             sock=conn,
~/miniconda3/lib/python3.8/site-packages/urllib3/util/ssl_.py in ssl_wrap_socket(sock, keyfile, certfile, cert_reqs, ca_certs, server_hostname, ssl_version, ciphers, ssl_context, ca_cert_dir, key_password, ca_cert_data)
385         if HAS_SNI and server_hostname is not None:
--> 386             return context.wrap_socket(sock, server_hostname=server_hostname)
387 
~/miniconda3/lib/python3.8/ssl.py in wrap_socket(self, sock, server_side, do_handshake_on_connect, suppress_ragged_eofs, server_hostname, session)
499         # ctx._wrap_socket()
--> 500         return self.sslsocket_class._create(
501             sock=sock,
~/miniconda3/lib/python3.8/ssl.py in _create(cls, sock, server_side, do_handshake_on_connect, suppress_ragged_eofs, server_hostname, context, session)
1039                         raise ValueError("do_handshake_on_connect should not be specified for non-blocking sockets")
-> 1040                     self.do_handshake()
1041             except (OSError, ValueError):
~/miniconda3/lib/python3.8/ssl.py in do_handshake(self, block)
1308                 self.settimeout(None)
-> 1309             self._sslobj.do_handshake()
1310         finally:
OSError: [Errno 0] Error
During handling of the above exception, another exception occurred:
ProtocolError                             Traceback (most recent call last)
~/miniconda3/lib/python3.8/site-packages/requests/adapters.py in send(self, request, stream, timeout, verify, cert, proxies)
438             if not chunked:
--> 439                 resp = conn.urlopen(
440                     method=request.method,
~/miniconda3/lib/python3.8/site-packages/urllib3/connectionpool.py in urlopen(self, method, url, body, headers, retries, redirect, assert_same_host, timeout, pool_timeout, release_conn, chunked, body_pos, **response_kw)
725 
--> 726             retries = retries.increment(
727                 method, url, error=e, _pool=self, _stacktrace=sys.exc_info()[2]
~/miniconda3/lib/python3.8/site-packages/urllib3/util/retry.py in increment(self, method, url, response, error, _pool, _stacktrace)
409             if read is False or not self._is_method_retryable(method):
--> 410                 raise six.reraise(type(error), error, _stacktrace)
411             elif read is not None:
~/miniconda3/lib/python3.8/site-packages/urllib3/packages/six.py in reraise(tp, value, tb)
733             if value.__traceback__ is not tb:
--> 734                 raise value.with_traceback(tb)
735             raise value
~/miniconda3/lib/python3.8/site-packages/urllib3/connectionpool.py in urlopen(self, method, url, body, headers, retries, redirect, assert_same_host, timeout, pool_timeout, release_conn, chunked, body_pos, **response_kw)
669             # Make the request on the httplib connection object.
--> 670             httplib_response = self._make_request(
671                 conn,
~/miniconda3/lib/python3.8/site-packages/urllib3/connectionpool.py in _make_request(self, conn, method, url, timeout, chunked, **httplib_request_kw)
380         try:
--> 381             self._validate_conn(conn)
382         except (SocketTimeout, BaseSSLError) as e:
~/miniconda3/lib/python3.8/site-packages/urllib3/connectionpool.py in _validate_conn(self, conn)
977         if not getattr(conn, "sock", None):  # AppEngine might not have  `.sock`
--> 978             conn.connect()
979 
~/miniconda3/lib/python3.8/site-packages/urllib3/connection.py in connect(self)
361 
--> 362         self.sock = ssl_wrap_socket(
363             sock=conn,
~/miniconda3/lib/python3.8/site-packages/urllib3/util/ssl_.py in ssl_wrap_socket(sock, keyfile, certfile, cert_reqs, ca_certs, server_hostname, ssl_version, ciphers, ssl_context, ca_cert_dir, key_password, ca_cert_data)
385         if HAS_SNI and server_hostname is not None:
--> 386             return context.wrap_socket(sock, server_hostname=server_hostname)
387 
~/miniconda3/lib/python3.8/ssl.py in wrap_socket(self, sock, server_side, do_handshake_on_connect, suppress_ragged_eofs, server_hostname, session)
499         # ctx._wrap_socket()
--> 500         return self.sslsocket_class._create(
501             sock=sock,
~/miniconda3/lib/python3.8/ssl.py in _create(cls, sock, server_side, do_handshake_on_connect, suppress_ragged_eofs, server_hostname, context, session)
1039                         raise ValueError("do_handshake_on_connect should not be specified for non-blocking sockets")
-> 1040                     self.do_handshake()
1041             except (OSError, ValueError):
~/miniconda3/lib/python3.8/ssl.py in do_handshake(self, block)
1308                 self.settimeout(None)
-> 1309             self._sslobj.do_handshake()
1310         finally:
ProtocolError: ('Connection aborted.', OSError(0, 'Error'))
During handling of the above exception, another exception occurred:
ConnectionError                           Traceback (most recent call last)
<ipython-input-6-7dc3e6722683> in <module>
4     server = 'https://gtexportal.org/rest/v1/'
5     ext = f'association/dyneqtl?gencodeId={gene}&variantId={snp}&tissueSiteDetailId={tissue}&datasetId={datasetId}'
----> 6     r = requests.get(server+ext, headers={"Accept" : "application/json"})
7     if not r.ok:
8         print(f'--- Request for SNP "{snp}" and "{gene}" returned an error! ---')
~/miniconda3/lib/python3.8/site-packages/requests/api.py in get(url, params, **kwargs)
74 
75     kwargs.setdefault('allow_redirects', True)
---> 76     return request('get', url, params=params, **kwargs)
77 
78 
~/miniconda3/lib/python3.8/site-packages/requests/api.py in request(method, url, **kwargs)
59     # cases, and look like a memory leak in others.
60     with sessions.Session() as session:
---> 61         return session.request(method=method, url=url, **kwargs)
62 
63 
~/miniconda3/lib/python3.8/site-packages/requests/sessions.py in request(self, method, url, params, data, headers, cookies, files, auth, timeout, allow_redirects, proxies, hooks, stream, verify, cert, json)
528         }
529         send_kwargs.update(settings)
--> 530         resp = self.send(prep, **send_kwargs)
531 
532         return resp
~/miniconda3/lib/python3.8/site-packages/requests/sessions.py in send(self, request, **kwargs)
641 
642         # Send the request
--> 643         r = adapter.send(request, **kwargs)
644 
645         # Total elapsed time of the request (approximately)
~/miniconda3/lib/python3.8/site-packages/requests/adapters.py in send(self, request, stream, timeout, verify, cert, proxies)
496 
497         except (ProtocolError, socket.error) as err:
--> 498             raise ConnectionError(err, request=request)
499 
500         except MaxRetryError as e:
ConnectionError: ('Connection aborted.', OSError(0, 'Error'))

有趣的是,当我重新运行脚本时,它在不同的地方出现了错误。例如,使用组织";Arte_ Aorta";,但当我再次跑步时,它卡在了纸巾里;Brain_小脑";。因此,它似乎不是特定于URL的。

我还尝试过使用urllib:

# using urllib
for tissue in tissues:
print(f'Getting eQTL for tissue {tissue}...')
server = 'https://gtexportal.org/rest/v1/'
ext = f'association/dyneqtl?gencodeId={gene}&variantId={snp}&tissueSiteDetailId={tissue}&datasetId={datasetId}'
r = urllib.request.urlopen(server+ext)
if r.code != 200:
print(f'--- Request for SNP "{snp}" and "{gene}" returned an error! ---')
continue
decoded = json.load(r)
r.close()

然后我得到了:

Getting eQTL for tissue Adipose_Subcutaneous...
Getting eQTL for tissue Adipose_Visceral_Omentum...
---------------------------------------------------------------------------
OSError                                   Traceback (most recent call last)
~/miniconda3/lib/python3.8/urllib/request.py in do_open(self, http_class, req, **http_conn_args)
1318             try:
-> 1319                 h.request(req.get_method(), req.selector, req.data, headers,
1320                           encode_chunked=req.has_header('Transfer-encoding'))
~/miniconda3/lib/python3.8/http/client.py in request(self, method, url, body, headers, encode_chunked)
1229         """Send a complete request to the server."""
-> 1230         self._send_request(method, url, body, headers, encode_chunked)
1231 
~/miniconda3/lib/python3.8/http/client.py in _send_request(self, method, url, body, headers, encode_chunked)
1275             body = _encode(body, 'body')
-> 1276         self.endheaders(body, encode_chunked=encode_chunked)
1277 
~/miniconda3/lib/python3.8/http/client.py in endheaders(self, message_body, encode_chunked)
1224             raise CannotSendHeader()
-> 1225         self._send_output(message_body, encode_chunked=encode_chunked)
1226 
~/miniconda3/lib/python3.8/http/client.py in _send_output(self, message_body, encode_chunked)
1003         del self._buffer[:]
-> 1004         self.send(msg)
1005 
~/miniconda3/lib/python3.8/http/client.py in send(self, data)
943             if self.auto_open:
--> 944                 self.connect()
945             else:
~/miniconda3/lib/python3.8/http/client.py in connect(self)
1398 
-> 1399             self.sock = self._context.wrap_socket(self.sock,
1400                                                   server_hostname=server_hostname)
~/miniconda3/lib/python3.8/ssl.py in wrap_socket(self, sock, server_side, do_handshake_on_connect, suppress_ragged_eofs, server_hostname, session)
499         # ctx._wrap_socket()
--> 500         return self.sslsocket_class._create(
501             sock=sock,
~/miniconda3/lib/python3.8/ssl.py in _create(cls, sock, server_side, do_handshake_on_connect, suppress_ragged_eofs, server_hostname, context, session)
1039                         raise ValueError("do_handshake_on_connect should not be specified for non-blocking sockets")
-> 1040                     self.do_handshake()
1041             except (OSError, ValueError):
~/miniconda3/lib/python3.8/ssl.py in do_handshake(self, block)
1308                 self.settimeout(None)
-> 1309             self._sslobj.do_handshake()
1310         finally:
OSError: [Errno 0] Error
During handling of the above exception, another exception occurred:
URLError                                  Traceback (most recent call last)
<ipython-input-8-d7e4dc39c80e> in <module>
4     server = 'https://gtexportal.org/rest/v1/'
5     ext = f'association/dyneqtl?gencodeId={gene}&variantId={snp}&tissueSiteDetailId={tissue}&datasetId={datasetId}'
----> 6     r = urllib.request.urlopen(server+ext)
7     if r.code != 200:
8         print(f'--- Request for SNP "{snp}" and "{gene}" returned an error! ---')
~/miniconda3/lib/python3.8/urllib/request.py in urlopen(url, data, timeout, cafile, capath, cadefault, context)
220     else:
221         opener = _opener
--> 222     return opener.open(url, data, timeout)
223 
224 def install_opener(opener):
~/miniconda3/lib/python3.8/urllib/request.py in open(self, fullurl, data, timeout)
523 
524         sys.audit('urllib.Request', req.full_url, req.data, req.headers, req.get_method())
--> 525         response = self._open(req, data)
526 
527         # post-process response
~/miniconda3/lib/python3.8/urllib/request.py in _open(self, req, data)
540 
541         protocol = req.type
--> 542         result = self._call_chain(self.handle_open, protocol, protocol +
543                                   '_open', req)
544         if result:
~/miniconda3/lib/python3.8/urllib/request.py in _call_chain(self, chain, kind, meth_name, *args)
500         for handler in handlers:
501             func = getattr(handler, meth_name)
--> 502             result = func(*args)
503             if result is not None:
504                 return result
~/miniconda3/lib/python3.8/urllib/request.py in https_open(self, req)
1360 
1361         def https_open(self, req):
-> 1362             return self.do_open(http.client.HTTPSConnection, req,
1363                 context=self._context, check_hostname=self._check_hostname)
1364 
~/miniconda3/lib/python3.8/urllib/request.py in do_open(self, http_class, req, **http_conn_args)
1320                           encode_chunked=req.has_header('Transfer-encoding'))
1321             except OSError as err: # timeout error
-> 1322                 raise URLError(err)
1323             r = h.getresponse()
1324         except:
URLError: <urlopen error [Errno 0] Error>

同样的非URL特殊性也适用于此处。。。

有趣的是,当使用同一台机器和同一个互联网时,我可以使用R:成功地运行这个(实际上,我的完整代码中有更多的基因和SNP(

library(glue)
library(httr)
library(jsonlite)
gene = "NOS1AP" 
snp = "rs10918593"
datasetId='gtex_v7'
tissues <- c('Adipose_Subcutaneous', 'Adipose_Visceral_Omentum', 'Adrenal_Gland', 'Artery_Aorta', 'Artery_Coronary', 'Artery_Tibial', 'Brain_Amygdala', 'Brain_Anterior_cingulate_cortex_BA24', 'Brain_Caudate_basal_ganglia', 'Brain_Cerebellar_Hemisphere', 'Brain_Cerebellum', 'Brain_Cortex', 'Brain_Frontal_Cortex_BA9', 'Brain_Hippocampus', 'Brain_Hypothalamus', 'Brain_Nucleus_accumbens_basal_ganglia', 'Brain_Putamen_basal_ganglia', 'Brain_Spinal_cord_cervical_c-1', 'Brain_Substantia_nigra', 'Breast_Mammary_Tissue', 'Cells_EBV-transformed_lymphocytes', 'Cells_Transformed_fibroblasts', 'Colon_Sigmoid', 'Colon_Transverse', 'Esophagus_Gastroesophageal_Junction', 'Esophagus_Mucosa', 'Esophagus_Muscularis', 'Heart_Atrial_Appendage', 'Heart_Left_Ventricle', 'Liver', 'Lung', 'Minor_Salivary_Gland', 'Muscle_Skeletal', 'Nerve_Tibial', 'Ovary', 'Pancreas', 'Pituitary', 'Prostate', 'Skin_Not_Sun_Exposed_Suprapubic', 'Skin_Sun_Exposed_Lower_leg', 'Small_Intestine_Terminal_Ileum', 'Spleen', 'Stomach', 'Testis', 'Thyroid', 'Uterus', 'Vagina', 'Whole_Blood')
for(tissue in tissues) {
print(glue('Getting eQTL for tissue {tissue}...'))
server = 'https://gtexportal.org/rest/v1/'
ext = glue('association/dyneqtl?gencodeId={gene}&variantId={snp}&tissueSiteDetailId={tissue}&datasetId={datasetId}')
r <- GET(paste0(server, ext), content_type("application/json"))
if(r$status_code!=200){
print(glue('--- Request for SNP "{snp}" and "{gene}" returned an error! ---'))
next
}
decoded <- fromJSON(toJSON(content(r)))
}

虽然它在R中工作,但我已经用Python组织了一个脚本,我真的很想正常使用requestsurllib。。。

此外,我使用的版本:

python==3.8.2
requests==2.24.0

有什么需要帮忙的吗?

我最近遇到了这个问题,在进行一些不浪费时间的调试之前,我们需要解决一些问题。

首先,requests 2.24需要urllib3 < 1.26,而在urllib3 1.25中,wrap_socket调用不是来自SSLContext;这似乎在进行CCD_ 9握手时引起了问题;在urllib3 1.26中,团队将其更改为context.wrap_socket,这似乎解决了问题。

其次,请记住,升级urllib3后,也要将requests更新为最新版本。

然后升级或安装最新的httplib2,它一直在悄悄地给我带来问题,直到我发现SO上有人大声喊出来。

毕竟,导致Errno 0 error的主要问题之一是TCP连接不稳定;大多数时候,这是我们无法控制的。。

相关内容

  • 没有找到相关文章

最新更新