2023-01-20, 14:13
  #1
Medlem
Tjena!

Har länge använt mig av följande skript för att ladda ner mestadels dokumentärer från sr.se

Kod:
import requests
from bs4 import BeautifulSoup
import wget

lista = [
"https://sverigesradio.se/avsnitt/90-talskrisen-rantechocken-och-bankkraschen",
"https://sverigesradio.se/avsnitt/deepwater-horizon-oljekatastrofen-i-mexikanska-golfen",
"https://sverigesradio.se/avsnitt/svenska-kuppen-mot-scientologerna"
]

for i in lista:
    try:
        r = requests.get(i).text
        soup = BeautifulSoup(r, 'html5lib')

        head = soup.find('div', {'class': 'audio-heading'})
        heading = head.find('h1', {'class': 'heading'})
        time = soup.find('time', {'class': 'metadata-item-text'})

        name_format = "{} - {}.mp3".format(time.text, heading.text)

        link = soup.find('li', {'class': 'details-button-list__button'})
        mp3 = link.find('a')

        print(name_format)
        wget.download('https://' + mp3['href'][2:], '~/Dokumentärer/SR P3/' + name_format)
    except:
        print('ERROR:', i)

Det finns utvecklingspotential...

Två saker jag skulle vilja få till är att ändra bilden, från "P3 Dokumentär"s generiska bild, till den bild som visas på själva sidan (ex. https://sverigesradio.se/avsnitt/90-...h-bankkraschen) samt lägga till i kommentaren på mp3an den text som är skriven på sidan. I ovanstående exempel

Citat:
Under tiden som krisen rasade som värst höjdes räntan till 500 procent och en av Sveriges största banker försvann efter den stora fastighetskraschen. Över en halv miljon människor blev arbetslösa och tusentals företag gick i konkurs. P3 Dokumentär träffar personerna som tog de avgörande besluten för staten, bankerna och framtiden.

Producerat av Gustav Edman.
Det här är en förkortad version. Avsnittet gjordes av Onekligen media, år 2008.

Någon som har tips på hur detta kan göras?
Citera
2023-01-20, 18:25
  #2
Medlem
Enterprises avatar
Citat:
Ursprungligen postat av kajbaj
Tjena!

Har länge använt mig av följande skript för att ladda ner mestadels dokumentärer från sr.se

Kod:
import requests
from bs4 import BeautifulSoup
import wget

lista = [
"https://sverigesradio.se/avsnitt/90-talskrisen-rantechocken-och-bankkraschen",
"https://sverigesradio.se/avsnitt/deepwater-horizon-oljekatastrofen-i-mexikanska-golfen",
"https://sverigesradio.se/avsnitt/svenska-kuppen-mot-scientologerna"
]

for i in lista:
    try:
        r = requests.get(i).text
        soup = BeautifulSoup(r, 'html5lib')

        head = soup.find('div', {'class': 'audio-heading'})
        heading = head.find('h1', {'class': 'heading'})
        time = soup.find('time', {'class': 'metadata-item-text'})

        name_format = "{} - {}.mp3".format(time.text, heading.text)

        link = soup.find('li', {'class': 'details-button-list__button'})
        mp3 = link.find('a')

        print(name_format)
        wget.download('https://' + mp3['href'][2:], '~/Dokumentärer/SR P3/' + name_format)
    except:
        print('ERROR:', i)

Det finns utvecklingspotential...

Två saker jag skulle vilja få till är att ändra bilden, från "P3 Dokumentär"s generiska bild, till den bild som visas på själva sidan (ex. https://sverigesradio.se/avsnitt/90-...h-bankkraschen) samt lägga till i kommentaren på mp3an den text som är skriven på sidan. I ovanstående exempel



Någon som har tips på hur detta kan göras?
Jag får inte koden att fungera (blir bara exception - error: filnamn).

Hursomhelst, jag tror du kan använda följande CSS-selektor för att lokalisera elementet med bilden du vill åt:
Citat:
soup.select_one("div.gallery img")

För att få elementet med episod-texten (returnerar enbart första stycket, som jag tror det är som du egentligen vill åt):
Citat:
soup.select_one("div.episode-details__body.episode-details__body--tracks p")

Jag har inte provat i BS, men provat CSS-selektorerna i browsen på en av sidorna. Förhoppningsvis ser de andra sidorna likadana ut "strukturellt".
__________________
Senast redigerad av Enterprise 2023-01-20 kl. 18:29.
Citera
2023-01-20, 18:50
  #3
Medlem
Citat:
Ursprungligen postat av kajbaj
Tjena!

Har länge använt mig av följande skript för att ladda ner mestadels dokumentärer från sr.se

Kod:
import requests
from bs4 import BeautifulSoup
import wget

lista = [
"https://sverigesradio.se/avsnitt/90-talskrisen-rantechocken-och-bankkraschen",
"https://sverigesradio.se/avsnitt/deepwater-horizon-oljekatastrofen-i-mexikanska-golfen",
"https://sverigesradio.se/avsnitt/svenska-kuppen-mot-scientologerna"
]

for i in lista:
    try:
        r = requests.get(i).text
        soup = BeautifulSoup(r, 'html5lib')

        head = soup.find('div', {'class': 'audio-heading'})
        heading = head.find('h1', {'class': 'heading'})
        time = soup.find('time', {'class': 'metadata-item-text'})

        name_format = "{} - {}.mp3".format(time.text, heading.text)

        link = soup.find('li', {'class': 'details-button-list__button'})
        mp3 = link.find('a')

        print(name_format)
        wget.download('https://' + mp3['href'][2:], '~/Dokumentärer/SR P3/' + name_format)
    except:
        print('ERROR:', i)

Det finns utvecklingspotential...

Två saker jag skulle vilja få till är att ändra bilden, från "P3 Dokumentär"s generiska bild, till den bild som visas på själva sidan (ex. https://sverigesradio.se/avsnitt/90-...h-bankkraschen) samt lägga till i kommentaren på mp3an den text som är skriven på sidan. I ovanstående exempel



Någon som har tips på hur detta kan göras?

Kod:
pip install os
pip install eyed3
pip install pillow

Kod:
import requests
from bs4 import BeautifulSoup
import wget
import urllib.request
import os
import eyed3
from PIL import Image

lista = [
"https://sverigesradio.se/avsnitt/90-talskrisen-rantechocken-och-bankkraschen",
"https://sverigesradio.se/avsnitt/deepwater-horizon-oljekatastrofen-i-mexikanska-golfen",
"https://sverigesradio.se/avsnitt/svenska-kuppen-mot-scientologerna"
]

for i in lista:
    try:
        r = requests.get(i)
        if r.status_code != 200:
            raise ValueError(f'Error: {r.status_code}')
        soup = BeautifulSoup(r.text, 'html5lib')
        head = soup.find('div', {'class': 'audio-heading'})
        heading = head.find('h1', {'class': 'heading'})
        time = soup.find('time', {'class': 'metadata-item-text'})

        name_format = "{} - {}.mp3".format(time.text, heading.text)

        link = soup.find('li', {'class': 'details-button-list__button'})
        mp3 = link.find('a')

        # Hittar bilden, du kan nog hitta img_src ist men det är en större bild. Plockar den minsta här
        gallery = soup.find('div', {'class': 'gallery'})
        source = gallery.find_all('source')
        img_src = source[1]['srcset']

        print(name_format)
        wget.download('https://' + mp3['href'][2:], '~/Dokumentärer/SR P3/' + name_format)
        
        # Ladda ner bilden
        urllib.request.urlretrieve(img_src, 'temp.jpg')

        # Resizea bilden till 200x200
        img = Image.open('temp.jpg')
        img = img.resize((200, 200), Image.ANTIALIAS)
        img.save('temp.jpg')

        # Modifiera nedladdade filen och inkludera bild/kommentar
        audio = eyed3.load(name_format)
        text = soup.find('div', {'class': 'publication-text text-editor-content'}).text
        audio.tag.comments.set(text)

        with open('temp.jpg', 'rb') as image:
            audio.tag.images.set(3, image.read(), "image/jpeg")
            print("3")
        audio.tag.save()
        os.remove("temp.jpg")
    except:
        print('ERROR:', i)

Fungerar på min burk. En bra start iaf att utgå ifrån.
Citera
2023-01-20, 20:52
  #4
Medlem
Enterprises avatar
Citat:
Ursprungligen postat av Msanvil76

Fungerar på min burk. En bra start iaf att utgå ifrån.
Grymt!
Citera
2023-01-20, 22:37
  #5
Medlem
Citat:
Ursprungligen postat av kajbaj
Två saker jag skulle vilja få till är att ändra bilden, från "P3 Dokumentär"s generiska bild, till den bild som visas på själva sidan (ex. https://sverigesradio.se/avsnitt/90-...h-bankkraschen) samt lägga till i kommentaren på mp3an den text som är skriven på sidan. I ovanstående exempel
Någon som har tips på hur detta kan göras?
Kommentar och bild går att lägga till med tex Mp3Tag.
Citera
2023-01-21, 10:29
  #6
Medlem
Citat:
Ursprungligen postat av Msanvil76
Kod:
pip install os
pip install eyed3
pip install pillow

Kod:
import requests
from bs4 import BeautifulSoup
import wget
import urllib.request
import os
import eyed3
from PIL import Image

lista = [
"https://sverigesradio.se/avsnitt/90-talskrisen-rantechocken-och-bankkraschen",
"https://sverigesradio.se/avsnitt/deepwater-horizon-oljekatastrofen-i-mexikanska-golfen",
"https://sverigesradio.se/avsnitt/svenska-kuppen-mot-scientologerna"
]

for i in lista:
    try:
        r = requests.get(i)
        if r.status_code != 200:
            raise ValueError(f'Error: {r.status_code}')
        soup = BeautifulSoup(r.text, 'html5lib')
        head = soup.find('div', {'class': 'audio-heading'})
        heading = head.find('h1', {'class': 'heading'})
        time = soup.find('time', {'class': 'metadata-item-text'})

        name_format = "{} - {}.mp3".format(time.text, heading.text)

        link = soup.find('li', {'class': 'details-button-list__button'})
        mp3 = link.find('a')

        # Hittar bilden, du kan nog hitta img_src ist men det är en större bild. Plockar den minsta här
        gallery = soup.find('div', {'class': 'gallery'})
        source = gallery.find_all('source')
        img_src = source[1]['srcset']

        print(name_format)
        wget.download('https://' + mp3['href'][2:], '~/Dokumentärer/SR P3/' + name_format)
        
        # Ladda ner bilden
        urllib.request.urlretrieve(img_src, 'temp.jpg')

        # Resizea bilden till 200x200
        img = Image.open('temp.jpg')
        img = img.resize((200, 200), Image.ANTIALIAS)
        img.save('temp.jpg')

        # Modifiera nedladdade filen och inkludera bild/kommentar
        audio = eyed3.load(name_format)
        text = soup.find('div', {'class': 'publication-text text-editor-content'}).text
        audio.tag.comments.set(text)

        with open('temp.jpg', 'rb') as image:
            audio.tag.images.set(3, image.read(), "image/jpeg")
            print("3")
        audio.tag.save()
        os.remove("temp.jpg")
    except:
        print('ERROR:', i)

Fungerar på min burk. En bra start iaf att utgå ifrån.


Snyggt jobbat! Skriptet underlättar vardagen tycker jag.

Jag gjorde några små ytterligare justeringar:

Kod:
from bs4 import BeautifulSoup
import urllib.request
from PIL import Image
import requests
import wget
import eyed3
import os

lista = [
    "https://sverigesradio.se/avsnitt/90-talskrisen-rantechocken-och-bankkraschen",
    "https://sverigesradio.se/avsnitt/deepwater-horizon-oljekatastrofen-i-mexikanska-golfen",
    "https://sverigesradio.se/avsnitt/svenska-kuppen-mot-scientologerna"
]

# Mapp där du vill ladda ner dina filer till.
directory = "~/Music/dokumentär/"

for i in lista:
    try:
        r = requests.get(i)
        if r.status_code != 200:
            raise ValueError(f'Error: {r.status_code}')

        soup = BeautifulSoup(r.text, 'html5lib')
        head = soup.find('div', {'class': 'audio-heading'})
        heading = head.find('h1', {'class': 'heading'})
        time = soup.find('time', {'class': 'metadata-item-text'})

        name_format = "{} - {}.mp3".format(time.text, heading.text)

        link = soup.find('li', {'class': 'details-button-list__button'})
        mp3 = link.find('a')

        # Hittar bilden, du kan nog hitta img_src ist men det är en större bild. Plockar den minsta här
        gallery = soup.find('div', {'class': 'gallery'})
        source = gallery.find_all('source')
        img_src = source[1]['srcset']

        print(name_format)

        wget.download('https://' + mp3['href'][2:], directory + name_format)
        
        # Ladda ner bilden
        urllib.request.urlretrieve(img_src, directory + 'temp.jpg')

        # Resizea bilden till 200x200
        img = Image.open(directory + 'temp.jpg')
        img = img.resize((200, 200), Image.LANCZOS)
        img.save(directory + 'temp.jpg')

        # Modifiera nedladdade filen och inkludera bild/kommentar
        audio = eyed3.load(directory + name_format)
        text = soup.find('div', {'class': 'publication-text text-editor-content'}).text
        audio.tag.comments.set(text)

        with open(directory + 'temp.jpg', 'rb') as image:
            audio.tag.images.set(3, image.read(), "image/jpeg")
            print("3")

        audio.tag.save()
        os.remove(directory + "temp.jpg")

    except NameError:
        print('ERROR:', i)

Det som man kan fundera över är filnamnet, om " kl 19.03" behöver vara med eller inte. Personligen tror jag att det räcker med bara med datum.

Jag märkte att vissa mp3 som laddas ner redan innehåller en kommentar, om man skall radera den kommentar som redan finns för att ta fylla på den som finns på själva sr.se.

Kul att programmera något vettigt med andra!
Citera
2023-01-21, 10:42
  #7
Medlem
Tog bort klockslaget från filnamnet:


Kod:
from bs4 import BeautifulSoup
import urllib.request
from PIL import Image
import requests
import wget
import eyed3
import os
import re

lista = [
    "https://sverigesradio.se/avsnitt/90-talskrisen-rantechocken-och-bankkraschen",
    "https://sverigesradio.se/avsnitt/deepwater-horizon-oljekatastrofen-i-mexikanska-golfen",
    "https://sverigesradio.se/avsnitt/svenska-kuppen-mot-scientologerna"
]

# Full-path du vill ladda ner dina filer till. viktigt med en trailing slash!
directory = "/Users/kalle/Music/dokumentär/"

for i in lista:
    try:
        r = requests.get(i)
        if r.status_code != 200:
            raise ValueError(f'Error: {r.status_code}')

        soup = BeautifulSoup(r.text, 'html5lib')
        head = soup.find('div', {'class': 'audio-heading'})
        heading = head.find('h1', {'class': 'heading'})
        time_temp = soup.find('time', {'class': 'metadata-item-text'})

        # Radera klockslaget från tid-variabel
        time = re.sub(re.compile('kl\s\d{2}\.\d{2}'),"", time_temp.text).strip()

        name_format = "{} - {}.mp3".format(time, heading.text)

        link = soup.find('li', {'class': 'details-button-list__button'})
        mp3 = link.find('a')

        # Hittar bilden, du kan nog hitta img_src ist men det är en större bild. Plockar den minsta här
        gallery = soup.find('div', {'class': 'gallery'})
        source = gallery.find_all('source')
        img_src = source[1]['srcset']

        print(name_format)

        wget.download('https://' + mp3['href'][2:], directory + name_format)
        
        # Ladda ner bilden
        urllib.request.urlretrieve(img_src, directory + 'temp.jpg')

        # Resizea bilden till 200x200
        img = Image.open(directory + 'temp.jpg')
        img = img.resize((200, 200), Image.LANCZOS)
        img.save(directory + 'temp.jpg')

        # Modifiera nedladdade filen och inkludera bild/kommentar
        audio = eyed3.load(directory + name_format)
        text = soup.find('div', {'class': 'publication-text text-editor-content'}).text
        audio.tag.comments.set(text)

        with open(directory + 'temp.jpg', 'rb') as image:
            audio.tag.images.set(3, image.read(), "image/jpeg")
            print("3")

        audio.tag.save()
        os.remove(directory + "temp.jpg")

    except NameError:
        print('ERROR:', i)
Citera
2023-01-21, 11:09
  #8
Medlem
Citat:
Ursprungligen postat av kajbaj
Snyggt jobbat! Skriptet underlättar vardagen tycker jag.

Jag gjorde några små ytterligare justeringar:

Kod:
from bs4 import BeautifulSoup
import urllib.request
from PIL import Image
import requests
import wget
import eyed3
import os

lista = [
    "https://sverigesradio.se/avsnitt/90-talskrisen-rantechocken-och-bankkraschen",
    "https://sverigesradio.se/avsnitt/deepwater-horizon-oljekatastrofen-i-mexikanska-golfen",
    "https://sverigesradio.se/avsnitt/svenska-kuppen-mot-scientologerna"
]

# Mapp där du vill ladda ner dina filer till.
directory = "~/Music/dokumentär/"

for i in lista:
    try:
        r = requests.get(i)
        if r.status_code != 200:
            raise ValueError(f'Error: {r.status_code}')

        soup = BeautifulSoup(r.text, 'html5lib')
        head = soup.find('div', {'class': 'audio-heading'})
        heading = head.find('h1', {'class': 'heading'})
        time = soup.find('time', {'class': 'metadata-item-text'})

        name_format = "{} - {}.mp3".format(time.text, heading.text)

        link = soup.find('li', {'class': 'details-button-list__button'})
        mp3 = link.find('a')

        # Hittar bilden, du kan nog hitta img_src ist men det är en större bild. Plockar den minsta här
        gallery = soup.find('div', {'class': 'gallery'})
        source = gallery.find_all('source')
        img_src = source[1]['srcset']

        print(name_format)

        wget.download('https://' + mp3['href'][2:], directory + name_format)
        
        # Ladda ner bilden
        urllib.request.urlretrieve(img_src, directory + 'temp.jpg')

        # Resizea bilden till 200x200
        img = Image.open(directory + 'temp.jpg')
        img = img.resize((200, 200), Image.LANCZOS)
        img.save(directory + 'temp.jpg')

        # Modifiera nedladdade filen och inkludera bild/kommentar
        audio = eyed3.load(directory + name_format)
        text = soup.find('div', {'class': 'publication-text text-editor-content'}).text
        audio.tag.comments.set(text)

        with open(directory + 'temp.jpg', 'rb') as image:
            audio.tag.images.set(3, image.read(), "image/jpeg")
            print("3")

        audio.tag.save()
        os.remove(directory + "temp.jpg")

    except NameError:
        print('ERROR:', i)

Det som man kan fundera över är filnamnet, om " kl 19.03" behöver vara med eller inte. Personligen tror jag att det räcker med bara med datum.

Jag märkte att vissa mp3 som laddas ner redan innehåller en kommentar, om man skall radera den kommentar som redan finns för att ta fylla på den som finns på själva sr.se.

Kul att programmera något vettigt med andra!

Nice!

audio.tag.comments.set(text) ska skriva över den befintliga kommentaren. Ser nu att den däremot skippar sista stycket i varje kommentar.
Citera

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Det är enkelt att registrera ett nytt konto

Bli medlem

Logga in

Har du redan ett konto? Logga in här

Logga in