【问题标题】:Python Requests Returning 401 code on 'get' methodPython请求在'get'方法上返回401代码
【发布时间】: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


【解决方案1】:

要将 HTTP 基本身份验证与您的代理一起使用,请在任何代理配置条目中使用 http://user:password@host/ 语法。见apidocs

import requests
proxyDict = {
    "http": "http://username:password@proxy.yourorg.com:80",
    "https": "http://username:password@proxy.yourorg.com:80"
}
url = 'http://myorg.com/example'
response = requests.get(url, proxies=proxyDict)

但是,如果您通过 VPN 访问内部 URL(即,在您的 Intranet 上的组织内部),那么您不需要代理来访问它们。

试试:

import requests
url = 'http://myorg.com/example'
response = requests.get(url, verify=False)

【讨论】:

  • 嘿,抱歉,我将进行编辑以澄清,但代理地址字符串中确实有用户名和密码。但听起来如果我添加不需要basicAuth的代理?听起来我的问题可能与代理服务器或代理凭据有关...
  • 是的,如果目标 URL 不需要任何身份验证,那么这是代理服务器或代理凭据的问题。
猜你喜欢
  • 1970-01-01
  • 2021-08-08
  • 2017-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-25
相关资源
最近更新 更多