代理环境下如何导入Python的cenpy库?解决连接错误问题
问题背景
导入cenpy库时触发以下连接错误:
ConnectionError: HTTPSConnectionPool(host='api.census.gov', port=443): Max retries exceeded with url: /data.json (Caused by NewConnectionError('<urllib3.connection.HTTPSConnection object at 0x0000013167B552B0>: Failed to establish a new connection: [WinError 10060] A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond'))
之前用requests会话配置代理解决过同类网络问题,代码如下:
import requests s = requests.Session() s.proxies = { "https":"https://user:pass@server:port", "http":"http://user:pass@server:port" }
之后用s.get()能正常访问目标地址,现在想知道能不能用类似方法让cenpy成功导入(Python 3.9.12环境)。
可行解决方案
当然可以,cenpy底层依赖requests做网络请求,两种方式都能解决:
方法一:全局配置requests代理
在导入cenpy之前,给requests设置全局代理,这样cenpy调用requests时会自动沿用这个配置:
import requests # 替换成你的代理信息 requests.proxies.update({ "https": "https://user:pass@server:port", "http": "http://user:pass@server:port" }) # 再导入cenpy import cenpy as cp
方法二:给cenpy传自定义会话
创建带代理的requests会话,直接传递给cenpy的API实例,这种方式不会影响其他使用requests的库,更灵活:
import requests import cenpy as cp # 初始化带代理的会话 s = requests.Session() s.proxies = { "https": "https://user:pass@server:port", "http": "http://user:pass@server:port" } # 用自定义会话创建cenpy的API对象 api = cp.API('ACS5', session=s) # 后续正常使用cenpy功能即可
两种方法都能解决连接超时问题,优先选方法二,避免全局代理干扰其他代码。
内容的提问来源于stack exchange,提问作者conduit

