【问题标题】:Downloading CSV files directly from website link直接从网站链接下载 CSV 文件
【发布时间】:2020-09-14 09:13:00
【问题描述】:

目标:从网站链接直接下载 CSV 文件。

我经历了几十个线程,使用不同的方法下载 CSV 文件。每种方法都给我留下了与 Excel 文件相同的损坏格式,该文件不包含原始信息,但包含一些代码。

我已经尝试将这些方法与其他网站的其他链接一起使用,并且效果很好,这让我觉得这个特定网站的这些 excel 文件有些不同,导致了问题。

我当前的代码(许多不同版本之一,都产生相同的结果):

import requests
import shutil
import datetime
import csv

req = requests.get('https://cranedata.com/publications/download/mfi-daily-data/issue/2020-09-11/.csv', stream=True)
url_content = req.content
if req.status_code == 200:
    print(req.status_code == requests.codes.ok)
    print(requests.Response.content)
    csv_file = open('MFID200911 .csv', 'wb')
    csv_file.write(url_content)
    csv_file.close()

我认为没有问题,因为我有 200 和 true 作为 req 和 req.status_code == requests.codes.ok 的输出

这会生成一个如下所示的 excel 文件:https://prnt.sc/ugx7bv

而不是我从网站手动下载文件时看到的那个:https://prnt.sc/ugx7u4

我的最终目标是循环下载所有 CSV 文件,因为只有链接上的日期会发生变化,但现在我只需要正确下载一个文件。

编辑:这是实现循环后的代码

 web = Browser()
web.go_to('https://cranedata.com/')
web.type(username , into='username')
web.type(password , into='password')
web.click('Login' , tag='login')

sdate = date(2009, 1, 1)   # start date
edate = date(2020, 9, 15)   # end date
delta = edate - sdate       # as timedelta
dates = [datetime.datetime(2009,4,6)+datetime.timedelta(dval) for dval in range(delta.days+1)];


for dateval in dates:
    web.go_to('https://cranedata.com/publications/download/mfi-daily-data/issue/' +dateval.strftime('%Y-%m-%d') + '/csv')

【问题讨论】:

  • 您正在下载 HTML 页面,因为没有记录对文件的访问。如果您从隐身窗口打开此 URL,并尝试查看登录页面的源代码,您将看到完全相同的信息。
  • 好吧,尽管在检查我是否有权访问时它给了我 200 和 true 作为输出,但我所拥有的只是访问登录提示?
  • 是的,您可以访问“自定义”登录页面。
  • 你对我如何确定我应该使用哪种方法通过 python 访问网站有什么建议吗? @Daniel Labbe

标签: python csv download


【解决方案1】:

您可以使用twill或mechanize包,例如here登录后直接获取文件。

或者您可以使用自动化工具,例如web bot 来模拟用户导航:

from webbot import Browser 
username = 'your_username'
password = 'your_password'
web = Browser()
web.go_to('https://cranedata.com/') 
web.type(username , into='username')
web.type(password , into='password') 
web.click('Login' , tag='login')
web.go_to('https://cranedata.com/publications/download/mfi-daily-data/issue/2020-09-11/.csv')

【讨论】:

  • 非常感谢!这行得通。正是我想要的!我想用这种方法我将不得不手动将文件从下载文件复制到我的文件目的地?这不是问题
  • 所以我的 chrome 因过载而崩溃时遇到了一些问题。我正在尝试下载大约 4000 个文件,所以我想用这种方法我需要以某种方式减慢它。有什么建议么? @Danie Labbe 如果有帮助,我用循环编辑了我的原件
  • 我会使用 sleep 方法来创建调用之间的间隔。
  • from time import sleep sleep(10) # 等待10秒
  • 再次感谢您!这也解决了这个问题@Daniel Labbe
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-15
  • 2018-06-21
  • 2022-07-21
相关资源
最近更新 更多