通过登录和多个页面从网站下载多个CSV文件

2024-05-19 08:57:15 发布

您现在位置:Python中文网/ 问答频道 /正文

目标:我想从网站上下载几年前每天的数据。 此网站有一个登录名,每个页面上只有7个CSV文件,然后您必须单击“上一个”等来查看前7个CSV文件。理想情况下,我想下载所有这些到一个文件夹中的所有日常数据。 指向文件加载的链接遵循一种非常简单的格式,我试图利用这种格式:

https://cranedata.com/publications/download/mfi-daily-data/issue/2020-09-08/

只在每个日期更改结尾,不考虑周末。 我曾试图修改几个版本的代码,但最终没有找到任何有效的

#!/usr/bin/env ipython
# --------------------
import requests
import shutil
import datetime
# -----------------------------------------------------------------------------------
dates=[datetime.datetime(2019,1,1)+datetime.timedelta(dval) for dval in range(0,366)];
# -----------------------------------------------------------------------------------
for dateval in dates:
    r = requests.get('https://cranedata.com/publications/download/mfi-daily-data/issue/'+dateval.strftime('%Y-%m-%d'), stream=True)
    if r.status_code == 200:
        with open(dateval.strftime('%Y%m%d')+".csv", 'wb') as f:
            r.raw.decode_content = True
            shutil.copyfileobj(r.raw, f)
    # ---------------------------------------------------------------------------------

这似乎适用于其他网站上的其他文件,但当我下载CSV文件时,它们实际上没有数据

这是我的excel文件所说的,而不是实际数据: https://prnt.sc/ugju49


Tags: 文件csv数据httpsimportcomdatetime网站
1条回答
网友
1楼 · 发布于 2024-05-19 08:57:15

您需要向请求中添加身份验证信息。这可以使用“标头”完成,也可以通过“cookie”完成。您可以使用requests.Session对象来简化这两种情况

如果不知道哪些技术用于身份验证,就无法向您提供更多详细信息

很可能(从网站外观来看)它使用了服务器端会话。因此,在“与后端对话”时,标题中应该有类似于“会话id”或“sid”的内容。您需要打开浏览器的“开发人员工具”,仔细查看“请求头”。执行登录时,还将显示响应和响应头

如果您非常幸运,只要在会话开始时执行登录,使用requests.Session就足够了。大概是这样的:

#!/usr/bin/env ipython

import requests
import shutil
import datetime

dates=[datetime.datetime(2019,1,1)+datetime.timedelta(dval) for dval in range(0,366)];

with requests.Session() as sess:
    sess.post(authentication-details)
    for dateval in dates:
        r = sess.get('https://cranedata.com/publications/download/mfi-daily-data/issue/'+dateval.strftime('%Y-%m-%d'), stream=True)
        if r.status_code == 200:
            with open(dateval.strftime('%Y%m%d')+".csv", 'wb') as f:
                r.raw.decode_content = True
                shutil.copyfileobj(r.raw, f)

如果这不起作用,您需要仔细检查开发人员工具中的“网络”选项卡,找出感兴趣的部分并在代码中重现它们

哪些部分是“有趣的部分”取决于后端,没有进一步的细节,我不能说

相关问题 更多 >

    热门问题