通过pandas访问远程URL时处理HTTP身份验证

fcc*_*lho 7 python pandas

Pandas具有非常方便的能力,可以从URL中读取csv和其他格式.但是,当数据受到简单的http身份验证保护时,Pandas无法提示用户输入身份验证详细信息(userid,password).解决此限制的最佳方法是什么?

我目前正在做的是:

response = requests.get('http://my.data.url/metrics/crawler/counts', auth=HTTPBasicAuth('userid', 'password'), stream=True)
pd.read_csv(response.raw)
Run Code Online (Sandbox Code Playgroud)

有没有更好的办法?

saa*_*aaj 14

由于 Pandas 1.2pandas.read_csvstorage_options参数:

\n
\n

对于特定存储连接有意义的额外选项,例如主机、端口、用户名、密码等。对于 HTTP(S) URL,键值对将作为urllib标头选项转发。对于其他 URL(例如以 \xe2\x80\x9cs3://\xe2\x80\x9d 和 \xe2\x80\x9cgcs://\xe2\x80\x9d 开头),键值对将转发到fsspec. 请参阅fsspecurllib了解更多详情。

\n
\n

storage_options控制 HTTP 标头,因此可以构造 Basic AuthAuthorization标头。

\n

运行受基本身份验证保护的 HTTP 服务器user:pass,提供虚拟 CSV test.csv、.

\n
docker run --rm -it -p 8000:8000 python:2-alpine sh -c \\\n  "echo -e \'key,value\\nfoo,1\\nbar,2\' > test.csv \\\n   && pip install https://github.com/smarzola/extended_http_server/archive/e2006102.zip \\\n   && ext_http_server -a user:pass"\n
Run Code Online (Sandbox Code Playgroud)\n

用于读取它的 Python 代码pandas.read_csv如下所示。

\n
In [1]: import pandas\n\nIn [2]: try:\n   ...:   pandas.read_csv(\'http://localhost:8000/test.csv\')\n   ...: except Exception as ex:\n   ...:   print(ex)\nHTTP Error 401: Unauthorized\n\nIn [3]: from base64 import b64encode\n   ...: \n   ...: pandas.read_csv(\n   ...:   \'http://localhost:8000/test.csv\',\n   ...:   storage_options={\'Authorization\': b\'Basic %s\' % b64encode(b\'user:pass\')},\n   ...: )\nOut[3]: \n   key  value\n0  foo      1\n1  bar      2\n
Run Code Online (Sandbox Code Playgroud)\n


Jon*_*nah -1

无法测试,但看起来基本访问身份验证可以在 url 中编码。来自维基百科

URL编码

客户端在访问基本访问身份验证时可以通过在 url 中的主机名前添加 username:password@ 来避免登录提示。例如,以下内容将使用安全 HTTPS 协议访问网站 www.example.com 上的页面 index.html,并通过基本授权提供用户名 Aladdin 和密码 OpenSesame 凭据: https://Aladdin:OpenSesame@www。 example.com/index.html

希望有帮助!

  • 这是行不通的。Pandas `read_csv` 无法解析 URL 本身提供的用户名、密码。这是堆栈 ` (self.host, self.port) = self._get_hostport(host, port) 文件“/Users/mohitranjan/anaconda2/lib/python2.7/httplib.py”,第 792 行,在 _get_hostport raise InvalidURL( “非数字端口:'%s'”%主机[i + 1:])httplib.InvalidURL:非数字端口:'XXXXXX@YYY.com'` (2认同)