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

Я пытаюсь скачать серию миди-файлов классической музыки с python и библиотекой запросов. К сожалению, я не могу загрузить файлы midi. Единственное, что я скачиваю, это файлы HTML. Я искал SO и пробовал некоторые другие решения, такие как этот пост и этот пост , но оба решения не работали для меня.

Вот код, который я написал:

from bs4 import BeautifulSoup
import requests
import re

url = 'http://www.midiworld.com/classic.htm'
headers = {'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36'}
r = requests.get(url, headers=headers)
data = r.text
soup = BeautifulSoup(data, "html.parser")

links = []
for link in soup.find_all("a", href=re.compile("mid$")):
    links.append(link['href'])


def get_filename(links):
    filenames = []
    """
    Will return a list of filenames for the files to be downloaded
    """
    for link in links:
        url = link
        if url.find('/'):
            f_name = url.rsplit('/', 1)[1]
            print(url.rsplit('/', 1)[1])
            filenames.append(f_name)
    return filenames


def download_files(links, filenames):
    for link, filename in zip(links, filenames):
        r = requests.get(url, allow_redirects=True)
        with open(filename, 'wb') as saveMidi:
            saveMidi.write(r.content)

filenames = get_filename(links)
download_files(links, filenames)

Я не могу понять, почему мне возвращаются HTML-файлы. Любые идеи о том, как правильно загрузить MIDI-файлы?

Ответы [ 2 ]

0 голосов
/ 01 сентября 2018

Я решил проблему, но мне пришлось внести некоторые существенные изменения в ваш код. Пересмотренный код:

import requests
from bs4 import BeautifulSoup
import re

main_page = requests.get('http://www.midiworld.com/classic.htm')
parsed_page = BeautifulSoup(main_page.content, 'html.parser')

links = parsed_page.find_all('a', href=re.compile('mid$'))
def getFileName(link):
    link = link['href']
    filename = link.split('/')[::-1][0]
    return filename

def downloadFile(link, filename):
    mid_file = requests.get(link['href'], stream=True)
    with open(filename, 'wb') as saveMidFile:
        saveMidFile.write(mid_file.content)
        print('Downloaded {} successfully.'.format(filename))

for link in links:
    filename = getFileName(link)
    downloadFile(link, filename)

Казалось, что скачивать файлы быстро и легко. Ни один из них не поврежден, и я могу играть в них просто отлично. Спасибо за загромождение моей домашней папки классической музыкой.

0 голосов
/ 01 сентября 2018

Не знаю почему, но у меня это сработало.

from urllib.request import urlopen
x = urlopen(links[0]).read()
with open(filenames[0], "wb") as f:
    f.write(x)
...