Python 如何解决无法通过VPN工作的请求?
我正在尝试使用python中的请求刮取一个网站Python 如何解决无法通过VPN工作的请求?,python,python-requests,anaconda,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, l
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/url超过了最大重试次数(由NewConnectionError引起(':未能建立新连接:[WinError 10061]无法建立连接,因为目标计算机主动拒绝了它',))
现在,我需要这个在我公司的VPN上工作,因为我需要访问一个只在那个里工作的网站。如何解决这个问题?这样试试怎么样:
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()
设置差异造成的。尝试设置trust\u env=None
信任环境=无#
代理配置、默认身份验证等的信任环境设置
或者,您可以禁用特定域的代理
在我的例子中,问题与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,请求在IPv4中成功
最终,我们通过在计算机上禁用IPv6解决了这一问题:
networksetup -setv6off "Wi-Fi"
但我认为这可以通过VPN配置来解决。在我的组织中,我必须在不同地理位置的VPN下运行我的程序。所以我们有多种代理配置 我发现使用名为的包自动获取代理详细信息更简单
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文件。此文件由代理配置详细信息()组成。@user1690356您可以使用代码访问其他网站(使用https)吗?@user1690356尝试设置标题{'Connection':'close'}或set requests.adapters.DEFAULT_RETRIES=5,发生此错误的其他原因是频繁访问
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')