使用Python从Blob URL下载文件

6

我希望我的Python脚本可以从法兰克福证券交易所网页下载主数据(下载,XLSX)Excel文件。

当使用urrlibwget检索时,发现该URL导致一个Blob,下载的文件只有289字节且无法读取。

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

我完全不了解Blobs,有以下问题:

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

  • 如果可以,是否需要揭示“Blob”后面的“真实”URL(如果有这样的东西),如何操作?我的担忧是上面的链接不会是静态的,而实际上经常会改变。

3个回答

6
那个长度为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())

谢谢你的回答。我需要能够将文件下载到磁盘上(最好能够覆盖),而不仅仅是“读取”它。 - P A N
1
这是一个例子。一旦你使用f.read()读取了它,你可以将其写入另一个文件中。关键是使用一个伪装的代理来获取一个Excel文件。之后,就和文件操作一样了。 - Jeon

4
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)

推荐使用requests和BeautifulSoup两个好的库


1
我正在考虑这个解决方案。如果“blob URL”更改,它会更加健壮吗?(它们会吗?) - P A N
当然,如果页面的框架没有更改@Winterflags - kiviak
如果URL是像“blob:https://www.blabla.com....”这样的格式,似乎无法正常工作。 有什么处理方法吗? 另外,为什么要将“span”作为参数传递给page.find(“span”,text = reg)? - epsimatic88

0
对于我来说,目标下载链接看起来像: blob:https://jdc.xxxx.com/2c21275b-c1ef-487a-a378-1672cd2d0760 我尝试将原始响应写入本地xlsx文件中,并发现它可以正常运行。
import requests
        
r = requests.post(r'http://jdc.xxxx.com/rawreq/api/handler/desktop/export-rat-view?flag=jdc',json=data,headers={'content-type': 'application/json'})
file_name = 'file_name.xlsx'
with open(file_name, 'wb') as f:
    for chunk in r.iter_content(100000):
        f.write(chunk)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接