Webseiten abrufen mit SOCKET

sh0x

Erfahrenes Mitglied
Hallo PHP-Gemeinde,

ich möchte ein kleines PHP Script schreiben, dass eine bestimmte Webseite abruft und deren Inhalt in einem String speichert.

Das hat folgenden Hintergrund. Wir haben ein Forum, das einen Thread mit 5000 Seiten hat. Das Forum bietet nur eine Threadsuche. Ich suche eine bestimmte Seite in diesem Thread, aber möchte nicht jede der 5000 Seiten ansurfen. Da dachte ich mir, dass man einfach ein PHP Script schreiben könnte, was alle diese 5000 Seiten durchgeht und nach einem Stichwort durchsucht. Also automatisiert abruft (jeder Seite wird ein GET-Parameter 1-5000 übergeben, deswegen kann man das gut in eine Schleife packen).

Leider habe ich keine Erfahrung mit Sockets. Vielleicht wisst ihr, wie man das macht.

Auf php.net habe ich ein Script gefunden. Nur leider funktioniert das bei mir nicht. Die Fehlermeldung lautet immer:
Code:
OK. Versuche, eine Verbindung zu '81.209.148.33' auf Port '80' aufzubauen ...
Warning: socket_connect() [function.socket-connect]: unable to connect [0]: Ein Verbindungsversuch ist fehlgeschlagen, da die Gegenstelle nach einer bestimmten Zeitspanne nicht ordnungsgemäß reagiert hat, oder die hergestellte Verbindung war fehlerhaft, da der verbundene Host nicht reagiert hat. in C:\Programme\xampp\htdocs\pagefinder\index.php on line 22
OK. Einen HTTP HEAD Request senden ...
Warning: socket_write() [function.socket-write]: unable to write to socket [0]: Eine Anforderung zum Senden oder Empfangen von Daten wurde verhindert, da der Socket nicht verbunden ist und (beim Senden über einen Datagrammsocket mit einem sendto-Aufruf) keine Adresse angegeben wurde. in C:\Programme\xampp\htdocs\pagefinder\index.php on line 35
OK. Die Antwort lesen: 
Warning: socket_read() [function.socket-read]: unable to read from socket [0]: Eine Anforderung zum Senden oder Empfangen von Daten wurde verhindert, da der Socket nicht verbunden ist und (beim Senden über einen Datagrammsocket mit einem sendto-Aufruf) keine Adresse angegeben wurde. in C:\Programme\xampp\htdocs\pagefinder\index.php on line 39
Den Socket schliessen ...OK.

Das PHP Script, das die obigen Fehlermeldungen ausgibt sieht wie folgt aus:

PHP:
<?php
error_reporting (E_ALL);

echo "<h2>TCP/IP Verbindung</h2>\n";

/* Den Port des WWW-Dienstes holen. */
$service_port = getservbyname ('www', 'tcp');

/* Die IP-Adresse des Zielhosts holen. */
//$address = gethostbyname ('www.gmx.net');
$address = "81.209.148.101";
/* einen TCP/IP Socket erzeugen. */
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_set_nonblock($sock);


if ($socket < 0) {
    echo "socket_create() fehlgeschlagen: Grund: " . socket_strerror ($socket) . "\n";
} else {
    echo "OK.\n";
}

echo "Versuche, eine Verbindung zu '$address' auf Port '$service_port' aufzubauen ...";
$result = socket_connect($socket, $address, $service_port);
if ($result < 0) {
    echo "socket_connect() fehlgeschlagen.\nGrund: ($result) " . socket_strerror($result) . "\n";
} else {
    echo "OK.\n";
}

$in = "GET / HTTP/1.0\r\n";
$in .= "Host: ".$address."\r\n";
//$in .= "Connection: Close\r\n\r\n";
$out = '';

echo "Einen HTTP HEAD Request senden ...";
socket_write($socket, $in, strlen ($in));
echo "OK.\n";

echo "Die Antwort lesen:\n\n";
while ($out = socket_read ($socket, 2048)) {
    echo $out;
}

echo "Den Socket schliessen ...";
socket_close ($socket);
echo "OK.\n\n";
?>

Freue mich über jeden Beitrag, der mich weiter bringt.
Liebe Grüße,
sh0x
 
Schau mal hier, da hab ein recht umfangreiches Tutorial zum Thema HTTP mit PHP hinterlassen.

Ich denk aber nicht, dass diese Loesung wirklich praktikabel ist. Besser waere wohl den Thread in der Datenbank zu durchsuchen und dann die entsprechenden Ergebnisse auszugeben. Das duerfte wesentlich schneller gehen.
 
Hallo Dennis,

vielen Dank, ich werd mir das Tutorial mal durchlesen. Schreibe dir dann nochmal, ob es mir geholfen hat.
Mir reicht diese Lösung, soll ja nur mal so nebenbei sein. Mit Datenbank wäre zu aufwendig. Außerdem kann ich das wenn nebenbei laufen lassen.
 
Mmmh... meinst du wirklich, es ist einfacher, 5000 Seiten per HTTP anzufordern, als ein einziges QUERY abzusetzen... mal ganz vom Traffic und der Serverbelastung zu schweigen?
 
Eine Datenbankabfrage, in der 5000 Datensätze oder ruhig auch das 100fache durchsucht werden, wird wesentlich schneller sein als die Einzelseiten per HTTP anzufordern und zu durchsuchen.
 
Sven Mintel hat gesagt.:
Mmmh... meinst du wirklich, es ist einfacher, 5000 Seiten per HTTP anzufordern, als ein einziges QUERY abzusetzen... mal ganz vom Traffic und der Serverbelastung zu schweigen?


Die Seiten muss ich doch in jedem Fall abrufen. Ich kann ja nicht auf die Datenbank zugreifen, da das nicht mein Webserver ist.

Demnach bleibt mir doch nur die Chance, alle Seiten von Hand durchzugehen - oder mir das eben mit einem kleinen Script erleichtern.

Es soll ja nichts großes sein. Ich suche nur ein Video in diesem riesigen Thread. Und ich habe keine Lust immer auf die nächste Seite zu klicken, dann STRG+F, dann STRG+V (für den Suchbegriff fürs Video) und dann weiter zur nächsten Seite und dasselbe.

Ich würde also einfach eine Schleife in PHP machen, diese über alle Seiten laufen lassen und bei jedem Schleifendurchgang per HTTP GET den ASCII-Seiteninhalt anfordern. Dann suche ich mittels eines regulären Ausdrucks nach dem Videotitel.

Soweit der Plan. Ob ich das so einfach hinbekomme - keine Ahnung :-)
Ist das denn schwer zu realisieren, so wie ich mir das denke?

Vielen Dank für eure Beiträge! ;-)
 
sh0x hat gesagt.:
...da das nicht mein Webserver ist.
Achso...dieses kleine, nebensächliche Detail hattest du bisher aber verschwiegen :-)

Und warum funktioniert die Threadsuche nicht.... fällt dir nicht irgendeine recht eindeutige Phrase ein, die in der gesuchten Passage vorkommt?
 
Sven Mintel hat gesagt.:
Achso...dieses kleine, nebensächliche Detail hattest du bisher aber verschwiegen :-)
?

Sorry Kollege Sven, habe ich 'verschwitzt' ;-)

Sven Mintel hat gesagt.:
Und warum funktioniert die Threadsuche nicht.... fällt dir nicht irgendeine recht eindeutige Phrase ein, die in der gesuchten Passage vorkommt?

Ich weiß nicht. Das Forum scheint schon etwas überholt zu sein. Es kann zwar nach Threads suchen, aber nicht nach den Beiträgen in den Threads. Und dieser Thread hat soviele Seiten, weil sich meine lustigen Kollegen gedacht haben: "Vielleicht kriegen wir ein 10000 seitiges Thread hin".
 
Wenn die Seiten in einer Suchmaschine indexiert sind, könntest du auch einfach diese benutzen. So bietet Google etwa die Funktion, nur Ergebnisse einer Domain anzuzeigen:
Code:
site:tutorials.de foobar
 
Gumbo hat gesagt.:
Wenn die Seiten in einer Suchmaschine indexiert sind, könntest du auch einfach diese benutzen. So bietet Google etwa die Funktion, nur Ergebnisse einer Domain anzuzeigen:
Code:
site:tutorials.de foobar


Hallo Gumbo,

ansich eine gute Idee, nur leider ist das Forum nicht öffentlich.

Ich muss also doch den PHP-Weg gehen.
Habt ihr denn eine Ahnung, ob man sowas mit Sockets machen kann?
Wenn ihr mir ein JA gebt, freue ich mich, wenn ihr mir noch einen Tipp mit auf den Weg gebt, wie ich das am einfachsten mit PHP realisiere.

Dann würde ich mir das Tutorial von unserem guten Kollegen durchlesen und bekomme es alleine hin. Natürlich werde ich dann das Ergebnis hier posten :-)

Also, hat einer eine Idee, ob das so geht?
Genießt das schöne Wetter!
 
Zurück