如何使用 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 连接会话,而不是重复打开 socketclosing 的操作它。
  • 您应该使用 stream=True 来避免损坏的下载。
  • 在编写内容之前,您应该使用 .status_code 来检查 response 的状态。
  • 您还知道有 2 个文件名丢失了吗?这是 Chiv Keeb 22mp3Cov 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}")