Webcrawlers buiten statistieken houden
Ik krijg erg veel bezoek van deze webcrawler:
Mozilla/5.0 (compatible; Yahoo! Slurp; http://help.yahoo.com/help/us/ysearch/slurp)
EDIT: en deze
ichiro/2.0 (http://help.goo.ne.jp/door/crawler.html)
msnbot/1.0 (+http://search.msn.com/msnbot.htm)
Is er een mogelijkheid om dit soort webcrawlers buiten je statieken te houden. Hij gebruikt steeds een ander ip-adres.
google is nog altijd je vriend elsy!
Die gegevens heb je natuurlijk in een variabele staan om weg te schrijven:
Code (php)
1
2
3
4
5
2
3
4
5
<?php
if ($var = "waarde" || $var=="andere waarde"){
// schrijf niet naar statistieken
}
?>
if ($var = "waarde" || $var=="andere waarde"){
// schrijf niet naar statistieken
}
?>
Wat wes zegt met die robots of je htaccess kan ook, maar dan blokkeer je de bots voor een sitebezoek, en niet alleen voor je statistieken.
Allow all
deny map map map map
Weet ik, maar het statistieken script is geïnclude in de main pagina waar de bezoekers komen. Snap je? En ik weet niet hoe het dan precies gaat bij geïnclude bestanden, of dat er dan een error komt en dat de bot geen beschikking heeft over een deel van de informatie die op de website staat.
Oké, maar is dat te doen?
Hoeveel webcrawlers zijn er of valt dit mee?
Je kan ze toevoegen in een array bijvoorbeeld. Of je maakt een nieuwe tabel waar je de gegevens uit kan halen.
Ik heb geen idee of er veel webcrawlers zijn, aan het aantal zoekmachines te zien wel, maar hoeveel daarvan ook echt zoveel crawlen weet ik niet.
Je kan ook de bots wel blokkeren zoals wes zegt, dat is de snelste/ gemakkelijkste oplossing. Maar ik weet niet hoe er dan wordt omgesprongen met je website in zoekmachines.
Ik kijk af en toe wel in mijn statistieken of ik weer een nieuwe zie.
Ik ga liever geen robots blokkeren.
Bedankt voor de tips.
Er is op internet een lijst met alle ip adressen e.d. van webcrawlers. Ik kan je al zeggen, dat zijn er veel. Als je al die ip adressen in wil voeren dan kan ik die pagina wel voor je opzoeken.
Als je dat zou willen doen, graag.
deze pagina vind je alle kenmerken die je nodig hebt om te achterhalen of je een crawler of een bezoeker op je site hebt.
Voila, op Ik heb het volgende geprobeerd. Klopt waarschijnlijk niet maar ik heb een poging gedaan :)
De gegevens komen uit een nieuwe tabel die "geentoegang" heet.
Code (php)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
<?php
$query = "SELECT adres,browser FROM geentoegang";
$result = mysql_query($query) or die ("Sorry maar kan de gegevens niet weergeven.");
$row = mysql_fetch_assoc($result);
if(in_array ($_SERVER['$row->adres']) || in_array ($_SERVER['$row->browser'])){
}else{
//voer alles in de database in
}
?>
$query = "SELECT adres,browser FROM geentoegang";
$result = mysql_query($query) or die ("Sorry maar kan de gegevens niet weergeven.");
$row = mysql_fetch_assoc($result);
if(in_array ($_SERVER['$row->adres']) || in_array ($_SERVER['$row->browser'])){
}else{
//voer alles in de database in
}
?>
Bedankt!
Niet helemaal:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
<?php
$query = "SELECT adres,browser FROM geentoegang";
$bots = array();
if($result = mysql_query($query)){
while($row = mysql_fetch_assoc($result)){
$bots[]=$row['adres'];
}
}
if(!in_array ($_SERVER['REMOTE_ADDR'], $bots)){//als het ip niet voorkomt
//voer alles in de database in
}
?>
$query = "SELECT adres,browser FROM geentoegang";
$bots = array();
if($result = mysql_query($query)){
while($row = mysql_fetch_assoc($result)){
$bots[]=$row['adres'];
}
}
if(!in_array ($_SERVER['REMOTE_ADDR'], $bots)){//als het ip niet voorkomt
//voer alles in de database in
}
?>
In_array werkt als volgt:
Code (php)
Edit:
let ook op het ! voor in_array() in de voorbeeldcode (1e codeblok van de post). Je hoeft dan geen else te gebruiken, het betekend als het ip_adres niet overeenkomt met 1 van de bots, dan gaat die de if in. :) Is weer een beetje korter
let ook op het ! voor in_array() in de voorbeeldcode (1e codeblok van de post). Je hoeft dan geen else te gebruiken, het betekend als het ip_adres niet overeenkomt met 1 van de bots, dan gaat die de if in. :) Is weer een beetje korter
Gewijzigd op 01/01/1970 01:00:00 door Robert Deiman
Hij zet mij en de bots er toch in.
Waarschijnlijk heb ik iets niet helemaal goed gedaan.
Heb ik de gegevens wel goed in de database gezet?
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
<?php
include("diversen.php");
//maak verbinding met de database
$connection = mysql_connect ($hostname,$user,$password) or die ( "Sorry maar ik kan geen contact maken met de database, probeer het later opnieuw of ververs uw browser.");
$db = mysql_select_db ($database, $connection) or die ("Sorry, maar ik kan de database niet openen.");
$queryadres = "SELECT adres FROM geentoegang";
$botsadres = array();
if($resultadres = mysql_query($queryadres)){
while($rowadres = mysql_fetch_assoc($resultadres)){
$botsadres[]=$rowadres['adres'];
}
}
$querybrowser = "SELECT browser FROM geentoegang";
$botsbrowser = array();
if($resultbrowser = mysql_query($querybrowser)){
while($rowbrowser = mysql_fetch_assoc($resultbrowser)){
$botsbrowser[]=$rowbrowser['browser'];
}
}
if(!in_array ($_SERVER['REMOTE_ADDR'], $botsadres) || !in_array ($_SERVER['HTTP_USER_AGENT'], $botsbrowser)){
//als het ip-adres en de browser niet voorkomt
//voer alles in de database in
// Gegevens voor een nieuw logboekitem verzamelen:
$datumtijd = date("Y-m-d H:i:s"); // Huidige datum
if (isset($_SERVER['REQUEST_METHOD'])) { // HTTP-methode
$methode = $_SERVER['REQUEST_METHOD'];
} else {
$methode = NULL;
}
if (isset($_SERVER['PHP_SELF'])) { // Huidige pagina
$pagina = $_SERVER['PHP_SELF'];
} else {
$pagina = NULL;
}
if (isset($_SERVER['HTTP_REFERER'])) { // Vorige pagina
$referer = $_SERVER['HTTP_REFERER'];
} else {
$referer = NULL;
}
if (isset($_SERVER['REMOTE_ADDR'])) { // Extern IP-adres
$ip_adres = $_SERVER['REMOTE_ADDR'];
} else {
$ip_adres = NULL;
}
if (isset($_SERVER['HTTP_USER_AGENT'])) { // Gebruikte browser
$browser = $_SERVER['HTTP_USER_AGENT'];
} else {
$browser = NULL;
}
// MySQL-toevoegquery opstellen:
$sql = "INSERT INTO `logboek` ";
$sql .= "(`logboek_id`, `datumtijd`, `methode`, `pagina`, `referer`, `adres`, `browser`) ";
$sql .= "VALUES ";
$sql .= "('', '$datumtijd', '$methode', '$pagina', '$referer', '$ip_adres', '$browser') ";
$sql .= "; ";
//maak verbinding met de database
$connection = mysql_connect ($hostname,$user,$password) or die ( "Sorry maar ik kan geen contact maken met de database, probeer het later opnieuw of ververs uw browser.");
$db = mysql_select_db ($database, $connection) or die ("Sorry, maar ik kan de database niet openen.");
mysql_query($sql) or die(mysql_error());
}
?>
include("diversen.php");
//maak verbinding met de database
$connection = mysql_connect ($hostname,$user,$password) or die ( "Sorry maar ik kan geen contact maken met de database, probeer het later opnieuw of ververs uw browser.");
$db = mysql_select_db ($database, $connection) or die ("Sorry, maar ik kan de database niet openen.");
$queryadres = "SELECT adres FROM geentoegang";
$botsadres = array();
if($resultadres = mysql_query($queryadres)){
while($rowadres = mysql_fetch_assoc($resultadres)){
$botsadres[]=$rowadres['adres'];
}
}
$querybrowser = "SELECT browser FROM geentoegang";
$botsbrowser = array();
if($resultbrowser = mysql_query($querybrowser)){
while($rowbrowser = mysql_fetch_assoc($resultbrowser)){
$botsbrowser[]=$rowbrowser['browser'];
}
}
if(!in_array ($_SERVER['REMOTE_ADDR'], $botsadres) || !in_array ($_SERVER['HTTP_USER_AGENT'], $botsbrowser)){
//als het ip-adres en de browser niet voorkomt
//voer alles in de database in
// Gegevens voor een nieuw logboekitem verzamelen:
$datumtijd = date("Y-m-d H:i:s"); // Huidige datum
if (isset($_SERVER['REQUEST_METHOD'])) { // HTTP-methode
$methode = $_SERVER['REQUEST_METHOD'];
} else {
$methode = NULL;
}
if (isset($_SERVER['PHP_SELF'])) { // Huidige pagina
$pagina = $_SERVER['PHP_SELF'];
} else {
$pagina = NULL;
}
if (isset($_SERVER['HTTP_REFERER'])) { // Vorige pagina
$referer = $_SERVER['HTTP_REFERER'];
} else {
$referer = NULL;
}
if (isset($_SERVER['REMOTE_ADDR'])) { // Extern IP-adres
$ip_adres = $_SERVER['REMOTE_ADDR'];
} else {
$ip_adres = NULL;
}
if (isset($_SERVER['HTTP_USER_AGENT'])) { // Gebruikte browser
$browser = $_SERVER['HTTP_USER_AGENT'];
} else {
$browser = NULL;
}
// MySQL-toevoegquery opstellen:
$sql = "INSERT INTO `logboek` ";
$sql .= "(`logboek_id`, `datumtijd`, `methode`, `pagina`, `referer`, `adres`, `browser`) ";
$sql .= "VALUES ";
$sql .= "('', '$datumtijd', '$methode', '$pagina', '$referer', '$ip_adres', '$browser') ";
$sql .= "; ";
//maak verbinding met de database
$connection = mysql_connect ($hostname,$user,$password) or die ( "Sorry maar ik kan geen contact maken met de database, probeer het later opnieuw of ververs uw browser.");
$db = mysql_select_db ($database, $connection) or die ("Sorry, maar ik kan de database niet openen.");
mysql_query($sql) or die(mysql_error());
}
?>
Het probleem is dat je in je array ook lege waarden krijgt. Als je de || (OR) in de controle if() veranded in && (AND) dan moet het wel goed gaan, want dan mag zowel de user_agent als het ip niet voorkomen in de array.
Edit:
Verdere uitleg:
In je tabel heb je niet en de useragent en het ip ingevuld. Als je die in een array stopt, komen er dus ook de lege ip's of useragents in. Met de OR in je if geef je aan dat die of niet in de 1 of niet in de ander voor mag komen. Als je daar EN van maakt controleerd die zowel op IP als op USER_AGENT, nu maar op 1 van 2-en.
Verdere uitleg:
In je tabel heb je niet en de useragent en het ip ingevuld. Als je die in een array stopt, komen er dus ook de lege ip's of useragents in. Met de OR in je if geef je aan dat die of niet in de 1 of niet in de ander voor mag komen. Als je daar EN van maakt controleerd die zowel op IP als op USER_AGENT, nu maar op 1 van 2-en.
Gewijzigd op 01/01/1970 01:00:00 door Robert Deiman
Nog even vervolgen vandaag.
Bedankt alvast.