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



目标:我想下载几年前离开网站的每一天的每日数据。这个网站有一个登录名,每个页面上只有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

您需要将身份验证信息添加到请求中。这或者使用";标题";,或通过";饼干";。您可以使用请求。会话对象来简化这两种情况。

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

很有可能(从网站的外观来看(它使用了服务器端会话。所以应该有一个类似于";会话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)

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

哪些部分是";有趣的比特";取决于后端,如果没有进一步的细节,我不能说。

最新更新