PHP einfacher web scrape - fehleranalyse

Dalson

Lt. Junior Grade
Registriert
Nov. 2007
Beiträge
271
hallöle,

manchmal scheitert man an den einfachsten aufgaben - ich weiss grad nicht woran es hapert.


habe eine url liste mit aktuell 10 einträgen aus denen ich jeweils einen wert auslesen möchte (keine angst, kein e-mail scraper oder ähnliches).

hier mein aufbau

PHP:
//die zeilen bzw. urls in ein array lesen
$zeilen = file ('permutation.txt');
 
//schleife starten	
$i = 1;
while($i < 10) {
                //url zum scrapen auswählen
		$GrabURL = $zeilen["$i"]; 
		$GrabStart = '<p id="statusOfflineText">'; 
		$GrabEnd = '</p>
	</div>
</div>'; 

		$RetrieveFile = file_get_contents("$GrabURL");
		$GrabData = ereg("$GrabStart(.*)$GrabEnd", $RetrieveFile, $DataPrint); 

		echo "<br /><br />";
                //url mit dem gescpraten wert ausgeben
		echo $zeilen["$i"]." - ".$DataPrint[1]."<br />";
$i++;
}



angezeigt wird mir schön die liste mit den einzelnen urls
jedoch scrapet er nur den wert der letzten url und gibt ihn aus

in diesem falle folgende ausgabe:

http://steamcommunity.com/id/ab -


http://steamcommunity.com/id/ac -


http://steamcommunity.com/id/ad -


http://steamcommunity.com/id/ae -


http://steamcommunity.com/id/af -


http://steamcommunity.com/id/ag -


http://steamcommunity.com/id/ah -


http://steamcommunity.com/id/ai -


http://steamcommunity.com/id/aj - Last Online: 3 days ago


gewünscht wäre für jede "id" der letzte online status... nur irgendwo ist mein gedankengang scheinbar falsch, vielleicht muss ich nur etwas abstand gewinnen und finde den fehler... oder ihr könnt mir helfen? :)

liebe grüße, dalson
 
Also
1.) warum ["$i"] und nicht [$i]? (siehe Z. 8,14,19).
2.) file_get_contents liefert doch HTML aus, oder?
Ich glaub, du verwechselst ereg mit der Ausgabe:
Code:
foreach(file("permutationen.txt" as $url){
 $html=file_get_contents($url);
$match=array();
ereg('(online)',$html,$match);
echo "<div>$url<p class=\"statusOfflinetext\">{$match[1]}</p></div>";
}
 
Warum es nicht geht? Ka... lass dir halt mal mehr ausgeben als immer nur der Index-Wert 1 aus $DataPrint...

und man könnte den Code auch in einigermaßen schön umschreiben, z.B.

PHP:
//die zeilen bzw. urls in ein array lesen
$zeilen = file ('permutation.txt');

$GrabStart = '<p id="statusOfflineText">'; 
$GrabEnd = '</p>';

foreach ($zeilen as $GrabURL) { 
		$RetrieveFile = file_get_contents($GrabURL);
		$GrabData = ereg("$GrabStart(.*)$GrabEnd", $RetrieveFile, $DataPrint); 
 
		echo "<br /><br />";
                //url mit dem gescpraten wert ausgeben
		echo $GrabURL." - ".$DataPrint[1]."<br />";
}

die Divs würde ich aus dem Regex rausmachen btw... macht den Code robuster...

@Hancock: Nein, Quatsch, er hat es nicht verwechselt...


Edit und Lösung
Kann sein dass die anderen 9 online sind... dann gibts keinen <p id="statusOfflineText"> sondern ein <p id="statusOnlineHeader">
 
Zuletzt bearbeitet:
@Hancock: Ja der Syntax"fehler" ist jedoch nicht weiter relevant für die Funktion. Und file_get_contents soll ja auch html ausliefern in meinem fall, zumindest einen teil davon - solange ich die werte einzeln ausgeben lasse funktioniert auch alles wie angedacht, jedoch geht nichtsmehr sobald ich die liste in einer schleife durchrattern lassen möchte :/

wieso meinst du verwechsel ich ereg? erge ist doch quasi das "alte" preg_match und ich schreibe hier ja lediglich den gesuchten wert in mein array dass ich ausgeben möchte

@1668mib: danke, habe den code auch selbst schon etwas abekürzt und gesäubert - ändert jedoch leider bisher nichts an der "nicht-funktionalität" ;)

PHP:
$zeilen = file ('permutation.txt');
 
	
foreach($zeilen as $zeile) {


		$GrabURL = $zeile; 
		$GrabStart = '<p id="statusOfflineText">'; 
		$GrabEnd = '</p>
	</div>
</div>'; 

		$RetrieveFile = file_get_contents($GrabURL);
		$GrabData = ereg("$GrabStart(.*)$GrabEnd", $RetrieveFile, $DataPrint); 

		echo $zeile." - ".$DataPrint[1]."<br />";
		
		print_r($DataPrint);
}

und die ausgabe

PHP:
http://steamcommunity.com/id/aa -
http://steamcommunity.com/id/ab -
http://steamcommunity.com/id/ac -
http://steamcommunity.com/id/ad -
http://steamcommunity.com/id/ae -
http://steamcommunity.com/id/af -
http://steamcommunity.com/id/ag -
http://steamcommunity.com/id/ah -
http://steamcommunity.com/id/ai -
http://steamcommunity.com/id/aj - Last Online: 3 days ago



[1] => Last Online: 3 days ago


irgendwie füllt es das dataprint nur mit dem letzten wert... ich hab echt nen hänger :D


liebe grüße
 
1668mib schrieb:
Edit und Lösung
Kann sein dass die anderen 9 online sind... dann gibts keinen <p id="statusOfflineText"> sondern ein <p id="statusOnlineHeader">

jein, teilweise online teilweise offline - was jedoch auch das script nicht beeinflussen sollte, denn wenn der scraper keinen wert findet dann gibt es eben keinen und es geht mit der nächsten url weiter


hmmmmm :)
 
Wie meinst du das mit "Script nicht beeinflussen"?
Was passierst, wenn du den regex änderst und den online-tag suchen lässt?
 
in dem falle der urls in denen er keinen "statusOfflineText" findet, müsste er lediglich ein "nichts" finden und dementsprechend den fehlenden wert auch als "nichts" ausgeben :)

also wenn er den gesuchten wert nicht findet spielt das auch keine rolle da für mich in diesem falle nur die "offline-seit" zeiten interessant sind

das script sollte auch keinen hänger durch fehlende offlinezeiten verursachen da es ja den letzten wert tatsächlich richtig ausgibt :)

edit: hab nochmal alle links manuel durchgesehen und es sind einige davon offline, also müsste einfach mehr als ein wert geliefert werden

liebe grüße
Ergänzung ()

er führt den "scrape" einfach lediglich mit dem letzten wert aus und listet die vorherigen nur... und ich seh den fehler nicht.. nach meinen verständnis müsste er in dieser schleife jede einzelne url seperat scrapen...

grüße
 
Zuletzt bearbeitet:
und wenn du statt offline die online-daten holen lässt, gibt es welche Ausgabe? Nur die URLs ohne Daten hinten dran?

Lass dir mal die Länge des Strings $RetrieveFile mitausgeben vielleicht...
 
bei den online-daten gibt es garkeine ausgabe da das letzte profil in diesem falle offline ist und lediglich das letzte ausgegeben wird...


$RetrieveFile ist nun jedoch interessant, ich sehe 9x die steam seite mit einem error


Error
Sorry!

An error was encountered while processing your request:

The specified profile could not be found.


Here's a link to the Steam Community home page.


und das letzte profil am ende wird angezeigt :)

mhmm das ist schon aufschlussreich.. nur woran haperts... einfach zu schnelle anfragen an steam?

grüße
 
hm, hab vergessen die zeilenumbrüche in der externen datei zu deklarieren... wie blöd :)

lösung gefunden ;)


liebe grüße
 
Zurück
Oben