python - 为什么我无法播放以编程方式下载的 MIDI 文件,但手动下载后却可以播放?

标签 python audio web-crawler midi

我想从该网站下载项目的 MIDI 文件。我编写了以下代码来下载文件:

from bs4 import BeautifulSoup
import requests
import re, os
import urllib.request
import string

base_url = "http://www.midiworld.com/files/"

base_path = 'path/where/I/will/save/the/downloaded/MIDI/files'
os.chdir(base_path + '/MIDI Files')

for i in range(1,2386):
    page = requests.get(base_url + str(i))
    soup = BeautifulSoup(page.text, "html.parser")

    li_box = soup.select("div ul li a")
    urllib.request.urlretrieve(base_url+str(i), str(i)+'.mid')

这是在下载文件,但是当我点击它们播放时,它们不播放;我收到此错误:

enter image description here

但是如果我手动下载文件(我检查了其中几个),我就可以播放这些文件。如果相关的话,这些文件也有不同的名称,而不是像我保存它们的那样的数字。会不会是这个原因呢?这些文件也不为空,从下面的屏幕截图可以看出:

enter image description here

编辑:当我尝试加载以编程方式下载的 MIDI 文件以将其与 this 中相应的手动下载的 MIDI 文件进行比较时网站,我收到此错误:

加载数据失败=错误

但是加载手动下载的时候就没有这样的错误了。

编辑 2:这些是十六进制转储的前 50 个字节:

对于以编程方式下载的文件:

file name: 1.mid
mime type: 

0000-0010:  3c 21 44 4f-43 54 59 50-45 20 68 74-6d 6c 20 50  <!DOCTYP E.html.P
0000-0020:  55 42 4c 49-43 20 22 2d-2f 2f 57 33-43 2f 2f 44  UBLIC."- //W3C//D
0000-0030:  54 44 20 58-48 54 4d 4c-20 31 2e 30-20 53 74 72  TD.XHTML .1.0.Str
0000-0032:  69 63

对应手动下载的文件:

file name: Adson_John_-_Courtly_Masquing_Ayres.mid
mime type: 

0000-0010:  4d 54 68 64-00 00 00 06-00 01 00 0b-00 f0 4d 54  MThd.... ......MT
0000-0020:  72 6b 00 00-00 7b 00 ff-58 04 04 02-18 08 00 ff  rk...{.. X.......
0000-0030:  59 02 00 00-00 ff 51 03-07 a1 20 f0-40 ff 51 03  Y.....Q. ....@.Q.
0000-0032:  09 27

最佳答案

您的代码工作正常,只需将 base_url 更改为

base_url = "http://www.midiworld.com/download/"

现在,即“1.mid”包含此网站的 HTML:http://www.midiworld.com/files/1 (您可以使用文本编辑器打开它。)

MIDI 文件可以通过以下网址下载 http://www.midiworld.com/download/ {插入数字}

我下载了前 100 个,但目前似乎有 4992 个可下载的 midi 文件,因此如果您想要更多文件,只需更改

for i in range(1,4992):

顺便说一句,如果请求的 .mid 不存在,该网站会为您提供 0 字节的“_-_.mid”下载。因此,如果您要重复下载文件并且想要它们拥有的所有文件,请考虑将范围设置为例如 100 000,并在下载的文件大小为 0 字节时中断循环。

for i in range(1,100000):
    if (urllib.request.urlopen(base_url+str(i)).length == 0):
        break

关于python - 为什么我无法播放以编程方式下载的 MIDI 文件,但手动下载后却可以播放?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50636524/

相关文章:

iphone - 弹奏一定频率的音符

html - <audio>中<source>标签的顺序破坏了浏览器的兼容性

Apache Nutch 2.3.1 检查点不起作用

python - 这两种神经网络结构有什么区别呢?

python - 删除查询集中的重复项

python - 解析网络地址字符串

python - 以编程方式为 GCP 的 OAuth 2.0 客户端 ID 中的授权重定向 URI 添加 URU

ios - 如何保持声音关闭

java - 获取许多网站和服务的主机

php - 使用 DOM PHP 网络爬虫从外部站点选择性提取数据