Du bist nicht eingeloggt.

Login

Pass

Registrieren

Community
Szene & News
Locations
Impressum

Forum / Bits und Bytes

Bild von Website per Skript herunterladen

  -1- -2- vorwärts >>>  
Inception_ - 31
Profi (offline)

Dabei seit 05.2009
621 Beiträge

Geschrieben am: 22.06.2020 um 21:46 Uhr
Zuletzt editiert am: 22.06.2020 um 21:47 Uhr

Hi Com,

wie gehe ich das folgende Problem am besten an.

Ich möchte von einer Website in regelmäßigen Abständen (z. B. alle 60 Minuten) ein Bild herunterladen. Das ganze soll automatisiert vonstattengehen.

Nehmen wir als Beispiel diese Wetterseite:
https://kachelmannwetter.com/de/analyse/signifikantes-wetter.html

Die Wetterkarte lässt sich per Klick auf das Kästchen rechts oben in der Wetterkarte mit "Speichern untern..." herunterladen. Wie kann ich das jedoch automatisieren?

Science, 128√e980 .. :*

AFRO95 - 28
Profi (offline)

Dabei seit 01.2008
492 Beiträge
Geschrieben am: 22.06.2020 um 23:51 Uhr

Hab damals mit autohotkey ganz lustige sachen programmiert. und auch das sollte kein problem sein

www.gidf.de

weylen
Experte (offline)

Dabei seit 10.2008
1940 Beiträge
Geschrieben am: 16.07.2020 um 20:51 Uhr
Zuletzt editiert am: 16.07.2020 um 21:05 Uhr

ich weiß nicht wie weit du schon gekommen bist und wie sehr du dich auskennst mit programmieren. Das macht es etwas schwierig eine sinnvolle und hilfreiche Antwort zu formulieren :D

Meiner Intuition ist es mit einem Python skript am einfachsten. Das kann man dann entweder mit einem Screen irgendwo im Hintergrund laufen lassen oder per Daemon.

Wenn sich die URL des Bildes nicht ändern sollte, könntest du dir mal hier die zweite Antwort ansehen. Mit der requests library sind das tatsächlich nur ein paar Zeilen.

Sollte sich die URL in bestimmten abschnitten ändern, dann müsste man gegebenenfalls erst den Quelltext ziehen und daraus entsprechen ddie image URL raussuchen und diese dann nochmal anfragen. Unter Python string zu prozessieren ist absolut entspannt. Und das Anfragen des Quelltextes geht auch mit requests absolut problemlos.

Edit: Hab mir erst jetzt die von dir aufgeführt Website angesehen. Die Karte dort ist jetzt nicht der einfachste Fall der einem so begegnet :-D Die setzt sich auf der Website zusammen aus mehreren Bildern und die werden auch ständig neu generiert nach Interaktion. Geht auch mit requests, aber das ist dann schon advanced, da weiß ich auch nicht wie das geht.
Wenn du im Firefox F12 drückst öffnet sich das Entwicklerfenster. Dann geh auf den Reiter "Netwerkanalyse", klick auf den Knopf oben rechts im eck von der Karete und schau dir den ersten Eintrag an der in dem Fenster unten erscheint (nachdem du das Dialogfenster für den Download geschlossen hast). Rechtsklick darauf > koprieren > "Als Curl adresse kopieren".
Sieht dann etwa so aus:
'''
curl 'https://img3.kachelmannwetter.com/images/data/cache/analyse/download_analyse-de-310-1_modmesoshd_202007161845_45_155.png' <ganz viel weiteres zeug was die TU seite zerstört>
'''

Wenn du den Befehl noch erweiterst um '--output <filename>' und das in die Konsole pastest, dann passiert genau das was du willst.
Jetzt musst du das noch automatisieren, zb wieder mit python. Da kann man auch Curl befehle aufrufen und den dateinamen zu speichern änderst du halt jedes mal. Aber da weiß ich auch nicht mehr auswendig wie das am besten mit curl Python geht. Wenn du dicha uskennst geht das so auch einfach als bash-skript.

Dummheit schützt nicht vor Verantwortung.

lilibeth20 - 39
Fortgeschrittener (offline)

Dabei seit 11.2016
85 Beiträge

Geschrieben am: 18.07.2020 um 02:59 Uhr
Zuletzt editiert am: 08.02.2021 um 00:34 Uhr

Dazu braucht man keinen Script sondern nur inspect element.
Da bekommst du so gut wie alle URLS raus.

Hab mal ne Zeitlang bei https://findimodo.de gearbeitet. Unkonventionell, aber gute Unterstützung für Firmen im gesamten Bundesgebiet.
Inception_ - 31
Profi (offline)

Dabei seit 05.2009
621 Beiträge

Geschrieben am: 23.07.2020 um 18:58 Uhr

Danke für eure Antworten!

Programmieren sollte keine Hürde sein. Ich habe zwar bisher meist C und C++ programmiert, aber das sollte reichen.

Ich gehe die Vorschläge mal durch ...

Science, 128√e980 .. :*

Inception_ - 31
Profi (offline)

Dabei seit 05.2009
621 Beiträge

Geschrieben am: 23.07.2020 um 19:12 Uhr
Zuletzt editiert am: 23.07.2020 um 19:17 Uhr

cURL scheint ein Linux Befehl zu sein. Ich habe aber etwas gefunden, womit man cURL auch unter Windows nutzen kann. Dann schreibe ich in die Windows Konsole

C:\curl "https://www.google.de/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png" --output test.png

um das Google Logo von google.de herunterzuladen. In der Konsole erscheint jedoch die Meldung [verlinkte Grafik wurde nicht gefunden]

Die Website aus der Meldung ist: https://curl.haxx.se/docs/sslcerts.html

Gehe ich den von weylen beschriebenen Weg (F12, Netzwerkanalyse, ...) statt den direkten Bildlink zu verwenden, passiert das gleiche.

Science, 128√e980 .. :*

weylen
Experte (offline)

Dabei seit 10.2008
1940 Beiträge
Geschrieben am: 24.07.2020 um 17:27 Uhr

Das ist merkwürdig :saeufer:
Du hast wohl recht dass Curl eigentlich eher zu Linux gehört, aber ich bin überrascht dass die Windows Adaption bereits bei solch scheinbar simplen Anfragen schon Probleme macht :-D
Der Befehl für das Google image hat bei mir (unter Linux) genau so funktioniert wie du ihn gepostet hast.

Ich würde dir gerne noch weiter helfen, aber das ist nicht so einfach wenn nicht ganz klar ist worum es genau geht und mit welcher Programmiersprache und in welchem Umfang du das umsetzten möchtest 8-)
Wie du schon merkst macht es einen Unterschied ob das Bild statisch ist oder auf Interaktion hin generiert und bereitgestellt wird. Wenn du Windows nutzt sollte auch bekannt sein, was du zur entsprechenden Programmiersprache noch für Bibliotheken zur Verfügung hast.


Hier als bonus feature die Anfrage für das Google-Logo in python. Vllt kannst du das ja so ausführen:

Zitat:


import shutil
import requests

url = 'https://www.google.de/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png'
response = requests.get(url, stream=True)
with open('testimg.png', 'wb') as out_file:
shutil.copyfileobj(response.raw, out_file)
del response


Dummheit schützt nicht vor Verantwortung.

Inception_ - 31
Profi (offline)

Dabei seit 05.2009
621 Beiträge

Geschrieben am: 24.07.2020 um 22:13 Uhr
Zuletzt editiert am: 24.07.2020 um 22:38 Uhr

Danke weylen. Das Skript funktioniert :)
Wende ich es aber auf den Bildlink: https://img3.kachelmannwetter.com/images/data/cache/obs/download_obs-de-310-1_2020_07_24_20_00_2_1.png?425716135507846000

an, kann Windows das heruntergeladene Bild nicht öffnen: "Das Bild kann in der Windows-Fotoanzeige nicht geöffnet werden, da die Datei möglicherweise beschädigt oder zu groß ist.".

Kann es sein, dass die Seite das irgendwie unterbindet? Bei Google ging es ja und ein Beispielbild von der TU Startseite funktioniert auch. :gruebler:

___

Zum Hintergrund meiner Frage. Es geht speziell um die Wetterseite im Eingangspost. Für genaue Analysen möchte ich automatisiert Wetterkarten herunterladen. Mir geht es dabei aber nicht nur um ein oder zwei Karten, sondern um eine ganze Fülle an Karten. Ein Auszug:

* Satellitenbilder
* Radardaten
* Radarvorhersagen
* Regenmengen (kalibriert, unkalibriert)
* Wettervorhersagen unterschiedlicher Wettermodelle (>8)
* CAPE (Unwetterparameter)
* CIN
* Ensemble-Berechnungen von Wettermodellen
* ...

Das möchte ich automatisiert herunterladen, um z. B. Analysen darüber zu machen, wie stabil Wettervorhersagen sind, welche Modelle bei welcher Wetterlagen wie gut rechnen und vieles mehr.
Da z. B. alle paar Minuten neue Radarbilder erzeugt werden oder sich Modellrechnungen aktualisieren, möchte ich die Daten (Wetterkarten) automatisiert herunterladen.

Nicht zuletzt möchte ich die aktuellen Vorhersagen immer parat haben, um sie z. B. auf einem Bildschirm im Wohnzimmer 24/7 -- immer aktuell -- anzuzeigen.

Science, 128√e980 .. :*

weylen
Experte (offline)

Dabei seit 10.2008
1940 Beiträge
Geschrieben am: 25.07.2020 um 09:34 Uhr
Zuletzt editiert am: 25.07.2020 um 09:43 Uhr

Ja nice, das klingt spannend :-D
Da hast du aber noch ein ziemliches Paket vor Dir. Kann Dir nur ans Herz legen, mal den einen oder anderen Blog über Data-Mining zu lesen (nützliche Info bezüglich Datentypen und Datenbanken etc.). Ich denke Python ist da schon eine ganz gute Wahl, weil es einfach sehr viel bereits gibt und sich Bibliotheken sehr einfach installieren lassen. Auch wenn es darum geht, die Daten zu sortieren und aufzubereiten, bietet Python die besten Möglichkeiten (d.h. Unmengen an Schnittstellen zu unterschiedlichen Datenbanken, die sich einfach bedienen lassen; Pfade und Dateien lassen sich einfach bearbeiten; plotten mit großen Datenmengen auch gut möglich; Pakete wie scipy haben etliche Methoden für die Analyse bereits implementiert; wenn es mal an machine learning Anwendungen gehen sollte, gibt es die auch zu genüge). Geht auch alles mit C und vermutlich effizienter aber ist sicher etwas mehr Aufwand, selbst wenn man sich mit C gut auskennt.

Was diese Wetterseite angeht ist jetzt genau dieser Punkt mit den dynamischen Material. Wenn man diesen Button für den Export (z.B. Download/"Speichern unter") betätigt, wird von dem Server das Bild generiert und bereitgestellt. Das was auf der Website angezeigt wird ist kein einzelnes PNG, sondern mehrere übereinander die dann noch mit JS-Skript interaktiv werden. Deshalb kann man auf der Karte auch nicht Rechtsklick > Grafik anzeigen das PNG so anzeigen lassen. Mit dem Button kann man dann den Server anfragen, das Bild zu rendern und zum Download bereitzustellen. Das lässt sich auch mit einem Skript ausführen, aber dazu muss man noch mehr parameter mitgeben (das sind diese ganze -H optionen in der curl Adresse).
Zum Glück hat sich damit schonmal jemand beschäftigt :zputzer: Unter diesem Link kannst du die Curl-Adresse in die Syntax von python request konvertieren lassen (Ergebnis ist quasi selbsterklärend, aber wäre da jetzt auch nicht gleich drauf gekommen).
Damit bekommst du in dem Objekt 'response' die PNG daten. Ergänze das Skript um

Zitat:

with open('imagefilename.png', 'wb') as out_file:
out_file.write(responste.content)
(und ggf.: del response)

und erhalte das gewünschte Ergebnis :daumenhoch:
Bei mir hat da vorhin mal der Kopierschutz von Kachelmannwetter angeschlagen und mir eine Art Screen-Saver zur Verfügung gestellt. Ich schätze sowas passiert wenn man Coockie signaturen mitgibt, die dem Client nicht mehr zu Verfügung stehen (gelöscht oder überschrieben). Bei mir hat das Skript auch funktioniert ohne die ganzen Coockies, also ist glaub besser die einfach weg zu lassen :-D Ohne die Header passiert genau das was du auch schon festgestellt hast: Korrumpiertes Datenmaterial

Wenn dich konkret die Inhalte interssieren, sind die vermutlich besser in Zahlen ausgedrückt als in Bildern. Bestimmt kann man bei Kachelmannwetter auch die API abfragen und die Zahlen bekommen, die dort in ein Bild mit lustigen Farben konvertiert werden, aber ich denke dass man die Zahlen auch irgendwo auf Open Source Basis bekommt. Zb. beim DWD. Letzte Aktualisierung vor zwei Stunden, also weiß jetzt auch auf der Stelle nicht wie genau das ist


Dummheit schützt nicht vor Verantwortung.

Inception_ - 31
Profi (offline)

Dabei seit 05.2009
621 Beiträge

Geschrieben am: 14.08.2020 um 20:29 Uhr

Ich antworte bald mal darauf. Danke schon mal für diesen Post!

Science, 128√e980 .. :*

Inception_ - 31
Profi (offline)

Dabei seit 05.2009
621 Beiträge

Geschrieben am: 29.08.2020 um 23:29 Uhr
Zuletzt editiert am: 30.08.2020 um 02:33 Uhr

Hi :)

edit: Leider kommt nach einer Weile aber der Screensaver, den du auch schon bemerkt hast. Liegt das an den Cookies?

Es hat geklappt :rocker:
Hammer, danke :)

Der Vollständigkeit halber der ganze Code:

Zitat:

import shutil
import requests

#url = 'https://www.google.de/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png'
#response = requests.get(url, stream=True)




import requests

cookies = {
'__cfduid': 'dcd03a4770a7f4811f4b678f7654770c81598736165',
'_csrf_image': '4e090de9a90ee450a8752930d6959b4d2a9794942308b1be3b05feb381044071a%3A2%3A%7Bi%3A0%3Bs%3A11%3A%22_csrf_image%22%3Bi%3A1%3Bs%3A40%3A%22d8225a25fdca0704a9718ecbd9a6118401db4e66%22%3B%7D',
}

headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:78.0) Gecko/20100101 Firefox/78.0',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'Accept-Language': 'de,en-US;q=0.7,en;q=0.3',
'DNT': '1',
'Connection': 'keep-alive',
'Referer': 'https://kachelmannwetter.com/',
'Upgrade-Insecure-Requests': '1',
'TE': 'Trailers',
}

response = requests.get('https://img4.kachelmannwetter.com/images/data/cache/px250/download_px250-de-310-1_2020_07_28_2_2015.png', cookies=cookies, headers=headers)

with open('testimg.png', 'wb') as out_file:
shutil.copyfileobj(response.raw, out_file)
out_file.write(response.content)
del response


Wenn man es automatisieren möchte, muss man das Ende des Bildlinks

Zitat:

[...]_2020_07_28_2_2015.png

ändern. Man kann dann z. B. die Daten eines anderen Monats (z. B. Juni) zum gleichen Zeitpunkt abfragen:

Zitat:

[...]_2020_06_28_2_2015.png


Science, 128√e980 .. :*

Inception_ - 31
Profi (offline)

Dabei seit 05.2009
621 Beiträge

Geschrieben am: 30.08.2020 um 00:06 Uhr
Zuletzt editiert am: 30.08.2020 um 01:23 Uhr

Die von dir, weylen, vorgeschlagene Alternative über die Rohdaten zu gehen, z. B. vom DWD, ist nicht ganz befriedigend. Ich hatte da schon mal Daten heruntergeladen, allerdings haben sie ein spezielles Datenformat, dass nur extra Software lesen kann. Und da ist der Automatismus dann auch wieder weg. Ich müsste nochmal nachsehen, ob es da einen Python Interpreter gibt, glaube ich aber nicht.

Außerdem haben eigentlich alle Wetterseiten das Problem, dass sie meist nur Daten von einem Modell darstellen. Für genaue Wetterprognosen muss man aber immer auch die Daten unterschiedlicher Modelle und auch unterschiedlicher Läufe eines Modells betrachten. Das bietet Kachelmannwetter.com so schön an und deswegen sind die Charts so wertvoll. Rohdaten wären natürlich grandios, aber wohl ohne hohe Kosten nicht möglich. kachelmannwetter.com kauft diese Daten schließlich auch ein, nicht umsonst ist die Website zugekleistert mit Werbebannern wo es nur geht.

Vielleicht muss ich aber akzeptieren, dass es über APIs besser geht. Da habe ich gerade diese Website gefunden: rapidapi.com. Darunter ist openWeatherMap ganz interessant. Muss ich die Tage mal genauer studieren.

edit:
1./ openWeatherMap nutzt wohl die Globalmodelle GFS und das kanadische Modell. Zumindest mal ein Anfang. Ich überlege, ob ich mir einfach selbst so eine Karte bastele. An die Rohdaten komme ich über die Seite ja ran. Jetzt muss ich noch lernen, eine 2D Deutschlandkarte in Python zu erstellen.

2./ Warum lade ich nicht einfach die einzelnen Bilder herunter und multipliziere sie manuell mit Python?
https://stackoverflow.com/questions/24053411/how-to-multiply-one-image-to-another-in-python

Science, 128√e980 .. :*

Inception_ - 31
Profi (offline)

Dabei seit 05.2009
621 Beiträge

Geschrieben am: 30.08.2020 um 02:27 Uhr
Zuletzt editiert am: 30.08.2020 um 02:33 Uhr

Eine Stunde später habe ich es hinbekommen. Man kann zwei Bilder multiplizieren mit

Zitat:

from PIL import Image

# merge radar data with map
img1 = Image.open('data.png').convert('RGBA')
img2 = Image.open('map2.png').convert('RGBA')

img1 = Image.composite(img2, img1, img2)
img1.save('out.png')


Der Schlüssel lag in convert('RGBA'). Ohne das sind die Ortsnamen auf der Karte nicht mehr lesbar und die Linien werden bunt und verpixelt.

Jetzt muss ich nur noch das Problem lösen, warum bei einer Änderung

Zitat:

[...]_2020_07_28_2_2015.png

nach

Zitat:

[...]_2020_06_28_2_2015.png

der Screensaver kommt.

Science, 128√e980 .. :*

MatzeBaur - 35
Halbprofi (offline)

Dabei seit 02.2011
148 Beiträge
Geschrieben am: 30.08.2020 um 20:31 Uhr

Nicht schlecht, sehe es grade zufällig ;)
Ziemlich cool was du da machst :daumenhoch:
weylen
Experte (offline)

Dabei seit 10.2008
1940 Beiträge
Geschrieben am: 02.09.2020 um 14:56 Uhr
Zuletzt editiert am: 09.09.2020 um 11:01 Uhr

Jo also wenn du unterschiedliche Bilder hast, welche das Modell für einen bestimmten Kartenausschnitt darstellen, sollte es kein Problem sein, den entsprechenden Kartenausschnitt dann auf dem Bild noch darunter zu legen :daumenhoch: Hoffe ich habe so richtig verstanden, was der Plan bei dir war.
Aus Rohdaten Bilder zu generieren ist im Vergleich einfacher als aus Bildern auf Rohdaten zu schließen (die man zwangsweise benötigt wenn man selber noch etwas berechnen möchte). Deshalb hatte ich eben vorgeschlagen vllt den Weg über die API zu gehen, aber das musst du dann halt abwägen :gruebler:

Was den Screensaver angeht weiß ich leider auch nicht so genau Bescheid. Die URL beinhaltet das Datum und die Uhrzeit, wie du schon richtig gesehen hast. Auf Anfragen zu Daten/Bildern aus vergangener Zeit antwortet der Server mit Fehlercode 403 ('forbidden', resultiert in diesem Dummy image). Das ist einfach dort in der Software so hinterlegt, dass man nur die Daten vom selben Tag oder einen Tag in der Vergangenheit bekommt, das kann man meines Wissens nicht einfach umgehen. Ist also wohl doch keine Frage der Cookies wie ich zuerst angenommen habe. Wenn man das Datum entsprechend immer auf den heutigen Tag anpasst, dann sollte das dennoch funktionieren. So war es zumindest bei mir. Allerdings wundert es mich, dass man auf dem Link den du im Anfangspost enthalten hast auch Daten von gestern (also 02.09.2020) abfragen kann, mit dem Skript erhält man jedoch wieder Error 403.
Update: Wenn man am Browser das anfragt und dann erst im Skript die URL ändert, funktioniert es. Ansonsten nicht. Also leider echt keine Ahnung worauf man achten muss.
Ich bin hier dann auch schon am Ende mit meinem Latein :-D Bin leider kein Webentwickler und kenne mich auch mit Datamining nur oberflächlich aus.

Dummheit schützt nicht vor Verantwortung.

Inception_ - 31
Profi (offline)

Dabei seit 05.2009
621 Beiträge

Geschrieben am: 08.11.2020 um 01:57 Uhr
Zuletzt editiert am: 08.11.2020 um 03:22 Uhr

Ich wusste nicht, dass es für diese Art von Problem den Begriff bzw. die Lösung "Web Scraping" gibt.
Ich arbeite gerade mit Python und versuche die Methoden zu lernen. Ich habe es nun z. B. geschafft, die untere Tabelle "Börsenplätze MICROSOFT" automatisiert über Python auszulesen. Es klappt nun auch, Twitter Follower von beliebigen Profilen auszulesen.
Die ersten Schritte sind also gemacht, jetzt aber: Gibt es gute Nachschlagewerke, Tutorials, Anleitungen, etc., die mehr in die Tiefe gehen? Kennt jemand gute Quellen?

Science, 128√e980 .. :*

  -1- -2- vorwärts >>>
 

Forum / Bits und Bytes

(c) 1999 - 2024 team-ulm.de - all rights reserved - hosted by ibTEC Team-Ulm

- Presse - Blog - Historie - Partner - Nutzungsbedingungen - Datenschutzerklärung - Jugendschutz -