【问题标题】:Download zip file without extraction from direct link下载 zip 文件而不从直接链接中提取
【发布时间】:2020-09-30 01:06:46
【问题描述】:

我正在尝试使用 Python 脚本制作一个从直接链接(例如:“http://beatsaver.com/api/download/key/f55c”)下载文件的脚本。 我尝试了这里或/其他网站的各种代码,结果要么是损坏的 zip 文件,要么是

“zipfile.BadZipFile: 文件不是 zip 文件”。

我试过这个:(zip损坏)

url = "http://beatsaver.com/api/download/key/f55c"
resp = requests.get(url)
zname = os.path.join('BeatSong', "song_test.zip")
zfile = open(zname, 'wb')
zfile.write(resp.content)
zfile.close()

或 3 或 4 个变体:( raise : "zipfile.BadZipFile: File is not a zip file")

url = "http://beatsaver.com/api/download/key/f55c"
resp = requests.get(url)
zip = zipfile.ZipFile(io.BytesIO(resp.content))
zip.extractall("/BeatSong")

该链接在加载时自动下载 zip 当我从浏览器下载它时,有什么方法可以检索 zip 文件?

【问题讨论】:

  • 这样下载的文件和浏览器下载的文件有什么区别?
  • 重点是自动下载几百个,而不是一个一个点击
  • 我误解了你的问题。我只是无法打开使用脚本下载的 zip,它说的是“损坏的存档或无法识别的格式”(计算机不是英文)浏览器 zip 文件很好
  • 我的意思是,文件大小不同吗?当您查看字节时,您会看到哪些差异?可能会对出了什么问题有所了解。
  • 啊,确实!脚本文件重量约为 4KB,而浏览器约为 8MB

标签: python download zip


【解决方案1】:

首先,该 url 在尝试使用 python 获取它时返回 403 禁止错误。该网站拒绝向您发送文件,因为它知道您是机器人。我可以通过设置用户代理来解决这个问题。

import urllib.request

url = "http://beatsaver.com/api/download/key/f55c"

#add headers so you don't get a 403 error
opener = urllib.request.build_opener()
opener.addheaders = [('user-agent', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36')]
urllib.request.install_opener(opener)

urllib.request.urlretrieve(url, 'song.zip', )

【讨论】:

  • 太棒了!这个用户代理是 Chrome 使用的,对吧? (我刚刚阅读了有关它的快速教程 rn)感谢您的宝贵时间!
  • 是的,我刚刚从我正在使用的浏览器中复制了用户代理。有像pypi.org/project/random-user-agent 这样的工具可以提供随机用户代理。还要确保将下载间隔分开,因为我们知道 beatsaver 会阻止漫游器,并且您不会给它们提供另一种方式来将您的应用识别为漫游器。
猜你喜欢
  • 1970-01-01
  • 2020-10-13
  • 2017-08-26
  • 1970-01-01
  • 2018-09-24
  • 1970-01-01
  • 1970-01-01
  • 2018-10-27
  • 1970-01-01
相关资源
最近更新 更多