如何解决请求无法通过VPN工作的问题?

时间:2018-10-09 16:54:07

标签: python python-requests anaconda

我正在尝试使用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):URL超过了最大重试次数:/ questions / 23013220 / max-retries-exceeded-with-url(由NewConnectionError(':导致无法建立)一个新的连接:[WinError 10061]无法建立连接,因为目标计算机主动拒绝了它',))

现在,我需要通过我公司的VPN来工作,因为我需要访问仅在该网站上工作的网站。该如何解决?

4 个答案:

答案 0 :(得分:1)

就我而言,问题与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配置解决。

答案 1 :(得分:0)

如何尝试:

url = "https://stackoverflow.com/questions/23013220/max-retries-exceeded-with-url"
ua = UserAgent()
headers = headers = {"User-Agent": ua.random}

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

这似乎是由UserAgent()设置差异引起的。

答案 2 :(得分:0)

尝试设置trust_env = None

  

trust_env =无#   用于代理配置,默认身份验证等的信任环境设置。

或者您可以禁用特定域的代理。 The question

import os
os.environ['NO_PROXY'] = 'stackoverflow.com'

答案 3 :(得分:0)

在我的组织中,我必须在 VPN 下针对不同的地理位置运行我的程序。所以我们有多个代理配置。

我发现使用名为 PyPAC 的包自动获取我的代理详细信息更简单

from pypac import PACSession
from requests.auth import HTTPProxyAuth
session = PACSession()
# when the username and password is required
# session = PACSession(proxy_auth=HTTPProxyAuth(name, password)) 

r = session.get('http://example.org')

这是如何工作的:

该包定位由组织配置的 PAC 文件。此文件包含代理配置详细信息 (more info)。