Как загрузить все URL-адреса MP3 в формате MP3 с веб-страницы с помощью Python3?

Я пытаюсь изучить Python, и я попытался написать код для загрузки всех mp3-файлов библии с моего церковного веб-сайта, где есть список гиперссылок mp3, например:

Глава 1, главы 2, 3, 4, 5 и так далее ... Ссылка на ссылку

Мне удалось получить все URL-ссылки mp3 для отображения в оболочке после запуска моего кода, но, похоже, я вообще не могу их загрузить.

Вот мой код

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 работать на моем компьютере с 64-разрядной версией VSCode Python 3.8.1 или conda 3.7.4 ... Я проверил как conda cmd, так и cmd, и он показал, что я имел wget в моей системе, я даже вручную загружал wget.exe в свой каталог system32, но всякий раз, когда я пытался запустить

wget.download(url)

Я всегда получаю сообщение об ошибке или что-то вроде того, что у wget нет атрибута «загрузка» или чего-то еще.

Я прочитал несколько руководств для начинающих по использованию selenium, wget, beautifulsoup для загрузки простых изображений и т. Д., Но я не могу использовать их метод для работы над этой моей конкретной проблемой ... потому что я все еще слишком новичок в программировании на в общем, прошу прощения за то, что задаю такие глупые глупые вопросы.

Но теперь, когда у меня есть все URL-ссылки в формате MP3, у меня возникает вопрос: как мне их загрузить с помощью Python? Если бы кто-нибудь мог помочь, был бы очень признателен.


person iGamers    schedule 31.12.2019    source источник
comment
проверьте мой ответ ниже   -  person αԋɱҽԃ αмєяιcαη    schedule 31.12.2019


Ответы (3)


Внимание, пожалуйста:

  • чтобы загрузить несколько файлов с одного и того же хоста, вы должны использовать 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}")
person αԋɱҽԃ αмєяιcαη    schedule 31.12.2019
comment
Спасибо, что нашли время, чтобы помочь объяснить свой процесс ... Мне все еще трудно понять и понять некоторые символы, такие как ([^ \ /] + $) ... Вы можете объяснить, что это? ... Я попробовал ваш код, и да, он отлично сработал, так что спасибо вам за это. - person iGamers; 01.01.2020
comment
@iGamers прочтите объяснение здесь regex101.com/r/FEHUZk/1 - person αԋɱҽԃ αмєяιcαη; 02.01.2020
comment
Ах да, конечно, это слишком сложное регулярное выражение, которое запомнить даже труднее, чем триггерное. - person iGamers; 04.01.2020

Поскольку вы уже используете библиотеку 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)

На данный момент у вас есть mp3 с именем файла "myfile.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)
person Audy    schedule 31.12.2019
comment
МОЙ БОГ! Это сработало! Большое спасибо! Вот где мне не хватает, я многому научился, просто прочитав вашу легкую пошаговую работу. Я очень ценю ваше время, чтобы помочь ... Я не могу особо выразить свою признательность, но я надеюсь, что смогу помочь кому-то еще в будущем. - person iGamers; 31.12.2019
comment
Юуп! Это было так полезно! Спасибо! - person Ice Bear; 15.12.2020

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-адресом, в локальный файл.

введите описание изображения здесь

person Sebin Sunny    schedule 31.12.2019
comment
Также большое спасибо, хотя ответ @ Audy выше уже отвечает на мой вопрос ... Я очень ценю ваш вклад в эту мою проблему и спасибо за то, что показал мне другой альтернативный подход. Я всегда буду благодарен. - person iGamers; 31.12.2019