PHP Crawler? Kleine Frage

thehacker

Anhänger der Apachen
Hallo,
nach glaube ich 2 Monaten habe ich2 Crawler geschrieben aber:

ich weiss nicht wie ich beide vereinen soll?
Der erste erstellt eine Linkliste diesen gibt es aber Frei im Netz zum Runterladen :D

Der Zweite ist selber gemacht und gibt die Meta Daten aus kann abe auch den Meta Tag Robots von folgen und nicht folgen unterscheiden :D

nun die Fragen :D

Wie bekomme ich beide zusammen?
Kann ich den auf einem Localhost laufen lassen und die DB Einfach nacher Ex/Importieren?
und was ist mit der Robots.txt?
und wie mache ich es das wenn er die 1. Seite durchsucht hatt auf einen Weiteren Link geht Sprich 5 Links und die Seite ist Fertig heisst die 5 Links in neuen Browser Tabs öffnen und die Fertigen Schliesen?

und ist das ganze zu umständlich? (Erklerung und Fragen :D)


Mfg
TheHacker :D

PS: Die Codes (Dürfen gerne weitergenutz werden:
Crawler 1:
PHP:
<form action="" method="post">

    <input type="text" name="url" value="http://" />

</form>

<?



    $url = $_POST['url'];

    

    if(isset($_POST["url"])) {

        $datei = fopen("data/sitemap.txt", "w");

        fwrite($datei, "");

        fclose($datei);

        $datei = fopen("data/backup.txt", "w");

        fwrite($datei, "");

        fclose($datei);

    }

    

    if($url=="") {

        $url = stripslashes(urldecode($_GET["url"]));

    }

    

    if($url != "") {

        /* ==========================================================================

            alles was dir URL betrifft

        ==========================================================================*/

        

        # URL aufteilen / parsen

        $urlArray = parse_url($url);

        

        # Das http prüfen. Bei anderen Protokollen Error melden

        if($urlArray["scheme"]=="http") {

            $http = "http://";

        } else {

            weiter("error");

            exit;

        }

        

        # Den host prüfen und www entfernen

        $hostControl = strpos($urlArray["host"], "www.");

        if($hostControl === false) {

            $host = $urlArray["host"];

        } else {

            $host = str_replace("www.","",$urlArray["host"]);

        }

        

        #  Root URL

        $root = $http.$host;

        

        # URL nur ohne www

        $url = str_replace("www.","",$url);

        

        /* ==========================================================================

            alles was den INHALT betrifft

        ==========================================================================*/

        

        # Den Inhalt der Seite laden

        $data = @implode("", file($url));

        

        if($data=="") {

            $backup = file_get_contents("data/backup.txt");

            $backupURLs = split("[\n]",$backup);

            $datei = fopen("data/backup.txt", "w");

            fwrite($datei, "");

            fclose($datei);

            for($j=0;$j<=count($backupURLs);$j++) {

                if(str_replace("www.","",$backupURLs[$j])!=$url) {

                    $datei = fopen("data/backup.txt", "a");

                    fwrite($datei, stripslashes($backupURLs[$j]."\n"));

                    fclose($datei);

                }

            }

            weiter("error");

            exit;

        }



        # Alle Links aus dem Inhalt extrahieren

        # nur die a-Tags filtern

        $aTags = strip_tags($data, "<a>");

        preg_match_all("/<a(?:[^>]*)href=\"([^\"]*)\"(?:[^>]*)>(?:[^<]*)<\/a>/is", $aTags, $matches);

        $hrefs = array_unique($matches[1]);

        $linksBreak;

        for($i=0;$i<=count($matches[1]);$i++) {

            if($hrefs[$i]) {

                $js = strpos($hrefs[$i], "javascript:");

                $raute = strpos($hrefs[$i], "#");

                $mailto = strpos($hrefs[$i], "mailto:");

                $jpeg = strpos($hrefs[$i], ".jpeg");

                $gif = strpos($hrefs[$i], ".gif");

                $jpg = strpos($hrefs[$i], ".jpg");

                $ico = strpos($hrefs[$i], ".ico");

                $png = strpos($hrefs[$i], ".png");

                if($raute === false) {

                    if($js === false) {

                        if($mailto === false) {

                            if($jpeg === false) {

                                if($gif === false) {

                                    if($jpg === false) {

                                        if($ico === false) {

                                            if($png === false) {

                                                $rel = $hrefs[$i];

                                                $com = absolute($url,$rel);

                                                $linksBreak .= $com."\n";

                                            }

                                        }

                                    }

                                }

                            }

                        }

                    }

                }

            }

        }

        

        $datei = fopen("data/sitemap.txt", "a");

        fwrite($datei, $url."\n");

        fclose($datei);

        

        $datei = fopen("data/backup.txt", "a");

        fwrite($datei, stripslashes($linksBreak));

        fclose($datei);



        $backupURLs = file_get_contents("data/backup.txt");

        $backupURLs = split("[\n]",$backupURLs);

        $backupURLs = array_unique($backupURLs);

        $datei = fopen("data/backup.txt", "w");

        fwrite($datei, "");

        fclose($datei);

        for($i=0;$i<=count($backupURLs);$i++) {

            $strpos = strpos($backupURLs[$i],$root);

            if($strpos===false) {

                //

            } else {

                if($backupURLs[$i]!="") {

                    $sitemapURLs = file_get_contents("data/sitemap.txt");

                    $sitemapURLs = split("[\n]",$sitemapURLs);

                    $ok = "ok";

                    for($j=0;$j<=count($sitemapURLs);$j++) {

                        if($sitemapURLs[$j]==$backupURLs[$i]) {

                            $ok = "ne";

                        }

                    }

                    if($ok=="ok") {

                        $datei = fopen("data/backup.txt", "a");

                        fwrite($datei, stripslashes($backupURLs[$i]."\n"));

                        fclose($datei);

                    }

                }

            }

        }

        

        weiter("normal");



    }



    /* ==========================================================================

        Nächste Seite scannen

    ==========================================================================*/

    function weiter($a) {

        if($num=="") {

            $num = 0;

        }

        $backupURLs = file_get_contents("data/backup.txt");

        $backupURLs = split("[\n]",$backupURLs);

        if($backupURLs[0]!="") {

            echo "<script type='text/javascript'>document.location = 'crawler.php?url=".urlencode($backupURLs[0])."';</script>";

        } else {

            echo "Sitemap fertig";

        }

    }

    



    /* Funktion für die absoluten Pfade */

    function absolute ($absolute, $relative) {

 

        // Link ist schon absolut

        if (preg_match(',^(https?://|ftp://|mailto:|news:),i', $relative))

            return $relative;

        // parse_url() nimmt die URL auseinander

        $url = parse_url($absolute);

        // dirname() erkennt auf / endende URLs nicht

        if ($url['path']{strlen($url['path']) - 1} == '/')

            $dir = substr($url['path'], 0, strlen($url['path']) - 1);

        else

            $dir = dirname($url['path']);

        // absoluter Link auf dem gleichen Server

        if ($relative{0} == '/') {

            $relative = substr($relative, 1);

            $dir = '';

        }

        // Link fängt mit ./ an

        elseif (substr($relative, 0, 2) == './')

            $relative = substr($relative, 2);

        // Referenzen auf höher liegende Verzeichnisse auflösen

        else while (substr($relative, 0, 3) == '../') {

            $relative = substr($relative, 3);

            $dir = substr($dir, 0, strrpos($dir, '/'));

        }

        // volle URL zurückgeben

        return sprintf('%s://%s%s/%s', $url['scheme'], $url['host'], $dir, $relative);



    }

    

?>
Crawler 2:
PHP:
<?php


    $url = $_POST['url'];

if ($url == ""){

?>
<form action="" method="post">

<input type="text" name="url" value="http://" />

</form>
<?php

}
else {
$array = get_meta_tags("".$url."");

$follow = $array[robots];


if ($follow == "noindex, follow"){
echo "
Kein Folow
";
} 
else {
echo $url;
echo "<br>";
echo "Keywords:<br>";
echo $array[keywords];
echo "<br>Sprache:<br>";
echo $array[language];
echo "<br>Beschreibung:<br>";
echo $array[description];
}}
?>
 
Zuletzt bearbeitet:
Hi,

also als erstes zwei allgemeine Sachen:
PHP:
$url = $_POST['url']; 

if ($url == "") { ...
sollte besser so aussehen:
PHP:
if(isset($_POST['url']))  {
    $url = $_POST['url'];
    ...
}
Desweiteren sind Leerstrings um eine Variable herum nutzlos und kosten möglicherweise sogar extra Rechenleistung. Also:
PHP:
$array = get_meta_tags("".$url."");
mit
PHP:
$array = get_meta_tags($url);
ersetzen.

Dann:
Wenn du beide zusammenbekommen willst, musst du nichts weiter tun, als im selben Script erst die eine Crawler-Funktion und dann die andere mit der URL durchzuführen. Also rufst du beispielsweise erst alle Metatags ab und verarbeitest sie und dann wühlst du dich durch die Links und verarbeitest diese weiter.

Das Weiterverarbeiten solltest du bestenfalls nicht mit einer rekursiven Methode lösen, da sich sonst dein Webserver beschweren wird. Vielleicht richtest du dir irgendwo (Textdatei, Datenbank ...) eine globale Liste ein mit gefundenen, aber noch nicht durchsuchten Adressen. Dein Crawler ruft dann immer eine Adresse ab, crawlt sich durch, fügt gefundene Links in die Liste ein und beendet die Suche auf der Seite mit einer Markierung des Listeneintrags "schon durchsucht". Dann geht er zum nächsten Eintrag.

Ach ja: Dass das Crawling kein Zuckerschlecken ist, sollte ja klar sein. Und sicherlich kannst du den Crawler von deinem localhost aus laufen lassen, allerdings wird deine Anbindung zum Netz sicherlich schlechter sein als die eines Webservers, der damit wohl schneller wühlen kann.

Gruß
 
1. Danke :D
2. Ja ich weiss das es kein Zuckerschlecken ist :D
3. Das mit dem Localhost will ich wegen dem Traffic machen und so kann ich dan amschluss alles noch mal durchsuchen

Wenn das Script fehler hatt werde ich mich noch mal melden :D
 
Zurück