如何使用 Python3 从网页下载所有 MP3 URL 为 MP3?
How to download all MP3 URL as MP3 from a webpage using Python3?
我正在努力学习 Python 我尝试编写代码从我的教会网站下载所有圣经 mp3 文件,其中有一个 mp3 超链接列表,例如:
第 1 章,第 2、3、4、5 章等等... Reference link
在运行我的代码之后,我设法让所有 mp3 URL 链接显示在 shell 上,但我似乎根本无法下载它们.
这是我的代码
import requests
import urllib.request
import re
from bs4 import BeautifulSoup
r = requests.get('https://ghalliance.org/resource/bible-reading')
soup = BeautifulSoup(r.content, 'html.parser')
for a in soup.find_all('a', href=re.compile('http.*\.mp3')):
print(a['href'])
我确实尝试过使用 wget,但我似乎无法让 wget 在我的机器上工作 运行ning VSCode Python 3.8.1 64 位或 conda 3.7。 4...我检查了 conda cmd 和 cmd,它显示我的系统中有 wget,我什至手动将 wget.exe 下载到我的 system32 目录,但每当我尝试 运行
wget.download(url)
我总是收到错误消息或诸如 wget 没有属性 'download' 之类的东西。
我阅读了一些关于使用 selenium、wget、beautifulsoup 下载简单图片等的初学者教程,但我似乎无法将他们的方法结合起来解决我的这个特定问题...因为总的来说,我对编程还是太陌生了,所以我很抱歉问了这些愚蠢的问题。
但是现在我有了所有的 MP3 URL 链接,所以我的问题是:
我该如何使用 Python 下载它们?
因为您已经在使用库 requests
您也可以使用 requests
下载 mp3(或任何文件)
例如,如果您想从 URL https://test.ghalliance.org/resources//bible_reading/audio/Chiv Keeb 01.mp3
下载文件
doc = requests.get(https://test.ghalliance.org/resources//bible_reading/audio/Chiv%20Keeb%2001.mp3)
如果下载成功。 mp3 内容将存储在 doc.content
然后您需要打开文件并将数据写入该文件。
with open('myfile.mp3', 'wb') as f:
f.write(doc.content)
此时您已经有了文件名为 "myfile.mp3" 的 mp3,但您可能希望保存到与 URL.
中名称相同的文件名
让我们从 URL.
中提取文件名
filename = a['href'][a['href'].rfind("/")+1:]
with open(filename, 'wb') as f:
f.write(doc.content)
现在让我们把它们放在一起。
import requests
import urllib.request
import re
from bs4 import BeautifulSoup
r = requests.get('https://ghalliance.org/resource/bible-reading')
soup = BeautifulSoup(r.content, 'html.parser')
for a in soup.find_all('a', href=re.compile(r'http.*\.mp3')):
filename = a['href'][a['href'].rfind("/")+1:]
doc = requests.get(a['href'])
with open(filename, 'wb') as f:
f.write(doc.content)
import requests
import urllib.request
import re
from bs4 import BeautifulSoup
i=0
r = requests.get('https://ghalliance.org/resource/bible-reading')
soup = BeautifulSoup(r.content, 'html.parser')
for a in soup.find_all('a', href=re.compile('http.*\.mp3')):
i=i+1
url = a['href']
file=url.split()[1]
urllib.request.urlretrieve(url, f"{file}_{i}.mp3")
使用 urllib.request.urlretrieve(url, filename=None)
允许将 URL 表示的网络对象复制到本地文件。
请注意:
- 要从同一主机下载多个文件,您应该使用
requests.Session()
来维持 TCP
连接会话,而不是重复打开 socket
和 closing
的操作它。
- 您应该使用
stream=True
来避免损坏的下载。
- 在编写内容之前,您应该使用
.status_code
来检查 response
的状态。
- 您还知道有 2 个文件名丢失了吗?这是
Chiv Keeb 22mp3
和 Cov Thawjtswj 01mp3
扩展名应该是 .mp3
.
下面是实现您的目标的正确代码。
import requests
from bs4 import BeautifulSoup
import re
r = requests.get("https://ghalliance.org/resource/bible-reading/")
soup = BeautifulSoup(r.text, 'html.parser')
with requests.Session() as req:
for item in soup.select("#playlist"):
for href in item.findAll("a"):
href = href.get("href")
name = re.search(r"([^\/]+$)", href).group()
if '.' not in name[-4]:
name = name[:-3] + '.mp3'
else:
pass
print(f"Downloading File {name}")
download = req.get(href)
if download.status_code == 200:
with open(name, 'wb') as f:
f.write(download.content)
else:
print(f"Download Failed For File {name}")
我正在努力学习 Python 我尝试编写代码从我的教会网站下载所有圣经 mp3 文件,其中有一个 mp3 超链接列表,例如:
第 1 章,第 2、3、4、5 章等等... Reference link
在运行我的代码之后,我设法让所有 mp3 URL 链接显示在 shell 上,但我似乎根本无法下载它们.
这是我的代码
import requests
import urllib.request
import re
from bs4 import BeautifulSoup
r = requests.get('https://ghalliance.org/resource/bible-reading')
soup = BeautifulSoup(r.content, 'html.parser')
for a in soup.find_all('a', href=re.compile('http.*\.mp3')):
print(a['href'])
我确实尝试过使用 wget,但我似乎无法让 wget 在我的机器上工作 运行ning VSCode Python 3.8.1 64 位或 conda 3.7。 4...我检查了 conda cmd 和 cmd,它显示我的系统中有 wget,我什至手动将 wget.exe 下载到我的 system32 目录,但每当我尝试 运行
wget.download(url)
我总是收到错误消息或诸如 wget 没有属性 'download' 之类的东西。
我阅读了一些关于使用 selenium、wget、beautifulsoup 下载简单图片等的初学者教程,但我似乎无法将他们的方法结合起来解决我的这个特定问题...因为总的来说,我对编程还是太陌生了,所以我很抱歉问了这些愚蠢的问题。
但是现在我有了所有的 MP3 URL 链接,所以我的问题是: 我该如何使用 Python 下载它们?
因为您已经在使用库 requests
您也可以使用 requests
下载 mp3(或任何文件)
例如,如果您想从 URL https://test.ghalliance.org/resources//bible_reading/audio/Chiv Keeb 01.mp3
doc = requests.get(https://test.ghalliance.org/resources//bible_reading/audio/Chiv%20Keeb%2001.mp3)
如果下载成功。 mp3 内容将存储在 doc.content
然后您需要打开文件并将数据写入该文件。
with open('myfile.mp3', 'wb') as f:
f.write(doc.content)
此时您已经有了文件名为 "myfile.mp3" 的 mp3,但您可能希望保存到与 URL.
中名称相同的文件名让我们从 URL.
中提取文件名filename = a['href'][a['href'].rfind("/")+1:]
with open(filename, 'wb') as f:
f.write(doc.content)
现在让我们把它们放在一起。
import requests
import urllib.request
import re
from bs4 import BeautifulSoup
r = requests.get('https://ghalliance.org/resource/bible-reading')
soup = BeautifulSoup(r.content, 'html.parser')
for a in soup.find_all('a', href=re.compile(r'http.*\.mp3')):
filename = a['href'][a['href'].rfind("/")+1:]
doc = requests.get(a['href'])
with open(filename, 'wb') as f:
f.write(doc.content)
import requests
import urllib.request
import re
from bs4 import BeautifulSoup
i=0
r = requests.get('https://ghalliance.org/resource/bible-reading')
soup = BeautifulSoup(r.content, 'html.parser')
for a in soup.find_all('a', href=re.compile('http.*\.mp3')):
i=i+1
url = a['href']
file=url.split()[1]
urllib.request.urlretrieve(url, f"{file}_{i}.mp3")
使用 urllib.request.urlretrieve(url, filename=None)
允许将 URL 表示的网络对象复制到本地文件。
请注意:
- 要从同一主机下载多个文件,您应该使用
requests.Session()
来维持TCP
连接会话,而不是重复打开socket
和closing
的操作它。 - 您应该使用
stream=True
来避免损坏的下载。 - 在编写内容之前,您应该使用
.status_code
来检查response
的状态。 - 您还知道有 2 个文件名丢失了吗?这是
Chiv Keeb 22mp3
和Cov Thawjtswj 01mp3
扩展名应该是.mp3
.
下面是实现您的目标的正确代码。
import requests
from bs4 import BeautifulSoup
import re
r = requests.get("https://ghalliance.org/resource/bible-reading/")
soup = BeautifulSoup(r.text, 'html.parser')
with requests.Session() as req:
for item in soup.select("#playlist"):
for href in item.findAll("a"):
href = href.get("href")
name = re.search(r"([^\/]+$)", href).group()
if '.' not in name[-4]:
name = name[:-3] + '.mp3'
else:
pass
print(f"Downloading File {name}")
download = req.get(href)
if download.status_code == 200:
with open(name, 'wb') as f:
f.write(download.content)
else:
print(f"Download Failed For File {name}")