Skip to content

Dynamischer unstrukturierter DOM Tree als Crawler Bremse

12. März 2009

Wie gehe ich am besten mit „Kindern“, „Scriptkiddies“ und Laien um? Naja der Ansatz ist einfach. Strukturiert suchen /crawlen kann man nur wenn der Code Struktur hat.

Also ist doch die Frage eine ganz einfache. „Wie bekommt man Struktur ins Aussehen ohne eine einheitliche DOM Struktur zu haben?“

Performant, effizient adaptiv das sind wohl wirklich Grundvorraussetzungen für sowas. Daraus folgt wohl das eine Templateengine der beste Platz ist. Als eine der verbreitesten PHP Template Engines hat ich dafür Smarty zur Hand genommen und das Problem mal exemplarisch implementiert.

Alles in allem war es ein recht gelungenes Experiment. Ein DOM Tree der sich dynamisch „zufällig“ verändert. Computer generierter Zufall ist jedoch relativ. Um eine statistische Berechnung auszuschließen müsste man eine Quelle ansprechen die bis dato echten Zufall erzeugt(z.B. das Rauschen eines Widerstands, etc).

Ein Vorteil von dieser Implementierungsweise ist das sie unter anderem auch cachebar ist.

Was diese Implementierung nicht ist:

  • nicht produktiv einsetzbar
  • nicht vollständig


Quellcode:

Pseudoklasse:

<?php
require_once 'Smarty/Smarty.class.php';
class CrawlerProtection
{
private $_template = null;
public function __construct()
{
$path = "www";
$this->_template = new Smarty();
$this->_template->template_dir = $path.'/'.'templates';
$this->_template->compile_dir = $path.'/'.'templates_c';
$this->_template->cache_dir = $path.'/'.'cache';
$this->_template->config_dir = $path.'/'.'config';
if (!is_writeable($this->_template->compile_dir) ||
!is_writeable($this->_template->cache_dir))
{   //return new Exception('Cannot write to template cache/compile dirs');
}
}
public function __destruct()
{
}
public function display()
{
$this->_template->assign('RANDOMVALUE',$path);
$this->_template->display("site.tpl");
}
}
$x = new CrawlerProtection();
$x->display();
?>

Pseudotemplate

{randomcrd assignvar=yourVar1}
{randomcrd assignvar=yourVar2}
{randomcrd assignvar=yourVar3}
<html>
</html>
<body>
<div>
{$RAND_yourVar3_O}
<h1>Title1</h1>
{$RAND_yourVar3_C}
<p>adsddsdsd dsasdsdasdaddds
dsads
{$RAND_yourVar3_O}
dsadddsd sad dsdasddsdsdd sda d ddads
{$RAND_yourVar3_C}
</p>
</div>
{$RAND_yourVar2_O}
<div>
<h1>Title2</h1>
{$RAND_yourVar1_O}
<p>
dsadsd dsadsddsds adas sdsd sad sds ds dsdsadasd
adsddsdd sdadsdsdd
{$RAND_yourVar3_O} dsdaddsad sdsadsad sddsd asdsd
adsdadasdasdasdsdas dasddsadsdd dsdsdsadasdas
dasdsaddsd sadsdsd dsdsadasdsdsads dsdsdasds
sdasddsdsd sdsdasdasdsdsads
{$RAND_yourVar3_C}
</p>
{$RAND_yourVar1_C}
</div>
{$RAND_yourVar2_C}

Smartyplugin code

<?php
/*
* Smarty plugin
* -------------------------------------------------------------
* Type:     function
* Name:     randomrdt
* Purpose:  DOM dynamics with simple random tags:
*
*
*    {randomrdt assignvar=yourVar}
*
*
*    Where yourVar can be anything. Then you'll get
*
* Author:   webdrafts
* Modified: 04.03.2009
* -------------------------------------------------------------
*/
function smarty_function_randomcrd($params, &$smarty)
{
if (!isset($params['assignvar']))
{    return;
}
$assignvar = $params['assignvar'];
srand((double) microtime() * 1000000);
$rand_decisionvalue = rand(1,4);
$rand_fillvalue = "";
switch ($rand_decisionvalue)
{
case 2: $rand_fillvalue = "div";
break;
case 3: $rand_fillvalue = "span";
break;
case 4: $rand_fillvalue = "font";
break;
}
if ($rand_fillvalue!="")
{
$smarty->assign("RAND_".$assignvar."_O", "<".$rand_fillvalue.">");
$smarty->assign("RAND_".$assignvar."_C", "</".$rand_fillvalue.">");
}
else
{
$smarty->assign("RAND_".$assignvar."_O", "");
$smarty->assign("RAND_".$assignvar."_C", "");
}
}
?>
Advertisements
2 Kommentare leave one →
  1. xisoiax permalink
    13. März 2009 9:58 am

    ich versteh die Sache schon, es ist aber nicht gut das du Block-elemente(div) mit nicht-blockelementen(span) mischst.
    Außerdem solltet man eine Kind-Klasse einrichten die CSS Einstellungen anpasst.

  2. webdrafts permalink*
    13. März 2009 10:11 am

    Die Implementierung ist rein exemplarisch.

    Die Anmerkung mit dem negativen Effekt des Mischen ist sicherlich eine gute Anregung für jemanden der das effektiv in seine Webseitengenerierung einbauen möchte.

    Als auch die CSS Einstellungen.

    Die Implementierung als solches ist aber nur als Pseudocode zu verstehen 😉

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s

%d Bloggern gefällt das: