Download von Bildern

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
rolgal_reloaded
User
Beiträge: 312
Registriert: Dienstag 24. Oktober 2006, 19:31

Hallo zusammen,

ich habe ein Problem, das mich veranlasst meine rudimentären Kenntnisse in Python aufzufrischen.
Da ich fürs Fotografieren mehr Talent habe als zum Programmieren, habe ich mich der Fotografie mehr gewidmet und über einige Jahre Bilder in einem Forum eingestellt.
Als sich dieses sehr geändert hat, habe ich meine Mitgliedschaft beendet und wurde gefragt, ob meine Bilder gespeichert bleiben sollen. Gott sei Dank war ich einverstanden :D Denn... ich habe durch einen Plattencrash einige Bilder verloren.
Also Admin angeschrieben, ob es eine Möglichkeit gäbe, dass ich wieder auf meine Bilder zugreifen könnte?
Dieser war so hilfsbereit und hat mir eine Excelliste mit IDs geschickt.
Eine ID wäre z. Bsp. "436454"
Der Link zu der Seite mit diesem Bild lautet:
https://fotografie.at/galerie/image/436454-

Die Liste hat insgesamt 500 IDs

Nun ist natürlich auch klar, was ich tun möchte. Diese Liste abarbeiten, jeweils das Bild runterladen und speichern.
Ich habe mir dazu schon Gedanken gemacht und so wie ich das sehe, gibt es wohl mehrere Möglichkeiten (Module) mit denen das gelöst werden könnte.

Im Idealfall wird mir in einem Ordner das Bild mit dem Titel gespeichert, dazu ein Zitat des Quellcodes einer Seite:

Code: Alles auswählen

<!DOCTYPE html>
<html dir="ltr" lang="de">

<head>
	<title>Alena - Galerie - fotografie.at</title>
	
	
		
	<base href="https://fotografie.at/galerie/" />
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="format-detection" content="telephone=no" />
<meta name="description" content="...

LG, Roland" />
<meta name="keywords" content="Fotografie, Fotograf, Model, Visagist, Workshop, Studio, fotografieren, Fotografen" />
<meta property="og:site_name" content="fotografie.at" />
<meta property="og:title" content="Alena | rolgal" />
<meta property="og:url" content="https://fotografie.at/galerie/image/436454-alena/" />
<meta property="og:type" content="website" />
<meta property="og:description" content="...

LG, Roland" />
<meta property="og:image" content="https://fotografie.at/galerie/userImages/64/436454-641e4f78.jpg" />
<meta property="og:image:width" content="1500" />
<meta property="og:image:height" content="1500" />
....

Code: Alles auswählen

<meta property="og:url" content="https://fotografie.at/galerie/image/436454-alena/" />
Könnte mir den Dateinamen für das Bild liefern, das abgespeichert werden soll.

Code: Alles auswählen

<meta property="og:image" content="https://fotografie.at/galerie/userImages/64/436454-641e4f78.jpg" /
Könnte mir den Link direkt zum Bild liefern, das heruntergeladen werden soll.

Für Tipps, z. Bsp. mit welchem Modul ich das angehen sollte und allen anderen hilfreichen Hinweisen wäre ich sehr dankbar,

Liebe Grüße Roland

@edit Für den Dateinamen des Bildes wäre vielleicht

Code: Alles auswählen

<title>Alena - Galerie - fotografie.at</title>
die bessere (einfachere) Wahl?
derElch
User
Beiträge: 33
Registriert: Sonntag 25. Februar 2018, 13:14

Hallo rolgal_reloaded,

Unter https://automatetheboringstuff.com/chapter11/
Wird weiter unten ein Beispiel gezeigt wie man Bilder automatisch runterlädt
BitteEinBit
User
Beiträge: 5
Registriert: Donnerstag 8. März 2018, 09:46

Ich hab das mal als Übung genommen.
So bekommst du die Links schon mal wenn deine Liste mit IDs so aussieht:

436454
436455
435456
......

Code: Alles auswählen

import re
import requests

TEXT =""
Links =[]
LISTE =""

Liste= "text.txt" # Liste mit den IDs


fList = open(Liste,"r")
for line in fList:
	LISTE = "https://fotografie.at/galerie/image/"+line.strip()+"-" # Den Link zusammensetzen
	Download = requests.get(LISTE).text # Herunterladen als txt-Datei
	Links = re.findall(r'content="https(.*?)" />', Download, re.S|re.I) #nach 'content="https' suchen
	for i in range(0,len(Links)):
		if "/userImages/" in Links[i]: # nur Bilder die im userImages Ordner sind anzeigen
			print "https"+Links[i]
fList.close()
Den Namen des Bildes müsste man mit re ebenso finden können.
narpfel
User
Beiträge: 643
Registriert: Freitag 20. Oktober 2017, 16:10

@BitteEinBit: Man kann HTML nicht mit RegEx parsen. Man kann aber einen HTML-Parser dafür nehmen, zum Beispiel, wie im Link von derElch gezeigt, BeautifulSoup oder `lxml`. Mit XPath kann man das sogar halbwegs kurz schreiben. Braucht allerdings eine gewisse Einarbeitung. Aber: RegEx braucht das auch, deshalb sollte man von Anfang an das richtige Werkzeug nehmen.

Zu deinem Code: Deine „Variablendeklarationen“ am Anfang machen gar nichts und können ersatzlos gestrichen werden. Außerdem sollten `GROẞBUCHSTABEN` für Konstanten genommen werden und nicht für Variablen. Die Variablennamen könnte man auch verbessern (z. B. `fList` → `lines`) oder ganz weglassen (`LISTE` könnte man direkt im `requests.get`-Aufruf zusammenbauen; und es ist noch nichtmal eine Liste).

Zum Öffnen von Dateien bietet sich das `with`-Statement an, damit wird die Datei in jedem Fall wieder geschlossen.

Eine Schleife nach dem Muster `for i in range(len(sequence))` ist ein Anti-Pattern, weil man in Python viel einfacher direkt über die Sequenz iterieren kann: `for item in sequence`.
BitteEinBit
User
Beiträge: 5
Registriert: Donnerstag 8. März 2018, 09:46

Danke, wieder was gelernt.
Aber dann zu dazu mal eine Frage:
Die HTML Seite wird mit
requests.get(url).text #TEXT?
geladen, ist das dann im Speicher trotzdem keine normale TXT-Datei?
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Eine Datei ist eine Datei, und im Speicher ist im Speicher. Ausnahmen wie mmap mal aussen vorgelassen. Insofern macht deine Frage keinen Sinn.

Was das text-Attribut beinhaltet ist ein Wert vom Typ "str", und wenn du den in eine Datei schreibst, dann ist das eine Textdatei, ja.
narpfel
User
Beiträge: 643
Registriert: Freitag 20. Oktober 2017, 16:10

@BitteEinBit: Die HTML-Datei ist Text, aber dieser Text ist in einem Format, das fundamental komplexer ist als alles, was man jemals mit regulären Ausdrücken beschreiben könnte. Das Stichwort, um das genauer nachzulesen, wäre „Chomsky-Hierarchie“.
BitteEinBit
User
Beiträge: 5
Registriert: Donnerstag 8. März 2018, 09:46

Danke @narpfel für die Hilfe das zu verstehen. Davon hatte ich noch nie gehört!
Ich programmiere rein aus Spaß, deshalb lege ich keinen Wert auf Form und Optimierungen. Wenn es für mich geht: OK - Fertig.
Kann ich optimieren/ändern wenn ich mehr gelernt habe.

Naja, hier steht nun ein Weg wie man es NICHT machen sollte..... :lol:

Ich ändere an meinem ersten Post trotzdem nichts, sonst macht die Diskussion keinen Sinn.
narpfel
User
Beiträge: 643
Registriert: Freitag 20. Oktober 2017, 16:10

@BitteEinBit: Ich finde, man sollte immer Wert auf Form und Codequalität legen. Dadurch wird man über die Zeit zu einem besseren Programmierer, auch wenn man das „nur“ hobbymäßig macht. :wink:
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Hier geht es ja nicht um Form, sondern darum, dass Reguläre Ausdrücke hier nur für genau dieses Muster funktionieren und leichte Abweichungen zu falschen Ergebnissen führen. Fehlerhafte Programme zu korrigieren, hat nichts mit Optimierung zu tun.
BitteEinBit
User
Beiträge: 5
Registriert: Donnerstag 8. März 2018, 09:46

Ok, Danke euch allen, aber wer ausser mir hat nun dem Fragensteller geholfen?
Ja, mein Stil ist Mist/schlecht, da sind wir uns ja alle einig. Es Funktioniert aber :mrgreen:

Keiner hat den Code korrigiert oder optimiert....
Alle haben nur geschimpft wie schlecht er ist....
narpfel
User
Beiträge: 643
Registriert: Freitag 20. Oktober 2017, 16:10

@BitteEinBit: der Elch hat hat einen recht ausführlichen Link gepostet und rolgal_reloaded hat sich seit dem nicht mehr gemeldet. Das lässt drei Schlüsse zu: 1.: Der TO hat sein Problem gelöst. 2.: Der TO liest immer noch den Link von derElch. 3.: Der TO hatte noch keine Zeit, auf derElch oder dich einzugehen. Aus meiner Sicht müsste der TO sich also nochmal melden, wenn er noch Hilfe braucht.

Außerdem: Die Verbesserungsvorschläge nützen ja nicht nur dir. Und ich habe zusätzlich noch `lxml` und XPath in den Raum geworfen.

Edit: Wir haben nicht geschimpft, sondern konstruktive Verbesserungsvorschläge gegeben. Und die Kritik am Code ist natürlich auch nicht persönlich gemeint. :wink:
rolgal_reloaded
User
Beiträge: 312
Registriert: Dienstag 24. Oktober 2006, 19:31

Vielen Dank für eure Beiträge, ich bin da noch nicht durch, wie aber vermutet gibt es mehrere Möglichkeiten, ... leider werde ich - hoffentlich - erst am Wochenende Zeit haben, auch mal konkret etwas auszuprobieren. LG Roland
rolgal_reloaded
User
Beiträge: 312
Registriert: Dienstag 24. Oktober 2006, 19:31

Blöde Frage von mir konnte ich selbst beantworten :D
Antworten