我正在尝试使用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来工作,因为我需要访问仅在该网站上工作的网站。该如何解决?
答案 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)。