繁体   English   中英

从具有登录名和多个页面的网站下载多个 CSV 文件

[英]Downloading multiple CSV files from a website with login and multiple pages

目标:我想从网站上下载几年前每天的每日数据。 这个网站有一个登录名,在每个页面上它只有 7 个 CSV 文件,然后你必须点击上一个等才能查看前 7 个。理想情况下,我想将所有这些下载到一个文件夹中以获取所有日常数据。 下载文件的链接确实遵循我试图利用的非常简单的格式:

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

您需要在请求中添加身份验证信息。 这要么使用“标题”完成,要么通过“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)

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

哪些部分是“有趣的部分”取决于后端,没有更多细节,我不能说。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM