我试图让我的服务器在 python 3 中从 URL 中获取文件。具体来说,我想将一个 URL 传递给一个函数,我希望该函数去抓取一个音频文件(许多不同的格式)并将其保存为 MP3,可能使用 ffmpeg 或 ffmpy。如果 URL 也有 PDF,我也想将其保存为 PDF。我还没有对 PDF 做太多研究,但我一直在研究音频片段,不确定这是否可能。
我在这里查看了几个问题,但最值得注意的是; 如何使用 Python 通过 HTTP 下载文件?
它有点旧,但我在那里尝试了几种方法,但总是遇到某种问题。我尝试过使用 requests 库、urllib、streamripper,也许还有其他。
有没有办法做到这一点并使用推荐的图书馆?
例如,我尝试过的大多数都保存了一些东西,比如 html 页面,或者在这种情况下是一个名为“file.mp3”的空文件。
Streamripper 收到尝试更改用户代理错误。
我不确定这是否可能,但我确信这里有一些我不理解的东西,有人能指出我正确的方向吗?
这不一定是我要使用的代码,只是我使用过的不起作用的示例。
import requests
url = "http://someurl.com/webcast/something"
r = requests.get(url)
with open('file.mp3', 'wb') as f:
f.write(r.content)
# Retrieve HTTP meta-data
print(r.status_code)
print(r.headers['content-type'])
print(r.encoding)
**编辑
import requests
import ffmpy
import datetime
import os
## THIS SCRIPT CAN BE PASSED A URL AND IF THE URL RETURNS
## HTTP HEADER FOR CONTENT TYPE AUDIO/MPEG, THE FILE WILL
## BE SAVED AS THE CURRENT-DATE-AND-TIME.MP3
##
## THIS SCRIPT CAN BE PASSED A URL AND IF THE URL RETURNS
## HTTP HEADER FOR CONTENT TYPE application/pdf, THE FILE WILL
## BE SAVED AS THE CURRENT-DATE-AND-TIME.PDF
##
## THIS SCRIPT CAN BE PASSED A URL AND IF THE URL RETURNS
## HTTP HEADER FOR CONTENT TYPE other than application/pdf, OR
## audio/mpeg, THE FILE WILL NOT BE SAVED
def BordersPythonDownloader(url):
print('Beginning file download requests')
r = requests.get(url, stream=True)
contype = r.headers['content-type']
if contype == "audio/mpeg":
print("audio file")
filename = '[{}].mp3'.format(str(datetime.datetime.now()))
with open('file.mp3', 'wb+') as f:
f.write(r.content)
ff = ffmpy.FFmpeg(
inputs={'file.mp3': None},
outputs={filename: None}
)
ff.run()
if os.path.exists('file.mp3'):
os.remove('file.mp3')
elif contype == "application/pdf":
print("pdf file")
filename = '[{}].pdf'.format(str(datetime.datetime.now()))
with open(filename, 'wb+') as f:
f.write(r.content)
else:
print("URL DID NOT RETURN AN AUDIO OR PDF FILE, IT RETURNED {}".format(contype))
# INSERT YOUR URL FOR TESTING
# OR CALL THIS SCRIPT FROM ELSEWHERE, PASSING IT THE URL
#DEFINE YOUR URL
#url = 'http://archive.org/download/testmp3testfile/mpthreetest.mp3'
#CALL THE SCRIPT; PASSING IT YOUR URL
#x = BordersPythonDownloader(url)
#ANOTHER EXAMPLE WITH A PDF
#url = 'https://www.cisco.com/c/en/us/td/docs/switches/lan/catalyst6500/ios/12-2SY/configuration/guide/sy_swcg/etherchannel.pdf'
#x = BordersPythonDownloader(url)
谢谢理查德,这段代码有效,帮助我更好地理解这一点。对改进上述工作示例有什么建议吗?