[gelöst] PHP-Seite auslesen, speichern und bearbeiten?

Alles rund um die Programmierung mit Qt
Antworten
Notwist
Beiträge: 85
Registriert: 2. März 2005 14:24

[gelöst] PHP-Seite auslesen, speichern und bearbeiten?

Beitrag von Notwist »

Hallo,

habe ein kleines Problem. Wollte ein kleines Tool schreiben, dass diverse URLs eines Anbieters in unterschiedlichen Ländern ansurft, die Seite für einen entsprechenden Artikel lokal abspeichert, so dass ich aus dem HTML-Code die Preise auslesen kann und so den günstigsten raussuchen kann. Folgenden Code habe ich:

Code: Alles auswählen

void MainWindow::submitSlot()
{
	QString nr, fileName, iString;
	QString url[3];
	connect(&http, SIGNAL(requestFinished(int, bool)), this, SLOT(requestFinishedSlot(int, bool))); 
	nr=this->artNrLineEdit->text();
	nr="/xxxx.php?product_code="+nr;
	url[0]="www.xxxx.net";
	url[1]="www.xxxx.com";
	url[2]="www.xxxx.nl";
	for (int i=0; i<=2; i++)
	{
		fileName="source"+iString.setNum(i)+".txt";
		getSource(url[i], fileName, nr);
	}
} 

void MainWindow::getSource( QString url, QString fileN, QString nrString )
{
	file.setName(fileN); 
	if (!file.open(IO_WriteOnly )) 
	{ 
		return; 
	} 
	int id1 = http.setHost(url, 80);
	int id2 = http.get(nrString, &file);
	file.close();
}

void MainWindow::requestFinishedSlot( int id, bool error ) 
{ 
   http.closeConnection(); 
   //http.abort();
}
Erstmal scheint er, nicht wie gewünscht, für jeden Source-Code ein einzelnes File anzulegen (Anlegen schon, aber nicht füllen), sondern füllt das letzte File mit den 3 Source-Codes und auch erst, wenn er zum Hauptfenster zurückgekehrt ist. Wenn ich das Schritt für Schritt mache, bleibt es nach dem Rausspringen aus den Funktionen leer. Auch scheint er das SIGNAL requestFinished garnicht zu bekommen. Springt im Debugger nicht rein und habe da sonst auch mal http.abort(); reingeschrieben, so dass er die HTML-Seiten dann ja nicht mehr weiterladen würde.
Im Moment läuft es so: Ich tippe sozusagen auf SUBMIT und auf der Platte füllt sich das letzte File langsam mit Inhalt. Ich bräuchte natürlich auch irgendwie einen Handler, der so lange mit der Weiterführung wartet, bis ich weiss, dass jedes File fertig heruntergeladen wurde bzw. ein Timeout gekommen wäre. Muss nicht perfekt sein, ist ja mehr zum Eigengebrauch. Kann mir jemand einen Tipp geben? (QT 3.2.3)
Zuletzt geändert von Notwist am 8. Februar 2006 18:22, insgesamt 1-mal geändert.
Gruß, Notwist
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

QHttp::get() ist asynchron. Deswegen kann es nicht funkionieren.
http://doc.trolltech.com/4.0/qhttp.html#get
bzw.
http://doc.trolltech.com/3.3/qhttp.html#get

Du musst wohl auf das signal requestFinish() warten bevor Du die nächste Seite anfragst.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Notwist
Beiträge: 85
Registriert: 2. März 2005 14:24

Beitrag von Notwist »

D.h. ich könnte ja den Code eigentlich so lassen, nur, dass in der Funktion requestFinishedSlot() die Files behandelt werden müssten oder wie sehe ich das? Kann ich eigentlich noch irgendwie testen (im Debugger, benutze VS C++), ob ein SIGNAL gesendet wurde? Wohl nicht, oder?
Oder wie würdest Du das mit dem Warten machen?
Gruß, Notwist
Notwist
Beiträge: 85
Registriert: 2. März 2005 14:24

Beitrag von Notwist »

Also habs jetzt geschafft, dass die Slots funktionieren. Wieder mal vergessen, die auch im Designer reinzumachen. Habe jetzt eine Lösung gefunden, wie er die unterschiedlichen Files auch einzeln anlegt. Da es ja recht übersichtlich bleibt, ist das jetzt nicht besonders elegant mit der ODER-Verknüpfung, aber es scheint zu funktionieren:

Code: Alles auswählen

void MainWindow::requestFinishedSlot( int id, bool error ) 
{ 
   file.close();
}

void MainWindow::requestStartedSlot( int id ) 
{ 
   	if (id==2 || id==4 || id==6)
	{
		fileName="source"+iString.setNum(j)+".txt";
		file.setName(fileName); 
		if (!file.open(IO_WriteOnly )) 
		{ 
			return; 
		} 	
		j++;		
	}
}
Im Programm selbst wäre es natürlich noch schön, wenn da nen Status-Balken kommt bzw. nen Fenster, damit man weiss, ob er alle Seiten richtig übertragen hat, aber das kann ich ja noch einbauen.
Gruß, Notwist
Notwist
Beiträge: 85
Registriert: 2. März 2005 14:24

Beitrag von Notwist »

Noch ein Frage:

Hatte das Problem nicht bedacht, dass die IDs ja immer weiter hochlaufen, je länger das Programm benutzt wird. Speicher sie deshalb jetzt immer mit und mache mit denen dann die if-Abfrage.

Code: Alles auswählen

void MainWindow::requestStartedSlot( int id ) 
{ 
   	if (id==url_id[k])
	{
		this->ausgabeTextLabel->setText("Verbindung wird aufgebaut...");
		k++;
	}   	
	if (id==page_id[j])
	{
		fileName="source"+iString.setNum(j)+".txt";
		file.setName(fileName); 
		if (!file.open(IO_WriteOnly )) 
		{ 
			return; 
		} 	
		j++;
		this->ausgabeTextLabel->setText("Portal "+iString.setNum(j) +" wird übertragen");
	}
}
Komischerweise funktioniert das Ganze aber immer nur einmal. Die IDs werden zwar richtig mitgelogt, aber die SIGNALE requestStarted und requestFinished werden anscheinend nicht mehr ausgelöst. Dachte, es läge daran, dass es vielleicht noch Verbindungen gibt beim neuen Aufruf, habe die aber mit

Code: Alles auswählen

http.clearPendingRequests ();
auch rausgenommen, trotzdem springt er nicht mehr in die Slots. Hat jemand eine Idee, wieso?
Gruß, Notwist
Antworten