[英]Why can't I download a midi file with python requests?
我正在嘗試使用 python 和請求庫下載一系列古典音樂 midi 文件。 不幸的是,我似乎無法真正自己下載 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 文件的任何想法?
我解決了這個問題,但我不得不對您的代碼進行一些重大更改。 修改后的代碼:
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)
這似乎可以快速輕松地下載文件。 它們都沒有損壞,我可以很好地播放它們。 謝謝你用古典音樂把我的主文件夾弄得亂七八糟。
我不知道為什么,但這對我有用。
from urllib.request import urlopen
x = urlopen(links[0]).read()
with open(filenames[0], "wb") as f:
f.write(x)
如果有人想使用 shell 法術:
wget https://www.midiworld.com/mozart.htm
cat mozart.htm | grep -oh -E 'https(.*)\.mid"' | sed 's/"//' | xargs wget -c -t1
rm mozart.htm
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.