Zum Inhalt springen

[PHP] Webseiten analysieren


Empfohlene Beiträge

Hallo zusammen,

Ist es möglich mit PHP andere Websites auszulesen, und zu überprüfen, ob diese eine bestimmte Zeichenkette enthalten.

Ich stelle mir das so vor:

Ich habe eine Datenbank mit eingetragenen Domains, welche meine Dienste nutzen. Als Gegenleistung soll auf jeder Ihrer-Seiten ein Link auf mein Angebot sein. Um das nicht jedesmal selbst nachsehen zu müssen, möchte ich diesen Prozess der Überprüfung automatisieren.

Ich habe mir schon Gedanken darüber gemacht. Nur weiß ich nicht, wie ich mit PHP andere Webseiten auslese.

Hat jemand eine Idee oder einen Ansatz für mich. Kann ich auf anderen Domains die Verzeichnisstruktur auslesen?

gruss

markus

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi,

mit nem eigenen linux server könntest du mithilfe von Nagios den anderen Server überwachen und dem check_http command mitgeben das es nach einem bestimmten String im Quelltext suchen soll.

So überwache ich meine Anwendungen, ob nicht nur der Apache läuft sondern auch diverse Datenquellen das richtige zurückliefern.

Gruß Jaraz

Link zu diesem Kommentar
Auf anderen Seiten teilen

Gut, das hab ich inzwischen rausgefunden, aber der dir-Befehl und readdir funktionieren nicht! Ich brauch auch Unterverzeichnisse, wenn sie denn gelesen werden dürfen. Oder soll ich von der Homepage einfach alle Links auslesen, die auf dieser Domain bleiben?

Das wäre wohl das günstigste.

Meine Idee dazu:

Ich hab als Angabe seine Domain. Ich lese mir die erste Seite aus und überprüfe alle Links, wenn die Links auf der selben Domain liegen, gehe ich diesen Links nach und lese das Ziel ebenfalls aus. Ich muss aber aufpassen, dass ich nicht eine endlosschleife durchlaufe, wenn sich Seiten gegenseitig verlinken.

Haltet ihr das für realisierbar?

gruss

markus

Link zu diesem Kommentar
Auf anderen Seiten teilen

fopen oder curl erlaubt natürlich das Auslesen, aber der Link muss ja nicht zwingend auf der Startseite sein.

Problematisch wird also nur das Suchen. Und da würde ich mich primär Fragen ob PHP für diese Aufgabe geeignet ist.

Ein Cronjob mit wget -m $DOMAIN, eine kluge Excludeliste dazu und ein einfaches grep sollten dich da schneller glücklich machen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Meine Idee dazu:

Ich hab als Angabe seine Domain. Ich lese mir die erste Seite aus und überprüfe alle Links, wenn die Links auf der selben Domain liegen, gehe ich diesen Links nach und lese das Ziel ebenfalls aus. Ich muss aber aufpassen, dass ich nicht eine endlosschleife durchlaufe, wenn sich Seiten gegenseitig verlinken.

Haltet ihr das für realisierbar?

Ja, halte ich schon für realisierbar. Es gibt ja auch schon Tools, die sowas in der Art machen (also komplette sites mit allen Dateien etc. auflisten). wie die genau funktionieren weiss ich nicht, aber so wie du sagst geht es auf jeden Fall.

Um deine Endlosschleife zu verhindern kannst du einfach eine maximale tiefe angeben. Also du liest die Index.html (Teife = 0), dann die erste verlinkte Datei (tiefe = 1), dort auch die erste verlinkte Datei (Tiefe = 2), da wieder die erste verlinkte Date (Tiefe = 3). Sagen wir deine maximale Tiefe wäre 3 würdest du auf der Seite keine Links mehr verfolgen und aud der Tiefe 2 mit dem nächten Link weiter machen. Am Ende hast du alle Dateien durch ohne endlosschleife.

Musst halt die maximale tiefe auf einen vernünftigen Wert einstellen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich habe einen Hostingvertrag ohne Cronjobs, und Linux ist eh nicht meine Stärke!

Andere Vorschläge? Vielleicht eine Java-Applikation, welche aus der Datenbank meiner Homepage die verschiedenen URLs ausliest und das dann für mich übernimmt?

Ich denke auch, dass PHP wohl eine ungünstige Lösung dafür ist, besonders wenn es sehr viele zu überprüfende URLs werden!

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich habe einen Hostingvertrag ohne Cronjobs, und Linux ist eh nicht meine Stärke!

Andere Vorschläge? Vielleicht eine Java-Applikation, welche aus der Datenbank meiner Homepage die verschiedenen URLs ausliest und das dann für mich übernimmt?

Ich denke auch, dass PHP wohl eine ungünstige Lösung dafür ist, besonders wenn es sehr viele zu überprüfende URLs werden!

ich sehe kein Problem darin dieses Vorhaben in PHP umzusetzen.

Allerdings müsstest du bestimmt bei einer größeren anzahl an url die max_execution time hochsetzen, da dass ein längerer Prozess werden könnte.

ich würd einfach so machen:

1) index.htm/html/php/.... öffnen.

2) Prüfen ob die URL bereit in deinem Array enthalten ist

2a) Wenn Ja, nächsten Link vornehmen

2b) Wenn Nein => goto 1.

3) Url in einem Array merken

4) Den Sourcecode nach dem Link auf deine Domain durchforsten

4a) Wenn dein Bild gefunden wurde => abbruch

4b) dein Bild wurde nicht gefunden => nächster Link des Dokuments

Link zu diesem Kommentar
Auf anderen Seiten teilen

@kills:

Hattest du nicht schon mal einen Thread hier, über ein Suchmuster zum Auslesen von Links aus einer Datei. Ich würde es mir zwar irgendwie zusammenschustern können, aber ich hab mich noch nie mit regex auseinandergesetzt.

Hast du noch den link zu diesem Thread - ich habe ihn nicht gefunden.

Mal sehen ich denke, dass ich es so dann hin kriege. Das einzige Problem werden wohl die regex.

Link zu diesem Kommentar
Auf anderen Seiten teilen

ich sehe kein Problem darin dieses Vorhaben in PHP umzusetzen.

Allerdings müsstest du bestimmt bei einer größeren anzahl an url die max_execution time hochsetzen, da dass ein längerer Prozess werden könnte.

Wenn von einem Hostingvertrag ohne Cron die Rede ist, ist es wohl kein Rootserver sondern nur ein vhost. Ob das dann Möglich ist ist zweifelhaft.

1) index.htm/html/php/.... öffnen.

2) Prüfen ob die URL bereit in deinem Array enthalten ist

2a) Wenn Ja, nächsten Link vornehmen

2b) Wenn Nein => goto 1.

3) Url in einem Array merken

Ich würde ein Hash nehmen und das einfach durchgehen... alle Links werden pauschal ins Hash geworfen, wenns die schon gibt überschreiben sie sich ja - kein Prüfung nötig :)

Also in etwa:


$URLS = array("www.domain.de" => 1);
reset($URLS);
while (...) {
# URL key(current($URLS)) durchsuchen, alle links als Hash
# in $URLS ablegen
next($URLS)
}
[/php]

Da das Hash von Anfang bis Ende durchmaschiert wird erwischt du alle URLs genau einmal. Doppellinks die man ins Hash wirft überschreiben sich, keine Doubletten möglich.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Da das Hash von Anfang bis Ende durchmaschiert wird erwischt du alle URLs genau einmal.

Doppellinks die man ins Hash wirft überschreiben sich, keine Doubletten möglich.

Aber wie komme ich vorher an alle Dateien? Das ist ja die Frage. Ich dachte eher an eine rekursive Funktion, die immer wenn ich einen Link finde in einem Array prüft, ob der Link schon vorhanden, wenn nicht eintragen und link untersuchen, wenn vorhanden, dann überspringen und nächster link. bis ich eben wieder am anfang bin. Ich will eh nur alle html, php, etc.. Dateien dieser domain durchsuchen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Aber wie komme ich vorher an alle Dateien? Das ist ja die Frage.

Das Hash wächst wärend das Script läuft.

z.B existieren:

index.html : Hat links auf /impressum.html, www.disney.com und /firma/agb.html

Am Anfang enthält dein Hash nur den Link zur index.html. Beim Lesen und Parsen stösst man auf die anderen Links. Disney.com ist extern, den ignoriert man. Die anderen werden ins Hash gepackt. Wenn das Parsen beendet ist, ist das Hash gewachsen und die "Aussenschleife" läuft natürlich weiter.

Aber die Schleife ist wohl in erster Linie mal dein sekundäres Problem.

Link zu diesem Kommentar
Auf anderen Seiten teilen

ich hab da was gefunden:

<xsl:template match="/body/table/tr/td/table/tr/td/table" >

<xsl:call-template inhaltBearbeiten />

</xsl>

<xsl:template name="inhaltBearbeiten">

Datum: <xsl:value-of select="tr/td/p/b" />

Link: <xsl:value-of select="tr/td/p/a/@href" />

Inhalt: <xsl:value-of select="tr/td/p/a" />

</xsl>

Das sollte es in etwa sein.

======> Anmerkung: Funktioniert nur wohlgeformten HTML-Dateien

siehe:

post: http://forum.fachinformatiker.de/showpost.php?p=622511&postcount=5

thread: http://forum.fachinformatiker.de/showthread.php?t=68428

demnach könntest du das so ungefähr machen:


<xsl:template match="/body/a" >

<xsl:call-template inhaltBearbeiten />

</xsl>


<xsl:template name="inhaltBearbeiten">

Link: <xsl:value-of select="a/@href" />

Inhalt: <xsl:value-of select="/a" />

</xsl>

ungetestet und ohne gewähr!

das ganze wird dann so gehandelt:


// "datei" holen und temporär speichern
// dateiname der datei in $xml speichern
$xslt = xslt_create();
xslt_set_encoding($xslt, "iso-8859-1");

$result = xslt_process($xslt,$xml,$xsl,$result,$args,$params) or die(
"<b>Es ist folgender Fehler aufgetreten:</b><br/>".
xslt_errno($xslt).": ".xslt_error($xslt)
);
xslt_free($xslt);
[/PHP]

Link zu diesem Kommentar
Auf anderen Seiten teilen

@ DevilDawn:


$URLS = array("www.domain.de" => 1);
reset($URLS);
while (...) {
# URL key(current($URLS)) durchsuchen, alle links als Hash
# in $URLS ablegen
if(!in_array("seiten/index.htm",$URLS)) {
$URL["seiten/index.htm"] = sizeof($URLS)+1;
}
next($URLS)
}
[/PHP]

Stellst du dir das so vor?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das heißt also, ich brauche doch einen reglären Ausdruck mit dem ich mir die Links aus der Datei rausschneiden kann.

Ich hatte übrigens den Thread von dir mit regulären Ausdrücken gefunden.

Regex

Aber ich bekomme den Ausdruck trotzdem nicht hin.

Bisher habe ich:

  echo eregi("[^<a.+?href=\"?\".+?/?>]",$text,$myA);
echo sizeof($myA);
[/PHP]

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das heißt also, ich brauche doch einen reglären Ausdruck mit dem ich mir die Links aus der Datei rausschneiden kann.

Ich hab sowas auch mal gemacht... :)

meine RegEx:


// Dateiinhalt befindet sich in $datinhalt
preg_match_all("/(href=\")[^\"]+\"|(src=\")[^\"]+\"|(background=\")[^\"]+\"|(action=\")[^\"]+\"/i",$datinhalt,$treffer);
foreach ($treffer[0] as $neuedatei)
{
// hier dann weiter überprüfen, der Link befindet sich in $neuedatei
...
}
[/php]

Hier überprüfe ich nicht nur auf href, sondern auch auf src,background und action (brauchte ich halt damals)

Wenn du nur auf href überprüfen willst, änder die erste Zeile so:

[PHP]
preg_match_all("/(href=\")[^\"]+\"/i",$datinhalt,$treffer);

Link zu diesem Kommentar
Auf anderen Seiten teilen


preg_match_all("/(href=\")[^\"]+\"/i",$datinhalt,$treffer);
[/PHP]

Ich hätte ein paar Fragen zu diesem regEx:

1. Was bedeutet das ^ in der ersten eckigen Klammer. Meine Vermutung war "Beginnend mit \" ".

2. Was bedeutet das "/i" am Ende? So wie ich es verstanden habe wurde hier '/' als Begrenzer eingesetzt aber was bedeutet das 'i'?

gruss

markus

Link zu diesem Kommentar
Auf anderen Seiten teilen


preg_match_all("/(href=\")[^\"]+\"/i",$datinhalt,$treffer);
[/PHP]

Ich hätte ein paar Fragen zu diesem regEx:

1. Was bedeutet das ^ in der ersten eckigen Klammer. Meine Vermutung war "Beginnend mit \" ".

Das bedeutet "alles außer", soll heißen, dass er hier [^\"] alle Zeicehn aufnimmt, die kein " enthalten

2. Was bedeutet das "/i" am Ende? So wie ich es verstanden habe wurde hier '/' als Begrenzer eingesetzt aber was bedeutet das 'i'?

ohne Beachtung der Groß- und Kleinschreibung
Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...