【问题标题】:Download file from Blob URL with Python使用 Python 从 Blob URL 下载文件
【发布时间】:2017-01-23 20:36:10
【问题描述】:

我希望我的 Python 脚本从 Frankfurt stock exchange webpage 下载 主数据(下载,XLSX) Excel 文件。

当用urrlibwget检索时,发现URL指向一个Blob,下载的文件只有289字节,不可读。

http://www.xetra.com/blob/1193366/b2f210876702b8e08e40b8ecb769a02e/data/All-tradable-ETFs-ETCs-and-ETNs.xlsx

我对 Blob 完全不熟悉,并且有以下问题:

  • 能否使用 Python 成功检索“Blob 后面”的文件?

  • 如果是这样,是否有必要发现 Blob 背后的“真实”URL——如果有这样的事情——以及如何发现?我担心的是上面的链接不是静态的,而是经常变化的。

【问题讨论】:

    标签: python download blob urllib


    【解决方案1】:

    那个 289 字节长的东西可能是403 forbidden 页面的 HTML 代码。发生这种情况是因为服务器很聪明,如果您的代码没有指定用户代理,它会拒绝。

    Python 3

    # python3
    import urllib.request as request
    
    url = 'http://www.xetra.com/blob/1193366/b2f210876702b8e08e40b8ecb769a02e/data/All-tradable-ETFs-ETCs-and-ETNs.xlsx'
    # fake user agent of Safari
    fake_useragent = 'Mozilla/5.0 (iPad; CPU OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5355d Safari/8536.25'
    r = request.Request(url, headers={'User-Agent': fake_useragent})
    f = request.urlopen(r)
    
    # print or write
    print(f.read())
    

    Python 2

    # python2
    import urllib2
    
    url = 'http://www.xetra.com/blob/1193366/b2f210876702b8e08e40b8ecb769a02e/data/All-tradable-ETFs-ETCs-and-ETNs.xlsx'
    # fake user agent of safari
    fake_useragent = 'Mozilla/5.0 (iPad; CPU OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5355d Safari/8536.25'
    
    r = urllib2.Request(url, headers={'User-Agent': fake_useragent})
    f = urllib2.urlopen(r)
    
    print(f.read())
    

    【讨论】:

    • 感谢您的回答。我需要能够将文件下载到磁盘(最好能够覆盖),而不仅仅是read它。
    • 这是一个例子。一旦你f.read(),你可以将它写入另一个文件。关键是使用假代理来检索 excel 文件。之后就和文件操作一样了。
    【解决方案2】:
    from bs4 import BeautifulSoup
    import requests
    import re
    
    url='http://www.xetra.com/xetra-en/instruments/etf-exchange-traded-funds/list-of-tradable-etfs'
    html=requests.get(url)
    page=BeautifulSoup(html.content)
    reg=re.compile('Master data')
    find=page.find('span',text=reg)  #find the file url
    file_url='http://www.xetra.com'+find.parent['href']
    file=requests.get(file_url)
    with open(r'C:\\Users\user\Downloads\file.xlsx','wb') as ff:
        ff.write(file.content)
    

    recommend requests 和 BeautifulSoup,都是不错的库

    【讨论】:

    • 我正在考虑这个解决方案。如果“blob URL”发生变化,它会更加健壮吗? (是吗?)
    • 当然,如果页面的框架没有改变@Winterflags
    猜你喜欢
    • 1970-01-01
    • 2021-07-25
    • 1970-01-01
    • 2022-10-25
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 2012-05-19
    • 2016-06-14
    相关资源
    最近更新 更多