Pic Download / Regex Problem

HazelNut

Mitglied
Hey, ich wollte einen kleinen Picture Downloader schreiben und hätte dazu ein paar algemeine Fragen bzw Probleme.


Ablauf:
Gebe Seitenlink ein
Suche im Source nach der jpg
Lade Bild in ein BufferedImage
Überprüfe ob es einen nachfolgendes Bild gibt (im Source)
Wenn letzes Bild erreicht -> gehe zum nächsten Chapter
Ende
Sehr schwer 😉

Dazu würde mich interessieren wie es dabei mit der Auslastung aussieht?
Sollte ich dazwischen ein paar sleeps machen oder nicht?
Oder gar mit Threads arbeiten?
Also am Anfang checken ob das Buch mehr als 1 chapter hat, wenn ja dann kann das nächste Kapitel in einem eigenen Thread ausgeführt werden.


Zum Problem:
Der Sourcecode ist soweit ich bisher gesehen habe, egal bei welchem Buch, immer der gleiche.

Leider findet mein Pattern das Bild nicht.

Zu durchsuchender String: <div id="imgholder"><a href="/buch-name/chapter/seite"><img id="img" width="800" height="1142" src="urlZumBild.jpg" alt="" name="img" /></a> </div>

urlZumBild möchte ich logischerweise haben.

Pattern: "<div id=\"imgholder\"><a href=\"/.+?/\\d+/\\d+\"><img id=\"img\" width=\"\\d+\" height=\"\\d+\" src=\"(.+)\" alt"

Mit RegexBuddy matche ich damit immer den ganzen String bis zum alt.
Leider habe ich jetzt seit einem Jahr nichts mehr mit Regexes gemacht und noch nie in Java.
Habe mich zwar eingelesen haber irgendwas passt da einfach nicht....
Und nein, einfach nach href oder jpg kann ich nicht abfragen.

Java:
Pattern regex = Pattern.compile("<div id=\"imgholder\"><a href=\"/.+?/\\d+/\\d+\"><img id=\"img\" width=\"\\d+\" height=\"\\d+\" src=\"(.+)\" alt");
	Matcher regexMatcher = regex.matcher(s);
	if (regexMatcher.find()) {
		ResultString = regexMatcher.group();

Wäre über eine Erklärung erfreut, da mich die Tutorials irgendwie nicht weiter bringen.... 😳
 
fange langsam an:
kürze den 'Zu durchsuchender String:' auf <div id="imgholder">

und das Pattern auf: "<div id=\"imgholder\">"

funktioniert? dann als nächstes das a href rein usw., für den Link darin zunächst /.+ testen, dann das kompliziertere

wenn irgendwann ein Fehler kommt, und Denken wirklich nicht weiter geht, dann poste wie weit es geht mit welchem Pattern
und ab welchem Schritt es nicht geht mit welchem Versuch
 
Ich würde das als statemachine abhandeln.

suche nach /buch-name/chapter/seite
wenn gefunden nach src="
wenn gefunden nach " alt="
zwischen den letzten beiden ist dann dein bild
 
Lol, hab dann daran einfach nochmal rumgespielt und group(1) gemacht und auf einmal gings, obwohl ich es zuvor schon hatte ....

suche nach /buch-name/chapter/seite

Hmm verstehe nicht ganz was du genau meinst.


Aber hätte da nochn anderes Problem 🙂
Uhh sogar bei der gleichen Methode.

Habe jetzt leider bemerkt, dass die neuesten Chapter wohl wo anders abgespeichert werden, aber das ist ja auch nicht das Problem.
Das Problem ist, dass dabei bei den neuen auch der source verändert wurde.

Zu suchender String:
Code:
<div id="imgholder"><div id="zoomer" class="zoomimg zoomtop">+ Larger Image</div>
<a href="/name/chap/site"><img id="img" width="800" height="553" src="urlZumBild" alt="" name="img" /></a> <div class="zoomimg zoombottom">+ Larger Image</div>
</div>
Okay hat sich auch erledigt, geht aus irgendeinem Grund auf einmal.


Interessieren würde mich wenn ich mein Programm so erweitern will, das ich von weiteren Seiten Bücher laden kann.
Wie wäre so etwas zu realisieren?
Checken um welche site es sich handelt und dann die Methoden dementsprechend aufrufen ist klar.
Aber das kann doch nicht die einzige Möglichkeit sein?

Zb auf der zweiten Seite stehen alle nachfolgenden Links direkt komplett im Sourcecode und bei der jetzigen steht nicht mehr als ein verweis auf das nächste pic.
Und um die Bilder rauszusuchen muss ich ja nur konditionelles regex verwenden aber das wird dann ja auch ziemlich unschön und relativ undynamisch.

mfg
 
Intelligenz in Computern ist ein ehrvolles Ziel, vielleicht schaffst du es als erster, dann musst du nicht mehr viel tun

ansonsten ist 'Undynamik', mühevolle Einzellösungen usw. der Kern der Programmierung,
besonders von einem System gegenüber anderen, leider
 
Zuletzt bearbeitet von einem Moderator:
Okay mich hätte nur interessiert was einfacher wäre alles in konditionelle Regexe zu packen oder für jede Seite fast schon eine eigene Klasse.

Anyway:
Programm funktioniert soweit.
Wollte jetzt noch eine GUI dazu machen und habe da ein kleines static PRoblem 🙂 (Habe das FAQ bereits durchgelesen)

Habe eben 2 Klassen, GUI und FileDownload
In der Main wird die GUI initialisiert und nachdem man auf nen Start Button drückt wird ein FileDownload Objekt angelegt.
Damit ich eine debug Ausgabe habe, habe ich bei der GUI eine Area.

Java:
public class ImageDownloader {
static DownloadGUI gui;

 public static void  createDownloadGUI(){
          gui = new DownloadGUI();
     }

 public static void main(String[] args) throws IOException, Exception {
        createDownloadGUI();
        //DownloadGUI gui = new DownloadGUI();
        gui.setVisible(true);

Ist das ne schöne Lösung oder nicht?
Außerdem, wie könnte ich es so verwenden wie ich im auskommentierten Teil stehen habe?
Anstatt createDownloadGUI(),
ImgaeDownloader benötigt eine Instanz von DownloadGUI.
Bzw, gibt es auch ne Möglichkeit die Membervariable non static zu machen ?


Zu Threads:
Ich sehe das, das Programm läuft, jedoch bekomme ich keine Ausgaben in meine Area, obwohl doch welche erstellt werden sollten (wird in ImageDownloader aufgerufen). Da das Programm doch sowieso abläuft dürfte doch zumindest in der Zeit in der ich meine debugMethode aufrufe der EDT nicht mehr geblockt sein?


Wenn ich jetzt für ImageDownloader das Interface Runnable implementiere und dann bei dem Start Button aufrufe müsste es doch so aussehen:

new Thread(down).start();

Die gesamte Logik läuft dann in der run() Methode ab, gibt es denn eine Möglichkeit nicht die run zu verwenden sondern eine andere?
Wie kann ich den ImageDownloader Thread automatisch stoppen, wenn das Ende des Buches erreicht ist?
Er soll innerhalb von ImageDownloader gestoppt werden, finde dafür jedoch keine Möglichkeit.

Wenn ich den Thread per GUI unterbrechen möchte, ist
new Thread(down).suspend();
korrekt?
 
eine andere Methode als run für Thread ist so wie eine andere Methode als main für ein Programm,
du kannst Untermethoden usw. aufrufen, aber den Start, die eine Methode in der alles beginnt, die ist nicht zu ändern

> new Thread(down).suspend();
das wäre zum einen ein neues Thread-Objekt, noch nichmal als Thread gestartet, du willst aber sicherlich irgendwas,
was zu diesem Zeitpunkt schon lange da ist

in
Thread (Java 2 Platform SE 5.0)
kannst du ne Menge Kommentare, Nicht-Empfehlungen zu Thread-Methoden lesen,
im Internet finden sich gewiss viele Themen dazu

mein Kurzhinweis: ein Thread ist quasi nicht von außen reinzureden, setze boolean-Informationen,
und der Thread schaut selber ab und zu nach und unterbricht vielleicht aus eigenem Antrieb seine Arbeit

> Wie kann ich den ImageDownloader Thread automatisch stoppen, wenn das Ende des Buches erreicht ist?

von außen gilt für Stoppen etwa dasselbe wie für suspend, von innen ist ein Thread zu Ende, wenn die run-Methode fertig bearbeitet ist,
aus Endlos-Schleifen mit return oder Schleifenbedingung raus,
allgemein etwas unsauber aber effektiv, falls viele verschachtelte Methoden abzubrechen sind: RuntimeException
 
Zuletzt bearbeitet von einem Moderator:
Ähh ja das mit Threads habe ich schon gelesen, aber ich dachte, das es doch relativ egal wäre bei einem Projekt mit 500 Zeilen 🙂

Aonsonsten könnte ich doch in die run() zwei whiles machen bei der die äußere immer true ist und die innere eben je nachdem ob ich auf pause drücke oder nicht.
Meine Frage mit suspend bezog sich auch genau auf das dann ja wieder ein neuer Thread erstellt wird.
Aber irgendwie kann ich diesem Trhead keinen Namen setzen bzw abfragen, dass geht dann wohl nur wenn ich von der Superklasse Thread ableite und nicht von Runnable?

Wie kann ich den ImageDownloader Thread automatisch stoppen, wenn das Ende des Buches erreicht ist?
Hmm was ich mir bei der Frage gedacht habe fällt mir gerade gar nicht ein, was du geschrieben hast ist mir klar, hmmmm


Okay, eigentlich ist soweit alles klar, nur das Problem mit static würde mich wirklich noch interessieren, warum funktioniert das wenn ich es in eine Methode auslagere aber nicht wenn ich es direkt in der main schreibe? Ich habe das jetzt immer so gemacht ohne darüber nachzudenken.
 

Neue Themen


Zurück
Oben