Hallo,
ich habe folgendes Problem: Ich möchte das Video von https://www.tagesschau.de/100sekunden/ mit einem Python-Skript herunter laden und irgendwo speichern. Geht das?
Sollte das nicht gehen, habe ich einen Link zu einem Video (https://media.tagesschau.de/video/2020/ ... m.h264.mp4) und wollte da Fragen, ob man das Video vlt über diesen herunter laden kann.
die erste möglichkeit wäre mir lieber.
Vielen Dank für Eure Hilfe!
python mp4 downloaden?
- __blackjack__
- User
- Beiträge: 14019
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@JakobPrie: Ja, das geht. Beides.
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
Das sollte mit einer Kombination aus dem requests-Paket und BeautifulSoup relativ einfach umsetzbar sein. Es geht ja bestimmt nicht nur um die angegebene Video-Datei, sondern um ein regelmäßiges Herunterladen der 100-Sekunden-Videos, oder?
Grundsätzlich kann man sich zwar auch das Muster des Dateinamens anschauen und dann immer aufgrund des aktuellen Datums den Dateinamen erraten. Aber ein vorheriges Parsen der offiziellen Seite, um da den Dateinamen abzugreifen, erscheint mir etwas robuster. Daher der Hinweis auf BeautifulSoup.
Grundsätzlich kann man sich zwar auch das Muster des Dateinamens anschauen und dann immer aufgrund des aktuellen Datums den Dateinamen erraten. Aber ein vorheriges Parsen der offiziellen Seite, um da den Dateinamen abzugreifen, erscheint mir etwas robuster. Daher der Hinweis auf BeautifulSoup.
Zuletzt geändert von snafu am Sonntag 21. Juni 2020, 11:56, insgesamt 1-mal geändert.
Man benutzt requests um die URL zu lesen, und BeautifulSoup um den HTML-Code zu parsen.
Dann kannst Du entweder gleich das meta-Tag im Header mit Namen twitter:player:stream nehmen, das den Link auf das Video enthält, oder jeweils das <a>-Tag mit der Beschriftung "Klein (h264)", "Mittel (h264)", oder "Groß (h264)", je nachdem welche Auflösung du möchtest.
Dann kannst Du entweder gleich das meta-Tag im Header mit Namen twitter:player:stream nehmen, das den Link auf das Video enthält, oder jeweils das <a>-Tag mit der Beschriftung "Klein (h264)", "Mittel (h264)", oder "Groß (h264)", je nachdem welche Auflösung du möchtest.
Hier der ganze Spaß mal in knapp 40 Zeilen runtergeschrieben mit ein paar Statusmeldungen und Fehlerbehandlungen. Im Code wird das Meta-Tag genutzt. Wenn man den Hinweis mit den verschiedenen Video-Größen umsetzen möchte, müsste man den Teil noch erweitern.
Code: Alles auswählen
#!/usr/bin/env python3
from bs4 import BeautifulSoup
from pathlib import Path
import requests
from urllib.parse import urlparse
TAGESSCHAU_URL = "https://www.tagesschau.de/100sekunden/"
DOWNLOAD_PATH = Path("~/Videos").expanduser()
def get_content(url):
response = requests.get(url)
response.raise_for_status()
return response.content
def get_video_url():
soup = BeautifulSoup(get_content(TAGESSCHAU_URL), "html.parser")
meta = soup.find("meta", {"name": "twitter:player:stream"})
if not meta or not meta.has_attr("content"):
raise ValueError("Konnte keine Infos zur Video-URL finden")
return meta["content"]
def download_video(url):
filename = Path(urlparse(url).path).name
path = DOWNLOAD_PATH / filename
path.write_bytes(get_content(url))
return path
def main():
try:
print(f"Hole Video-URL von {TAGESSCHAU_URL} ...")
url = get_video_url()
print(f"Lade Video von {url} herunter ...")
path = download_video(url)
print(f"Video wurde gespeichert unter {path}")
except Exception as e:
print(f"Abbruch durch Fehler: {e}")
if __name__ == "__main__":
main()
Hallo,
ich möchte die Videodatei am Ende noch in ein .wav-Format umwandeln und habe dazu im Internet rechachiert und folgendes zusammengeschustert:
def convert_to_wav():
ffmpeg -i tagesschau_100sec.mp4 -ac 2 -f wav tagesschau_100sec.wav
Doch da scheint die Syntax fehlerhaft zu sein, was ich mir schon fast gedacht habe, da man diese Zeile ja eher in das Terminal eingeben müsste.
Zusätzlich wollte ich fragen, wie ich den Path angeben kann/muss?
Danke schon einmal für die Hilfe!
ich möchte die Videodatei am Ende noch in ein .wav-Format umwandeln und habe dazu im Internet rechachiert und folgendes zusammengeschustert:
def convert_to_wav():
ffmpeg -i tagesschau_100sec.mp4 -ac 2 -f wav tagesschau_100sec.wav
Doch da scheint die Syntax fehlerhaft zu sein, was ich mir schon fast gedacht habe, da man diese Zeile ja eher in das Terminal eingeben müsste.
Zusätzlich wollte ich fragen, wie ich den Path angeben kann/muss?
Danke schon einmal für die Hilfe!
Für Shell-Befehle gibt es in Python das subprocess-Modul. Dann klappt auch die Ausführung. Einfach so als Zeile kann man das natürlich nicht in ein Python-Skript schreiben.
Aber ich bin verwirrt: Nutzt du nun das Skript für den Download, was ich gepostet hatte oder welche Lösung hast du gefunden?
Aber ich bin verwirrt: Nutzt du nun das Skript für den Download, was ich gepostet hatte oder welche Lösung hast du gefunden?
An welcher Stelle jetzt genau?JakobPrie hat geschrieben: Sonntag 21. Juni 2020, 18:21 Zusätzlich wollte ich fragen, wie ich den Path angeben kann/muss?
Danke für den Tipp!snafu hat geschrieben: Sonntag 21. Juni 2020, 20:48 Für Shell-Befehle gibt es in Python das subprocess-Modul. Dann klappt auch die Ausführung. Einfach so als Zeile kann man das natürlich nicht in ein Python-Skript schreiben.
Aber ich bin verwirrt: Nutzt du nun das Skript für den Download, was ich gepostet hatte oder welche Lösung hast du gefunden?
An welcher Stelle jetzt genau?JakobPrie hat geschrieben: Sonntag 21. Juni 2020, 18:21 Zusätzlich wollte ich fragen, wie ich den Path angeben kann/muss?
Ja ich nutze dein Script zum Herunterladen des Videos. Aber im Anschluss möchte ich das herunter geladene Video noch in ein wav Format umwandeln.
-
- User
- Beiträge: 2
- Registriert: Sonntag 27. Februar 2022, 17:38
Hey,
ich wollte mal fragen, ob das Script bei euch noch funktioniert?
Bei mir kommt jetzt immer der Fehler "Abbruch durch Fehler: Konnte keine Infos zur Video-URL finden".
Als ich es heute morgen das zweite Mal probiert habe, konnte ich noch das aktuelle Video herunterladen. Hat vielleicht jemand eine Idee woran das liegen könnte oder ob man mit kleinen Anpassungen wieder Videos herunterladen könnte.
Bin noch Python Anfänger und hatte mich sehr gefreut dieses Script zu finden. Kann es auch nachvollziehen, aber leider nicht selber den Fehler finden.
Vielen Dank, dass @snafu das Script geschrieben hat.
Joshi
ich wollte mal fragen, ob das Script bei euch noch funktioniert?
Bei mir kommt jetzt immer der Fehler "Abbruch durch Fehler: Konnte keine Infos zur Video-URL finden".
Als ich es heute morgen das zweite Mal probiert habe, konnte ich noch das aktuelle Video herunterladen. Hat vielleicht jemand eine Idee woran das liegen könnte oder ob man mit kleinen Anpassungen wieder Videos herunterladen könnte.
Bin noch Python Anfänger und hatte mich sehr gefreut dieses Script zu finden. Kann es auch nachvollziehen, aber leider nicht selber den Fehler finden.
Vielen Dank, dass @snafu das Script geschrieben hat.
Joshi
Wobei der Fehler ja nur sein kann, dass die Meta-Infos nicht immer existieren oder nicht immer erwartungsgemäß aufgebaut sind. Insofern probier doch da oben mal ein print(meta) und lass das Skript ein paar mal damit laufen.snafu hat geschrieben: Mittwoch 2. März 2022, 01:10 Nimm mal das try-except in der main()-Funktion raus, damit du den kompletten Traceback siehst. Vielleicht kann man dann mehr sagen.
EDIT:
Das Skript geht bei mir gar nicht mehr. Kriege den Hinweis, dass die aus dem Meta-Tag gezogene URL nicht existiert. Keine Ahnung, was da los ist.
Geht wieder, ich ziehe die URL jetzt von einer anderen Stelle. Kann auch sein, dass sie um diese Uhrzeit die Twitter-Infos noch nicht angepasst haben. Läuft jetzt jedenfalls mit dem tagesaktuellen Video bei mir.
Code: Alles auswählen
#!/usr/bin/env python3
from bs4 import BeautifulSoup
import json
from pathlib import Path
import requests
from urllib.parse import urlparse
TAGESSCHAU_URL = "https://www.tagesschau.de/100sekunden/"
DOWNLOAD_PATH = Path("~/Videos").expanduser()
def get_content(url):
response = requests.get(url)
response.raise_for_status()
return response.content
def get_video_url():
soup = BeautifulSoup(get_content(TAGESSCHAU_URL), "html.parser")
json_infos = soup.find("script", type="application/ld+json").text
return json.loads(json_infos)["contentUrl"]
def download_video(url):
filename = Path(urlparse(url).path).name
path = DOWNLOAD_PATH / filename
path.write_bytes(get_content(url))
return path
def main():
try:
print(f"Hole Video-URL von {TAGESSCHAU_URL} ...")
url = get_video_url()
print(f"Lade Video von {url} herunter ...")
path = download_video(url)
print(f"Video wurde gespeichert unter {path}")
except Exception as e:
print(f"Abbruch durch Fehler: {e}")
if __name__ == "__main__":
main()
-
- User
- Beiträge: 2
- Registriert: Sonntag 27. Februar 2022, 17:38
Vielen Dank, funktioniert hervorragend 
