<?php
$EXEC_TIME = time();
set_time_limit(60);
/*
Copyright by. dominique sandoz. jeko@gmx.ch. http://jeko.homelinux.com. 22:17. 01.10.2005.
Für: capi. @forum.jswelt.de.
*/
// Aufruf durch: http://jeko.cwsurf.de/spider.php?start=http://jeko.cwsurf.de/index.php
/*
Aufgabe:
- Verfolge interne Links (JEDEN und in unendlich Dimensionen)
- Speichern der HOSTS der EXTERNEN Links in eine MYSQL-DB
*** Interne Links
Kennzeichnung durch * /world/deutsch/ *
OHNE http://dmoz.org/World/Armenian/
*** Externe Links
Kennzeichnug durch
- DE-Domain (*.de)
- Links, welche nur aus Hostnamen bestehen und nicht auf explizite Dateien oder Verzeichnisse verweisen
Algorithmen:
n. Durchlauf
Startseite = n.ter Link aus Textdatei
1 -> Quellcode holen
2 -> Alles bis auf Links entfernen
3 -> Interne Links und Externe Links in 2 separate Arrays speichern
4 -> Externe in DB schreiben
4.2 -> Überprüfen ob Link nicht schon drin
5 -> Interne Links in Textdatei schreiben
5.2 -> Textdatei schon vorhanden?
5.3 -> Link schon drin?
5.4 -> Alle internen Links auf Seite in Textdatei?
JA
5.5 -> Script abbrechen
-> Textdatei löschen
-> ENDE DES DURCHLAUFS, ENDE VON SCRIPT
NEIN
5.5 -> nächster Durchlauf durch aufrufen von spider.php mit start = n+1 . Link in Textdatei
-> ENDE DES DURCHLAUFS
*/
//DB-Connect
include("datas.php");
$connection=mysql_connect($host,$user,$pw) or die("Verbindung konnte nicht hergestellt werden");
$dbco=mysql_select_db($db, $connection) or die("Datenbank konnte nicht ausgewählt werden");
// zuweisen von wichtigen Variablen
$start_site = $_REQUEST['start'];
if ($_GET['start'] != STATUS) { // wird die STATUSSeite angefragt?
ob_start();
// Host filtern
$host = str_replace("http://","",$start_site);
$host_arr = explode("/",$host);
$host = $host_arr[0];
unset($host_arr[0]);
$host = "dmoz.org";
// Verzeichnis filtern
$verz = array_reverse($host_arr);
unset($host_arr[0]);
$verz = implode("/",$host_arr);
$verz = rawurldecode("/".$verz);
echo '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head><title>SPIDER - '.$start_site.'-'.date("d.m.Y H:I:s").'</title>
</head>
<body style="background-color:#333; color:#fff;">';
// Prüfen ob Textdatei existiert
if (! isset($_GET['first_passed']) ) {
if (! file_exists("SPIDER_interne.txt")) {
$datei = fopen("SPIDER_interne.txt",a);
if (! $datei || ! fwrite($datei, "Diese Zeile bitte nicht loeschen!\r\n")) {
die ("<p style='color:#f00'>Konnte Textdatei SPIDER_interne.txt nicht erstellen.</p>");
}
else {
print "<p>Datei SPIDER_interne.txt erstellt.</p>";
}
fclose($datei);
}
$tabellen = mysql_list_tables("$db");
$tabellen_zahl = mysql_num_rows($tabellen);
$ergebnis = 0;
for ($t = 0; $t < $tabellen_zahl; $t++){
if (mysql_tablename($tabellen, $t) == "links"){
$ergebnis = 1;
}
}
if (! $ergebnis) {
$erg = mysql_query("CREATE TABLE `links` (`name` varchar(254) collate latin1_general_ci NOT NULL default '', PRIMARY KEY (`name`), FULLTEXT KEY `name` (`name`)) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;");
if ($erg) {
print "<p>Datenbank erstellt</p>";
}
else {
die("<p style='color:#f00;'>Datenbank konnte nicht erstellt werden!</p>");
}
}
set_time_limit(60);
$passed = 0;
}
else {
$passed = $_GET['first_passed'];
}
echo "<p>$verz</p>\n";
echo "<p>$host</p>\n";
/** 1 Quellcode holen **/
// File lesen und inhalt $content zuweisen
$before = ob_get_contents();
ob_clean();
readfile($start_site);
$content = ob_get_contents();
ob_clean();
// Ausgabe an Benutzer
echo $before;
echo "<p>Location: $start_site <br /> Gelesen...</p><br />";
/** 2 Links von QT trennen **/
$suchstring = '/<a .*href="(.*)".*>.*<\/a>/U';
preg_match_all($suchstring,$content,$treffer);
unset($treffer[0]); // Gesamte Übereinstimmungen löschen, nur den gematchten Ausdruck behalten (Werte in den href-Attributen der Links)
// Doppelte Einträge löschen
$treffer[1] = array_unique($treffer[1]);
/** 3 Externe und interne Links in zwei separate Arrays speichern **/
$externe = array();
$interne = array();
set_time_limit(60);
foreach ($treffer[1] as $value) {
if ($value == "/World/Armenian/") {
continue;
}
elseif (substr($value,0,strlen($verz)) == $verz && ! in_array($value."\r\n",file("SPIDER_interne.txt")) ) {
if (is_writable("SPIDER_interne.txt")) {
if (!$handle = fopen("SPIDER_interne.txt", "a")) {
die ("<p style='color:#f00;'>Kann die Datei nicht öffnen (Leserechte?)");
}
if (!fwrite($handle, $value."\r\n")) {
die( "<p style='color:#f00;'>Kann nicht in die Datei schreiben (Schreibrechte?)</p>");
}
print "<p style='color:#0f0;'>Interner Link $value in SPIDER_interne.txt geschrieben.</p>\n";
fclose($handle);
} else {
die("<p style='color:#f00;'>Die Textdatei SPIDER_interne.txt ist nicht beschreibbar oder existiert nicht!</p>\n");
}
$interne[] = $value;
}
elseif (preg_match("/^http:\/\/(.*)\.de\//U",$value,$ext_treffer)) {
$query = mysql_query("REPLACE links SET name='$ext_treffer[1].de'");
if ($query) {
print "<p style='color:#0f0;'>Externer Link $value in Datenbank geschrieben.</p>\n";
}
else {
print "<p style='color:#f00;'>Konnte $value nicht in Datenbank schreiben!</p>\n";
}
$externe[] = $value;
}
}
echo '<pre>';
print_r($interne);
print_r($externe);
echo '</pre>';
echo "<p>Refresh abgeschlossen</p>
</body></html>";
$host = str_replace("http://","",$start_site);
$host_arr = explode("/",$host);
$host = $host_arr[0];
$host = "dmoz.org";
$start = "http://".$host;
if (file("SPIDER_interne.txt") != FALSE) {
$arr = file("SPIDER_interne.txt");
$passed = $passed+1;
$start = $start.$arr[$passed];
echo "<!-- header('Location: http://" . $_SERVER["SERVER_NAME"]."/SPIDER/".rand()."/".$passed."/".$start.") -->";
header("Location: http://" . $_SERVER["SERVER_NAME"]."/SPIDER/".rand()."/".$passed."/".$start."");
}
else {
header("Location: http://" . $_SERVER["SERVER_NAME"] . $_SERVER["SCRIPT_NAME"]."?start=STATUS");
}
} else { // STATUSSeite wird angefragt
echo '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head><title>SPIDER - '.$start_site.'-'.date("d.m.Y H:I:s").'</title>
</head><body>
<h1>Spider-Status</h1>
<p>Hier sind die Einträge der Textdatei mit den internen Links und der Datenbank mit den externen Links</p>
<h2>Interne Links</h2>
<p>Folgenden Links wurde gefolgt</p>';
$files_array = file ('SPIDER_interne.txt');
unset($files_array[0]); // blind- Zeile nicht anzeigen
echo '<ul style="border:1px solid #aaa;">';
foreach ($files_array as $content) {
echo "<li>".htmlspecialchars($content)."</li>";
}
echo '</ul>
<h2>Externe Links</h2>
<p>Folgende Links wurden als externe Links erkannt und in die Datenbank geschrieben</p>
<ul style="border:1px solid #aaa;">';
$ergebnisse = mysql_query("SELECT * FROM links");
while ($row = mysql_fetch_row($ergebnisse)) {
echo "<li>$row[0]</li>";
}
echo '</ul>
<p>Spider by Dominique Sandoz</p>
<p><a href="http://validator.w3.org/uri=referer">XHTML valid</a></p>
</body>
</html>';
}
?>