代码之家  ›  专栏  ›  技术社区  ›  Hanzy

为什么我不能下载带有python请求的midi文件?

  •  0
  • Hanzy  · 技术社区  · 7 年前

    我正在尝试用python和requests库下载一系列经典音乐midi文件。不幸的是,我似乎不能真正下载midi文件本身。我只下载HTML文件。我已经搜索了一些其他的解决方案,例如 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文件有什么想法吗?

    2 回复  |  直到 7 年前
        1
  •  3
  •   shamilpython    7 年前

    我解决了这个问题,但是我不得不对你的代码做一些重大的修改。修订代码:

    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)
    

    这似乎可以快速轻松地下载文件。他们都没有腐败,我可以发挥他们只是罚款。 谢谢你把我的文件夹塞满了古典音乐。

        2
  •  1
  •   Kota Mori    7 年前

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

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

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