首页 > 解决方案 > 如何解决请求无法通过 VPN 工作?

问题描述

我正在尝试使用 python 中的请求来抓取网站。

url = "https://stackoverflow.com/questions/23013220/max-retries-exceeded-with-url"
# set the headers like we are a browser,
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'}

# download the homepage
s = requests.Session()
s.trust_env = False
response = s.get(url, headers=headers )

当我使用我的个人 wifi 时,这工作正常。但是,当我连接到我公司的 VPN 时,我收到以下错误。

ConnectionError: HTTPSConnectionPool(host='stackoverflow.com', port=443): Max retries exceeded with url: /questions/23013220/max-retries-exceeded-with-url (由 NewConnectionError(': 无法建立新连接引起) : [WinError 10061] 无法建立连接,因为目标机器主动拒绝它',))

现在,我需要它来通过我公司的 VPN 工作,因为我需要访问一个只能在其中工作的网站。如何解决这个问题?

标签: pythonpython-requestsanaconda

解决方案


就我而言,问题与 IPv6 有关。

我们的 VPN 使用了拆分隧道,而且 VPN 配置似乎不支持 IPv6。

因此,例如,这将永远挂起:

requests.get('https://pokeapi.co/api/v2/pokemon')

但是如果你添加一个超时,请求就会成功:

requests.get('https://pokeapi.co/api/v2/pokemon', timeout=1)

但并非所有机器都有这个问题。所以我比较了两台不同机器的输出:

import socket

for line in socket.getaddrinfo('pokeapi.co', 443):
    print(line)

工作的只返回 IPv4 地址。非工作机器返回 IPv4 和 IPv6 地址。

因此,在指定超时的情况下,我的理论是 python 使用 IPv6 快速失败,然后移动到请求成功的 IPv4。

最终我们通过在机器上禁用 IPv6 解决了这个问题:

networksetup -setv6off "Wi-Fi"

但我认为这可以通过 VPN 配置来解决。


推荐阅读