Sprache auswählen

Eltern werden das kennen. Wegen einer langweiligen Sportsendung wird die Sendezeit der Sendung mit der Maus verlegt und die Kinder finden das gar nicht gut. Um das zu vermeiden, betreiben wir ein einfaches Web Scraping auf der Homepage der Sendung mit der Maus.

Die Homepage

Die Sendezeiten werden freundlicherweise über die Homepage bereitgestellt. Und es scheint auch so, als ob man sich hier in einfacher Textform seine Daten abholen könnten. Perfekt.

Bei genauerer Betrachtung des Quellcodes stellt man aber fest, dass die Daten wohl von Eintrag zu Eintrag in Nuancen abweichen. Das müssen wir beim Aufsetzen der Suchparameter berücksichtigen. Das variiert übrigens auch von Woche zu Woche, daher glaube ich, dass diese Seite von Hand mit Informationen gefüttert wird. Daher werde ich den Suchbereich etwas weiter ziehen.

Das Extrahieren der Daten

Was zu tun ist, lässt sich schnell erklären. Ich werde die gesamte Homepage zunächst herunterladen und in einen String umwandeln. Anschließend werde ich diesen String nach Wörtern durchsuchen, die einzigartig sind und in der Nähe der Informationen stehen, die ich möchte. In meinem Fall wird das der Suchstring (Das Erste) sein. Im Anschluss daran zerlege ich den String mittels des Pyhton Moduls regular expressions in die Informationen, die ich möchte. Abprüfen, ob das Sendedatum in der Zukunft oder Vergangenheit liegt, macht auch Sinn. Zum Schluss wird die Information dann per Mail verschickt. Für die Mailfunktion solltet Ihr den Artikel hier gelesen haben und das Skipt im gleichen Verzeichnis wie das hier abgelegt haben.

from urllib.request import urlopen
from mailing_function import send_email
import re
from datetime import datetime

def extractBroadcastTime():

    #download HTML page containing the broadcasting times
    with urlopen('https://www.wdrmaus.de/sendetermine.php5') as f:
        data = f.read().decode('utf-8')

    #proceed if download has been successfull 200 = OK 
    if f.status == 200:

        #search data for keyword (Das Erste) and store occurences
        lower = 0
        lowers = []
        keyword = '(Das Erste)'
        
        while lower < len(data):
            lower = data.find(keyword, lower)
            if lower == -1:
                break
            else:
                lowers.append(lower)
                lower = lower + 1

        #extract dates in occurences
        
        results = 'Die Sendung mit der Maus kommt:\n'
        
        for index in lowers:
            str = data[index - 40 : index + 50]
            dates = re.findall('(\d+.\d+.\d+)', str)
            times = re.findall('(\d+:\d+)', str)
            channels = re.findall('(\([\w ]+\))', str)

            for date in dates:
                showtime = datetime.strptime(date,'%d.%m.%Y')
                if datetime.now() < showtime:
                    for time, channel in list(zip(times, channels)):
                        results = results + '- am {} um {} auf {}\n'.format(date , time, channel)
        print(results)

    return results

if __name__ == '__main__':
    
    #get the broadcast time
    text = extractBroadcastTime()

    #send the mail
    recipient=[Diese E-Mail-Adresse ist vor Spambots geschützt! Zur Anzeige muss JavaScript eingeschaltet sein.',Diese E-Mail-Adresse ist vor Spambots geschützt! Zur Anzeige muss JavaScript eingeschaltet sein.']
    mail_components={'user':'user name for mail account', 'password':'password for mail account', 'subject':'Nächste Maus', 'text':text}
    #send_email(*recipient,**mail_components)

So, das Skirpt läuft bei mir jeden Samstag Mittag per Cronjob auf einem Raspberry Pi und warnt mich vor gefährlichen Programmverschiebungen.