Praxisbeispiel: Webscraping newest Podcasts

In einem vorigen Beitrag habe ich an einem recht konstruiertem Beispiel die Möglichkeiten von Web Scraping mithilfe von dem Python Package „Beautiful Soup“ beschrieben. Siehe dazu hier. Nun möchte ich anhand eines kleinen Projektes von mir, an dem ich gerade privat arbeite, demonstrieren wie der Einsatz dieser Methode euch bei der Automatisierung von Funktionen helfen kann.

Zuerst einmal. Aktuell bin ich dabei, aufgrund der Corona Krise und der damit teilweise einhergehenden Langeweile, mich mit dem Thema Smart Home auseinander zu setzen. Dazu setze ich verschiedene Komponenten ein die ich über meinen Raspberry Pi dann als Steuerzentrale steuern lasse. Wenn das weiter fortgeschritten ist werde ich darüber auch einen eigenen Beitrag verfassen. Aktuell habe ich eine Routine gebaut, die mir morgens das Licht langsam einschaltet (von dunkel zu hell) und dabei dann anfängt Musik zu spielen. Allerdings möchte ich gerne, dass verschiedene Nachrichten Podcasts danach anfangen abzuspielen und ich somit während ich Zähne putze und Dusche quasi nebenbei ein kleines News Update bekomme. Das Problem so eine Funktion gibt es aktuell nicht in meiner Smart Home Zentrale, zumindest habe ich bisher nichts dazu gefunden. Darum musste ich mir selbst eine Lösung überlegen.

Die Lösung ist nun in einem Python Programm gelandet, mit dem ich anhand eines übergebenen Links von einer Übersichtsseite den jeweils neusten Podcaststream finde und z.B. an meine Sonos Lautsprecher in meiner Smart Home Zentrale übergeben kann (Dieser Teil fehlt noch. Aber das Python Programm ist soweit fertig).

Zuerst brauchte ich eine Seite auf der die verschiedenen Podcasts veröffentlicht werden. Damit ich nicht für jeden Nachrichten Sender / jeden Podcast eine eigene Prozedur schreiben muss habe ich eine Plattform gesucht wo viele ihre Podcasts veröffentlichen. So bin ich auf die Seite von Podbean gestoßen. Zu jedem Podcast gibt es eine Übersicht in einer Tabelle mit den letzten Podcast Folgen. Also steigen wir doch mal ein in mein Programm.

Zuerst mussten wir natürlich zwei bis drei Packages laden. Heute brauchen wir das Package sys um die Parameter an das Programm übergeben zu können . Zusätzlich brauchen wir das Package requests für die HTML Daten der Webseite und time für die kleine Pause zwischen den HTML Abfragen. wobei diese hier nicht wirklich benötigt wird. Wir haben pro Durchlauf nur 2 HTML Abfragen. Außerdem das Package Beautiful Soup um unsere HTML Dateien zu durchsuchen.

import sys
import requests
import time
from bs4 import BeautifulSoup

Haben wir das erfolgreich getan brauchen wir nun den Link zur Webseite. Den wollen wir nicht festschreiben sondern variabel dem Programm übergeben können.

url = sys.argv[1]

in der Variable url wird nun das 1. Argument das an das Programm übergeben wurde gespeichert. Um das Programm z.B. in Jupyter Notebook direkt zu testen, kann auch ein direkter Link reingeschrieben werden. Als Beispiel:

url = 'https://www.podbean.com/podcast-detail/myvnc-33f65/Tagesschau-%28Audio-Podcast%29'

Damit würden wir auf die Übersichtseite des Podcasts der Tagesschau kommen. Im folgenden habe ich diese Webseite inspiziert ( Wie man das macht habe ich ebenfalls in meinem vorigen Artikel beschrieben. Dabei wurde deutlich das der neueste Eintrag immer oben in der Liste dieser Übersichtsseite steht und ich über einen Link auf die Seite der jeweiligen Podcast folge komme.

response = requests.get(url)
if response.status_code == 200:
    soup = BeautifulSoup(response.text, "html.parser")
    one_tag = soup.find('table').find('a', href=True, class_="download")['href']
    url = one_tag

In diesem Abschnitt habe ich mir erst den HTML Quelltext geholt und in der Variable Response gespeichert. Außerdem habe ich geprüft ob diese Aktion erfolgreich war, also ob ich überhaupt eine Webseite hinter der Adresse gefunden habe. Dann habe ich den Text von Response mithilfe BeautifulSoup geparsed und in der Variable soup gespeichert.  Die 4. Zeile sucht nun nach der Tabelle und findet hier den ersten Eintrag der vom Typ „a“ ist und einen link enthält und bei der class = download drinsteht. Zurück gemeldet bekomme ich dann den wert der hinter „href“ in dem HTML Block ist. Und das ist der Link zur Seite der jeweiligen Folge. Also fast am Ziel. Diesen Link speichere ich der Einfachheit nochmal in der url und dann mache ich prinzipiell das selbe nochmal.

time.sleep(3)
response = requests.get(url)
if response.status_code == 200:
    soup = BeautifulSoup(response.text, "html.parser")
    one_tag = soup.find('a', href=True, class_="btn btn-ios download-btn")['href']
    print(one_tag)

Ich habe eine kleine Wartezeit von 3 Sekunden eingebaut und rufe dann von dem nun gespeicherten Link die HTML quelldaten ab. Dann suche ich den Link zur Audiodatei über den entsprechenden Button und gebe den als Ergebnis meines Programms aus. Das ist alles.

Nun muss ich mir diesen Rückgabewert nur noch greifen und an die Sonos Lautsprecher geben und schon spielt diese die aktuellste Folge der Tagesschau ab.

Das komplette Programm sieht dann folgender maßen aus.

# Necessary Packages
import sys
import requests
import time
from bs4 import BeautifulSoup



# Link to website or paramets
url = sys.argv[1]
#url = 'https://www.podbean.com/podcast-detail/m85xy-53353/Tagesschau-in-100-Sekunden-%281280x720%29-Podcast'

# get html sourcecode and check if request was successfull
response = requests.get(url)
if response.status_code == 200:
# parse the response and get the link to the podcast site
    soup = BeautifulSoup(response.text, "html.parser")
    one_tag = soup.find('table').find('a', href=True, class_="download")['href']
    url = one_tag
# sleep for 3 seconds and get the html sourcecode from podcast site
    time.sleep(3)
    response = requests.get(url)
    if response.status_code == 200:
        soup = BeautifulSoup(response.text, "html.parser")
# search for the link to the audio file and print it out
        one_tag = soup.find('a', href=True, class_="btn btn-ios download-btn")['href']
        print(one_tag)

Ich hoffe ich konnte damit einen kleinen praktischen Einblick von dem Nutzen von Webscraping geben um z.B. nicht nur große Datenmengen aus dem Web zu sammeln, sondern auch kleine praktische Automatisierungen voranzutreiben. Solche Anwendungsmöglichkeiten gibt es nicht nur im privaten sondern auch in zahlreichen Business Bereichen.

Fragen und Feedback sind wie immer willkommen.