【发布时间】:2021-12-28 17:54:52
【问题描述】:
我正在开发一个网页抓取功能,该功能将从内部(非公共)服务器中提取 HTML 数据。我通过 VPN 和代理服务器建立连接,因此当我 ping 任何公共站点时,我得到代码 200 没问题,但我们的内部返回 401。
这是我的代码:
http_str = f'http://{username}:{password}@proxy.yourorg.com:80'
proxyDict = {
'http' : http_str,
'https' : https_str,
'ftp' : https_str
}
html_text = requests.get(url, verify=True, proxies=proxyDict, auth=HTTPBasicAuth(user, pwd))
我尝试使用不同的证书链(有一个全新的问题列表)刷新我的 DNS 服务器。我在 1.23 版上使用 urllib3,因为这似乎有助于解决 SSL 错误。我考虑过使用请求会话,但不确定会发生什么变化。
此外,我们尝试访问的 url 不需要登录。我不知道为什么它会抛出 401 错误,但我认为身份验证是针对代理服务器的。感谢任何帮助或想法,以及问题,因为在这一点上我什至不知道要问什么来推动这个。
编辑:proxyDict 与用户有一个字符串,pwd 为每种类型传递它,https http fts 等。
【问题讨论】:
-
auth 参数是目标 URL 是否需要身份验证。它是否适用于从 requests.get() 中删除的 auth 参数?
-
它没有,我也忽略了验证并得到相同的 401。
-
f'xx' 如果嵌入例如 f-string “{user}”字段。尝试 r'xx' 作为原始字符串。
-
好吧,这是一个有趣的结果,r 字符串不起作用但 f 字符串起作用。但是,当我切换到 r 字符串时,公共站点的代理隧道也失败了。因此,代理似乎适用于具有 f 字符串的公共域。诡异的。但这是一个新错误,所以听起来代理正在工作,可能只是不适用于这些内部域。
-
如果您的 http_str 值中没有引用任何 {xx} 变量,则值中的 f-string 和 w/o f 前缀应该是相同的。如果将代码更改为
http_str = 'http://username:password@proxy.yourorg.com:80'字符串中不带 f 前缀,它会得到相同的结果吗?
标签: python ssl https python-requests http-status-code-401