python - 如何解决请求无法通过 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 工作,因为我需要访问一个只能在其中工作的网站。如何解决这个问题?
解决方案
就我而言,问题与 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 配置来解决。
推荐阅读
- autodesk-forge - 使用数据可视化扩展在不同时间添加多个精灵的问题
- javascript - JavaScript 设置 innerText 没有 document.getElementById
- for-loop - 如果局部变量在放入通道后失去作用域会发生什么?
- r - 我的 ecdf() 函数对不同的输入给出相同的结果
- oracle-sqldeveloper - 当我有主机名、端口号和 SID 时,如何获取数据库的服务名称?
- python - 你能把 srun 的不同任务读入 Python 吗?
- python - 从 excel 中获取输入,需要从文本文件中删除数据
- wordpress - WordPress:为什么从网络中删除用户会从主/根站点的用户列表中删除所有用户
- logstash - 如果仅指定 certificate_authorities 值,WinLogBeat 使用什么 ssl 证书和密钥?
- python - Pandas:具有备用 y 轴的单系列