使用 Python 从 Blob URL 下载文件

新手上路,请多包涵

我希望我的 Python 脚本从此 法兰克福证券交易所网页 下载 主数据(下载,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——如果有这样的东西——以及如何揭开?我在这里担心的是上面的链接不会是静态的,但实际上会经常变化。

原文由 P A N 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.5k
3 个回答

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

蟒蛇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())

蟒蛇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())

原文由 Jeon 发布,翻译遵循 CC BY-SA 4.0 许可协议

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,都不错

原文由 kiviak 发布,翻译遵循 CC BY-SA 3.0 许可协议

新手上路,请多包涵

blob对象是只存在于当前浏览器的会话中的虚拟对象,并不是实际的http请求,所以你获得url请求到服务端通常是404.其内容通常是在页面初始化的时候已经加载好了。
你有两种办法获得当前blob的真实数据来源:
1 通过浏览器调试和阅读js代码,找到当前的blob对象的初始化代码,大概就能看出数据是怎么来的了。
2 刷新页面,在调试器里遍历下当前页面的加载请求,找出看上去像静态数据的请求,blob数据大概就在其中。

如果页面过于复杂,以上方法行不通的时候,也可以尝试selenium之类的无头浏览器去请求,进而直接获取blob内容

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题