Почему я не могу воспроизвести MIDI-файлы, которые я скачал программным способом, но я могу воспроизводить их, когда загружаю их вручную? - PullRequest
0 голосов
/ 01 июня 2018

Я хочу загрузить файлы 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 для сравнения его с соответствующим загруженным вручную файлом MIDI на этом веб-сайте, я получил эту ошибку:

Failed to load data=error

Но такой ошибки нет, когдазагрузка загруженного вручную.

РЕДАКТИРОВАНИЕ 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

1 Ответ

0 голосов
/ 01 июня 2018

Ваш код работает нормально, просто измените base_url на

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

Прямо сейчас, то есть "1.mid" содержит HTML-код для этого сайта: http://www.midiworld.com/files/1 (Вы можете открыть его с помощьютекстовый редактор.)

MIDI-файлы можно загрузить по URL-адресу http://www.midiworld.com/download/{insert number}

Я скачал первые 100, но, похоже, в настоящее время доступно 4992 скачиваемых миди-файла, поэтомуесли вам нужно больше файлов, просто измените

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
...