通过公共HTTP自动检索大文件到googlecloudstorag

2024-09-28 20:51:58 发布

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

出于天气处理的目的,我希望在谷歌云存储中自动检索每日天气预报数据。在

这些文件可以在公共httpurl(http://dcpc-nwp.meteo.fr/openwis-user-portal/srv/en/main.home)上找到,但是它们非常大(在30到300兆字节之间)。文件大小是主要问题。在

在看过前面的stackoverflow主题之后,我尝试了两种不成功的方法:

1/在谷歌应用引擎中通过urlphetch首次尝试

    from google.appengine.api import urlfetch

    url = "http://dcpc-nwp.meteo.fr/servic..."
    result = urlfetch.fetch(url)

    [...] # Code to save in a Google Cloud Storage bucket

但是我在urlphetch行上收到以下错误消息:

DeadlineExceededError:等待来自URL的HTTP响应时超过了截止日期

通过云存储传输服务每秒尝试2次

根据文档,可以通过云存储传输服务将HTTP数据直接检索到云存储中: https://cloud.google.com/storage/transfer/reference/rest/v1/TransferSpec#httpdata

但是在下载之前它需要文件的大小和md5。这个选项在我的案例中不起作用,因为网站没有提供这些信息。在

有什么想法吗?

你有没有看到任何解决方案可以自动检索HTTP上的大文件到我的云存储桶?在


Tags: 文件数据httpurlgooglefr天气meteo
3条回答

目前,Google的传输服务需要MD5和size;我们知道在像您这样的情况下,这可能很难处理,但不幸的是,我们今天没有一个好的解决方案。在

除非你能通过自己下载文件(临时)来获得文件的大小和MD5,否则我想这是你能做的最好的了。在

3/使用计算引擎实例的解决方法

由于不可能使用appengine或直接使用云存储从外部HTTP检索大文件,所以我使用了一个始终运行的计算引擎实例的解决方案。在

该实例定期检查是否有新的天气文件可用,下载并上传到云存储桶中。在

出于可扩展性、维护和成本的考虑,我宁愿只使用无服务器服务,但希望:

  • 它在一个新的f1微型计算引擎实例上运行良好(不需要额外的包,如果24/7运行,每月只需4美元)
  • 如果实例和bucket在同一区域(0$/月),则计算引擎到Google云存储的网络流量是免费的

使用curl-I命令可以轻松快速地检索文件的md5和大小,如链接https://developer.mozilla.org/en-US/docs/Web/HTTP/Range_requests中所述。
然后可以将存储传输服务配置为使用该信息。在

另一个选择是使用无服务器云功能。它可能看起来像下面的Python代码。在

import requests

def download_url_file(url):
    try:
        print('[ INFO ] Downloading {}'.format(url))
        req = requests.get(url)
        if req.status_code==200:
            # Download and save to /tmp
            output_filepath = '/tmp/{}'.format(url.split('/')[-1])
            output_filename = '{}'.format(url.split('/')[-1])
            open(output_filepath, 'wb').write(req.content)
            print('[ INFO ] Successfully downloaded to output_filepath: {} & output_filename: {}'.format(output_filepath, output_filename))
            return output_filename
        else:
            print('[ ERROR ] Status Code: {}'.format(req.status_code))
    except Exception as e:
        print('[ ERROR ] {}'.format(e))
    return output_filename

相关问题 更多 >