python - 为什么我无法使用 python 请求下载 MIDI 文件?

标签 python download python-requests web-crawler midi

我正在尝试使用 python 和 requests 库下载一系列古典音乐 midi 文件。不幸的是,我似乎无法真正下载 MIDI 文件本身。我唯一下载的是 HTML 文件。我搜索了SO并尝试了其他一些解决方案,例如this post ,和this post ,但这两种解决方案都不适合我。

这是我编写的代码:

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 文件有什么想法吗?

最佳答案

我解决了这个问题,但我必须对您的代码进行一些重大更改。修改后的代码:

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)

这似乎可以快速轻松地下载文件。它们都没有损坏,我可以很好地播放它们。 感谢您用古典音乐扰乱了我的主文件夹。

关于python - 为什么我无法使用 python 请求下载 MIDI 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52124737/

相关文章:

javascript - Python 请求和 Forbes 'Welcome' 页面重定向

python - python中请求之间的适当时间?

python - 如何在Scrapy上同步获取Request的Response对象?

python - 如何检查 DataSeries 的连续性?

c# - 在 C# 中分段下载?

ios - 在文档目录中下载或移动文件异步 - iOS

python - PyCharm 自动完成不适用于 pygame

python - Pandas 使用查找字典更新列中的值

objective-c - 当应用程序未激活时 iOS 后台下载

python - 为什么请求响应对象 __bool__ 检查 200 <= status < 400?