【问题标题】:Why can't I download a midi file with python requests?为什么我不能下载带有 python 请求的 midi 文件?
【发布时间】:2019-02-07 00:49:27
【问题描述】:

我正在尝试使用 python 和 requests 库下载一系列古典音乐 midi 文件。不幸的是,我似乎无法自己真正下载 MIDI 文件。我唯一下载的是 HTML 文件。我已经搜索过 SO 并尝试了一些其他解决方案,例如 this postthis 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 文件的任何想法?

【问题讨论】:

  • 呃,我有点困惑。你想要这个:在页面中搜索指向.mid文件的链接,然后将它们下载到一个目录中?

标签: python download python-requests web-crawler midi


【解决方案1】:

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

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)

这似乎可以快速轻松地下载文件。它们都没有损坏,我可以很好地播放它们。 谢谢你用古典音乐把我的主文件夹弄得乱七八糟。

【讨论】:

  • 谢谢,我会在早上测试它,看看它是否适合我。我能不能问我以后会更好:为什么我的代码返回html?我想看看我哪里出错了。编辑:也许我在哪里设置 data = r.text ?我会尝试进一步调查,以免再犯错误。
  • 我找到了问题的根源。它在download_files 函数中,在r = requests.get(url, allow_redirects=True) 行中,因为您使用for link, filename 但在requests.get 中使用url,它返回urlget_filename 中声明。一个简单的变量弄乱了整个代码!只需在您的代码中将 link 替换为 requests.get 中的 url 即可。
  • 我想扇自己耳光。哈哈谢谢。当我将脚本放在函数中时,我一定是从脚本顶部复制了一些代码而忘记更改它。
【解决方案2】:

我不知道为什么,但这对我有用。

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

【讨论】:

  • Kota,你上过耶鲁吗?
  • 我相信我在研究生院住在你的楼层。直到现在才注意到几个月前我的问题的答案......如果是你的话。
【解决方案3】:

如果有人想使用贝壳咒语:

wget https://www.midiworld.com/mozart.htm
cat mozart.htm | grep -oh -E 'https(.*)\.mid"' | sed 's/"//' | xargs wget -c -t1
rm mozart.htm

【讨论】:

    猜你喜欢
    • 2011-05-05
    • 2015-08-15
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 2016-05-11
    • 1970-01-01
    • 1970-01-01
    • 2012-04-12
    相关资源
    最近更新 更多