0

我的最终目标是使用上下文和绘图(来自此示例)检索瓦片地图:

import geopandas
import contextily as ctx
df = geopandas.read_file(geopandas.datasets.get_path('nybb'))
df = df.to_crs(epsg=3857)
ax = df.plot(figsize=(10, 10), alpha=0.5, edgecolor='k')
ctx.add_basemap(ax)

我在公司代理后面使用 Anaconda。代理在 .condarc 文件中设置正确:

proxy_servers:
  http: http://myproxy.com:8080
  https: https://myproxy.com:8080

包安装工作正常,conda config --show确实检测到代理配置。

但是,我在之后收到以下 urllib3 错误ctx.add_basemap(ax)

urllib3.exceptions.NewConnectionError: <urllib3.connection.VerifiedHTTPSConnection object at 0x000001EDD50E66D8>: Failed to establish a new connection

我不明白的是,尽管有代理配置,但我需要指定代理设置才能使基本的 urllib3 请求工作。

如果没有指定代理:

http = urllib3.PoolManager()
r = http.request('GET', 'http://httpbin.org/robots.txt')
Out: NewConnectionError('<urllib3.connection.HTTPConnection object at 0x0000012FE62B0F98>: Failed to establish a new connection:

但是指定代理有效:

proxy = urllib3.ProxyManager('http://myproxy.com:8080')
proxy.request('GET', 'http://google.com/')
Out: <urllib3.response.HTTPResponse at 0x12fe6280048>

我本以为在 Anaconda 中设置代理可以处理任何与 Web 相关的请求。

我想尝试为 urllib3 设置代理信息,据我了解是urllib.request.install_opener(opener)https://stackoverflow.com/a/36881923/12356293中完成的,但是对于 urllib3 似乎不存在这样的“开启者”。

到底:

  • 如何使用上下文指定代理信息?
  • 为什么在 Anaconda 中设置代理信息对于 urllib3 是不够的?

任何帮助表示赞赏,谢谢。

4

1 回答 1

1

在公司代理后面使用上下文时,我遇到了类似的问题。我设法通过修改上下文的 tile.py 文件的代码来使其工作。首先,上下文不使用 urllib3,它使用 pythons 请求模块。这可以解释为什么您在 Anaconda 中的代理信息不起作用。

为了让代理工作,我使用了这个问题的答案: How to handle proxies in urllib3

我在顶部添加:

from urllib3 import ProxyManager, make_headers

default_headers = make_headers(proxy_basic_auth='myusername:mypassword')
http = ProxyManager("https://myproxy.com:8080/", proxy_headers=default_headers)

到 tile.py 文件。

_fetch_tile()我改变的方法中

with io.BytesIO(request.content) as image_stream:

with io.BytesIO(request.data) as image_stream:

因为我现在正在使用 urllib3。在_retryer()我改变的方法中

request = requests.get(tile_url, headers={"user-agent": USER_AGENT})
request.raise_for_status()

request = http.request("GET", tile_url)
#request.raise_for_status()

为了安全起见,您可能还应该调整例外条款。通过这些更改,我让它为我工作。我希望这对你也有用。

亲切的问候

于 2020-07-01T14:06:34.837 回答