Sowas wie einen Crawler bauen
Stephan
- php
0 Severin Kacianka0 Stephan0 Stephan
Hallo,
ich habe vor, mir sowas ähnliches wie einen Crawler zu basteln. Er soll dann auf Websites gehen und als erstes, wenn vorhanden die robots.txt lesen, dann wie es drinnen steht, die Verzeichnisse auslesen und wenn keine da ist alle verzeichnisse auslesen. Er soll dann Links weiterverfolgen, also nicht Ordner durchsuchen, sondern nur da, wo man auch wirklich hinkommt hingehen und das auf eine Wortgruppe untersuchen.
Eine Frage: ISt das mit PHP möglich und wenn, mit welchen Befehlen?
Danke schon jetzt
Stephan
Hallo,
Eine Frage: ISt das mit PHP möglich und wenn, mit welchen Befehlen?
Auf jedenfall ist es mit cURL möglich http://at2.php.net/curl und mittles fsockopen sollte es eigendlich auch gehen http://at2.php.net/manual/en/function.fsockopen.php.
gruß,
Severin
Muss ich mich mal durchklicken, Danke!
Stephan
Hallo Severin,
kennst Du noch eine andre Quelle zu cURL, wo es besser beschrieben ist, ich habe hier nämlich keine Funktionsübersicht und Beschribungen, was man mit welcher Funktion macht, sondern nur einen Haufen Funktionen aufgelistet.
Danke schon jetzt für Links
Stephan
PS: Google spuckt auch nichts gescheites aus :-(
Hallo,
kennst Du noch eine andre Quelle zu cURL, wo es besser beschrieben ist, ich habe hier nämlich keine Funktionsübersicht und Beschribungen, was man mit welcher Funktion macht, sondern nur einen Haufen Funktionen aufgelistet.
Ja ich weiss, irgendwie fehlt eine gute Dokumentaion zur libcurl und PHP. Das Beste das ich gefunden habe war http://www.zend.com/zend/tut/tutorial-thome3.php und sonst hilft nur probieren und fragen.
gruß,
Severin
Aber ich muss ja wenigstes den Anfang verstehen, ich kann ja nicht hier allen Löcher in den Bauch fragen ;-)
Kennst Du den Anfang? Wie kann ich denn Liks verfolgen lassen, das ist das Hauptproblem, die Verbindung und das Auslesen bekomme ich schon irgendwie hin, aber wie lasse ich alle Links verfolgen und wenn ein Ergebnis zu http://www.xy.de gefunden wurde *ja*, wenn nicht *nein* in die Datenbank schreiben lassen und den Vorgang beenden lassen?
Danke schon jetzt
Stephan
Hallo,
Kennst Du den Anfang? Wie kann ich denn Liks verfolgen lassen, das ist das Hauptproblem, die Verbindung und das Auslesen bekomme ich schon irgendwie hin, aber wie lasse ich alle Links verfolgen und wenn ein Ergebnis zu http://www.xy.de gefunden wurde *ja*, wenn nicht *nein* in die Datenbank schreiben lassen und den Vorgang beenden lassen?
Von sich aus kann cURL das nicht. Was cURL kann, ist dir den Quelltext einer HTML Datei bringen, POST Requests absetzten und sonstige 'Browser-Aufgaben'. cURL ist praktisch ein Browser ohne Renderingengine und ähnlichem.
Hier ist ein einfaches Beispiel:
<?php
$cu = curl_init();
if($cu){
curl_setopt($cu, CURLOPT_URL,'http://www.example.org');
curl_setopt ($cu, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec ($cu);
curl_close ($cu);
echo htmlspecialchars($result);
}
?>
Das wird dir den Quelltext von http://www.example.com ausgeben.
Wenn du deinen Crawler jetzt allen Links folgen lassen willst, dann musst du nach URLs im Quelltext suchen und diesen dann wieder folgen.
Es könnte dir vielleicht auch helfen, die zahlreichen Kommentare auf der php.net zu cURL zu lesen, und auch alles auszuprobieren.
gruß,
Severin
Ich liebe Englisch :-(
Lerne das doch noch, den Wortschatz habe ich noch gar nicht...
Stephan
Hallo,
Ich liebe Englisch :-(
Lerne das doch noch, den Wortschatz habe ich noch gar nicht...
Da hilft nur, rein ins kalte Wasser und ans Wörterbuch klammern ;)
Nein im Ernst, ohne ausreichende Englisch-Kenntnisse bist du im Web und besonders im programmiertechnischen Bereich verloren. Englisch hat sich nunmal als de-facto 'Standard Sprache' für technische Dokumentation durchgesetzt und wird auch so schnell nicht verschwinden. Ich kann dir wirklich ans Herz legen, es gut zu erlernen, da jegliche Dokumentation zuerst in Englisch erscheit und auch zum Beispiel die Englische Dokumentation auf php.net oft wesentlich aktueller und genauer ist als die Deutsche. Ich weiss nicht wie lange du Englisch lernst/gelernt hast und wie gut dein Englisch ist, aber aus eigener Erfahrung kann ich dir sagen, dass man recht schnell ins 'Programmer's English' hineinkommt, da das Vokabular nicht so riesig ist und sich meistens aus den Zusammenhang erschließt.
gruß,
Severin
Bei mir leider noch nicht, habe erst 3 Jahre Englisch und noch 5 Jahre vor mir, 8. Klasse ;-)
Habe das mal geschrieben:
----
<?
function search4links($url, $fPtr)
{
static $urlBuffer;
if(isset($urlBuffer[$url])) return 0;
$urlBuffer[$url] = 1;
echo("Durchsuche $url<br>\n");
flush();
$meineSeite = @implode("", @file($url));
if(!$meineSeite) return 0;
$existing = false
// Links suchen
preg_match_all("/\href=("|')(.*)(\1)/siU", $meineSeite, $ausgabe);
$anzahlLinks = 0;
foreach($ausgabe[2] as $link)
{
if(preg_match("/(bildungszentrum-hyperkinetik.de)/i", $link))
$existing = true;
if(!preg_match("/(http)/i", $link))
{
if(!$link[0] == "/")
{
if(!preg_match("/(http://.*)/(.*).(.*)$/siU", $url, $mUrl))
{
$anzahlLinks += search4links($url."/".$link);
}
else
{
$anzahlLinks += search4links($mUrl[1]."/".$link);
}
}
else
{
preg_match("/(http://.*)//siU", $url, $mUrl);
$anzahlLinks += search4links($mUrl[1]."/".$link, $fPtr);
}
}
}
if($existing) {
echo{
$query = "UPDATE parnter (check) VALUES ('".mysql_escape_string (*ja*)."') WHERE adresse LIKE $url";
if($insert = @mysql_query("$query")) {
echo '<p align="center"><b>Abfrage erfolgreich</b><br><br><a href="organizer.php"><- zurück</a></p>';
}
} else {
echo{
$query = "UPDATE parnter (check) VALUES ('".mysql_escape_string (*nein*)."') WHERE adresse LIKE $url";
if($insert = @mysql_query("$query")) {
echo '<p align="center"><b>Abfrage erfolgreich</b><br><br><a href="organizer.php"><- zurück</a></p>';
}
return $anzahlLinks;
}
if(isset($_POST[url]))
echo "\n\n<br><br>Links gefunden: ".search4links($_POST[url]);
?>
-----
Müsste doch funktionieren, oder?
Stephan
Hallo,
Bei mir leider noch nicht, habe erst 3 Jahre Englisch und noch 5 Jahre vor mir, 8. Klasse ;-)
Wirst sehen, die letzten 4 Jahre sind die schönsten :-)
Müsste doch funktionieren, oder?
Das fragst du mich so früh am Sonntag ;-)
Ich habe mir den Code jetzt einmal auf die schnelle durchgeschaut, und er scheint soweit okey zu sein. Eine Frage trotzdem: Was soll das Konstrukt:
echo{
Ich neheme an das wird ein Tippfehler sein. Und noch was zu deinem Regulären Ausdruck:
preg_match_all("/\href=("|')(.*)(\1)/siU", $meineSeite, $ausgabe);
Ich gebe zu, dass meine Kentnisse von Regulären Ausdrücken eher oberflächlich sind, aber soweit ich deinen Ausdruck lesen kann sucht er nach 'href="string '
Ich glaube nur, dass dieser in den Fällen
<a href=http://www.example.com>
<a href="http://www.example.com" target="_blank">
nicht, oder ungenau zutrifft, und im Fall
<link rel="stylesheet" href="http://www.example.com">
schon zutrifft.
gruß,
Severin
Hallo,
habe jetzt noch etwas gebastelt und jetzt funktioniert es:
---
<?
$ja = '*ja*';
$nein = '*nein*';
function search4links($url)
{
static $urlBuffer;
if(isset($urlBuffer[$url])) return 0;
$urlBuffer[$url] = 1;
echo("Durchsuche $url<br>\n");
flush();
$meineSeite = @implode("", @file($url));
if(!$meineSeite) return 0;
$existing = false;
// Links suchen
preg_match_all("/(href|src)=("|')(.*)(\2)/siU", $meineSeite, $ausgabe);
$anzahlLinks = 0;
foreach($ausgabe[3] as $link)
{
if(preg_match("/(bildungszentrum-hyperkinetik.de)/i", $link))
$GLOBALS["foundVals"]++;
if(!preg_match("/(http)/i", $link))
{
if(!($link[0] == "/"))
{
if(!preg_match("/(http://.*)/(.*).(.*)$/i", $url, $mUrl))
{
$anzahlLinks += search4links($url."/".$link);
}
else
{
$anzahlLinks += search4links($mUrl[1]."/".$link);
}
}
else
{
preg_match("/(http://.*)/.*)//siU", $url, $mUrl);
print_r($mUrl);
$anzahlLinks += search4links($mUrl[1]."/".$link, $fPtr);
}
}
}
if($existing) {
$query = "UPDATE parnter (check) VALUES ('".mysql_escape_string ($ja)."') WHERE adresse LIKE $url";
if($insert = @mysql_query("$query")) {
echo '<p align="center"><b>Abfrage erfolgreich</b><br><br><a href="organizer.php"><- zurück</a></p>';
}
} else {
$query = "UPDATE parnter (check) VALUES ('".mysql_escape_string ($nein)."') WHERE adresse LIKE $url";
if($insert = @mysql_query("$query")) {
echo '<p align="center"><b>Abfrage erfolgreich</b><br><br><a href="organizer.php"><- zurück</a></p>';
}
}
return $anzahlLinks;
}
$_POST[url] = "http://www.erft.de/vereine/zzz/menue.htm";
$foundVals = 0;
if(isset($_POST[url]))
{
search4links($_POST[url]);
echo "\n\n<br><br>Links gefunden: ".$foundVals;
}
?>
-----
Liebe Grüße
Stephan