PHP Counter wird durch crawlen verfälscht...
Erri
- programmiertechnik
0 Reiner0 Erri0 Reiner0 Frank Opper0 agapanthus0 Erri
0 Dennis
0 Erri
Hi an alle hier im Forum.
Ich beschäftige mich grad mit dem "Problem" Counter...
Zum Hintergrund
---------------------------------
Mein Counter nimmt die IP des Besuchers und schreibt diese mit einem Zeitstempel (TIME) in eine Datenbank Besucht der User die Seite öfters am selben Tag, ändert dies nichts an der Counter-Zahl, da die IP des Users erst nach einer Reloadzeit (24h) erneut in die DB geschrieben wird.
Soweit so gut
Nun wird meine Seite aber ebenfalls von gewissen Servern (z.B. Suchmaschinen Google, Yahoo, Alexa ) aufgesucht. Hierbei werden immer gleich mehrere (ca. 4-7) IPs in die DB geschrieben. Ein wirklicher Besucher war jedoch nicht auf meiner Seite und somit wird die Zahl leider verfälscht. Bisher habe ich diese IP
s gelegentlich von Hand gelöscht... *boar*
----------------------------------
Jetzt habe ich vor, dies zu automatisieren, jedoch habe ich dabei folgendes Problem, welches ich anhand von Google beschreiben möchte.
Google verwendet laut whois.ws den IP-Bereich 66.249.64.0 - 66.249.95.255. Jedesmal beim crawlen meiner Seite wird somit eine andere IP verwendet.
Und jede IP von Hand in ein Script (DELETE FROM tbl_counter WHERE IP
LIKE '66.249.64.%' OR ...) schreiben --> ist mir ehrlich gesagt etwas zu aufwendig?
Hat sich von euch schon einmal jemand mit dieser Thematik beschäftigt oder hat jemand eine Idee, wie ich die IP-Bereiche verwenden kann, ohne jede IP einzeln in ein Script zu schreiben?
Ich danke euch vielmals für eure Hilfe, Tipps Ideen
Gruß
Erri
Hi,
Ich beschäftige mich grad mit dem "Problem" Counter...
Zum Hintergrund
Mein Counter nimmt die IP des Besuchers und schreibt diese mit einem Zeitstempel (TIME) in eine Datenbank Besucht der User die Seite öfters am selben Tag, ändert dies nichts an der Counter-Zahl, da die IP des Users erst nach einer Reloadzeit (24h) erneut in die DB geschrieben wird.
Soweit so gut
Nun wird meine Seite aber ebenfalls von gewissen Servern (z.B. Suchmaschinen Google, Yahoo, Alexa ) aufgesucht. Hierbei werden immer gleich mehrere (ca. 4-7) IPs in die DB geschrieben. Ein wirklicher Besucher war jedoch nicht auf meiner Seite und somit wird die Zahl leider verfälscht. Bisher habe ich diese IP
s gelegentlich von Hand gelöscht... *boar*Jetzt habe ich vor, dies zu automatisieren, jedoch habe ich dabei folgendes Problem, welches ich anhand von Google beschreiben möchte.
Google verwendet laut whois.ws den IP-Bereich 66.249.64.0 - 66.249.95.255. Jedesmal beim crawlen meiner Seite wird somit eine andere IP verwendet.Und jede IP von Hand in ein Script (DELETE FROM tbl_counter WHERE
IP
LIKE '66.249.64.%' OR ...) schreiben --> ist mir ehrlich gesagt etwas zu aufwendig?Hat sich von euch schon einmal jemand mit dieser Thematik beschäftigt oder hat jemand eine Idee, wie ich die IP-Bereiche verwenden kann, ohne jede IP einzeln in ein Script zu schreiben?
meiner Meinung nach, ist es ein falscher Ansatz, schon vorab eine IP zu verwerfen. Wie unterscheidest Du denn zwei User mit gleicher IP?
Bzgl. Crawler wäre es vielleicht einfacher, Sie am Useragent zu erkennen. D.h. verwerfe Sie nicht, sondern untersuche das im Nachhinein in Deiner Auswertung.
Gruß
Reiner
Hi Reiner,
meiner Meinung nach, ist es ein falscher Ansatz, schon vorab eine IP zu verwerfen. Wie unterscheidest Du denn zwei User mit gleicher IP?
Zwei User und dieselbe IP? (Sag niemals nie), aber rein technisch gesehen funktioniert dies nicht, zumindestens zur selben Zeit...
Ich möchte auch nur IPs von Crawlern nach dem Besuch verwerfen... Diese verwenden statische IP
s, welche also nicht von "normalen" Surfern genutzt werden... Diese haben (meist) dynamische IP`s von Ihren Providern. Deswegen ja die vorgegebenen Bereiche.
Bzgl. Crawler wäre es vielleicht einfacher, Sie am Useragent zu erkennen. D.h. verwerfe Sie nicht, sondern untersuche das im Nachhinein in Deiner Auswertung.
Das möchte ich ja auch im Nachhinein tun...
Könntest du mir dies mit dem Useragent genauer erklären? Dies habe ich nicht ganz verstanden.
Viele Grüße und vielen Dank,
Erri
»» Zwei User und dieselbe IP? (Sag niemals nie), aber rein technisch gesehen funktioniert dies nicht, zumindestens zur selben Zeit...
Ich meinte auch nicht zur selben Zeit!
Ich möchte auch nur IP
s von Crawlern nach dem Besuch verwerfen... Diese verwenden statische IP
s, welche also nicht von "normalen" Surfern genutzt werden... Diese haben (meist) dynamische IP`s von Ihren Providern. Deswegen ja die vorgegebenen Bereiche.Bzgl. Crawler wäre es vielleicht einfacher, Sie am Useragent zu erkennen. D.h. verwerfe Sie nicht, sondern untersuche das im Nachhinein in Deiner Auswertung.
Das möchte ich ja auch im Nachhinein tun...Könntest du mir dies mit dem Useragent genauer erklären? Dies habe ich nicht ganz verstanden.
Na, zumindest Google verwendet sowas wie "Googlebot....".
Das kannst Du rausfiltern.
Gruß
Reiner
Hallo Erri,
Zwei User und dieselbe IP? (Sag niemals nie), aber rein technisch gesehen funktioniert dies nicht, zumindestens zur selben Zeit...
Warum nicht? Router mit NAT gibts ...
Viele Grüße
Frank
Moin.
Zwei User und dieselbe IP? (Sag niemals nie), aber rein technisch gesehen funktioniert dies nicht, zumindestens zur selben Zeit...
Doch. Und zwar dann, wenn die beiden Kollegen sind und über einen Proxy in Netz gehen. Du siehst dann nicht die IP der User sondern die Proxy-IP.
Und ein andere Fall: Alle User, die sich über denselben Provider einwählen teilen sich die Adressen aus dessen IP-Pool. Die IP, die Du jetzt hast, bekommt, wenn Du "aufgelegt" hast, sofort ein anderer. Und wenn der Provider noch Load-Sharing bei seinen Proxies macht, dann hast Du sogar während einer Session mehrere IPs.
Könntest du mir dies mit dem Useragent genauer erklären? Dies habe ich nicht ganz verstanden.
In jeden HTTP-Request steckt unter anderem auch ein Feld "User Agent" ((HTTP_USER_AGENT), das Du auswerten kannst.
Gruß Frank
Hi Frank,
Zwei User und dieselbe IP? (Sag niemals nie), aber rein technisch gesehen funktioniert dies nicht, zumindestens zur selben Zeit...
Doch. Und zwar dann, wenn die beiden Kollegen sind und über einen Proxy in Netz gehen. Du siehst dann nicht die IP der User sondern die Proxy-IP.
Das ist mir schon klar, aber dies wird wohl auf meiner Homepage im seltensten Fall so sein... Daher wäre es meiner Meinung nach unproblematisch, einen Besucher weniger zu zählen :-)
Und ein andere Fall: Alle User, die sich über denselben Provider einwählen teilen sich die Adressen aus dessen IP-Pool. Die IP, die Du jetzt hast, bekommt, wenn Du "aufgelegt" hast, sofort ein anderer. Und wenn der Provider noch Load-Sharing bei seinen Proxies macht, dann hast Du sogar während einer Session mehrere IPs.
Ein Besucher meiner Website hat seine Internet-Verbindung getrennt und ein anderer User bekommt die selbe IP... Wie wahrscheinlich wäre es, dass dieser User ebenalls auf meine Website kommt?
Könntest du mir dies mit dem Useragent genauer erklären? Dies habe ich nicht ganz verstanden.
In jeden HTTP-Request steckt unter anderem auch ein Feld "User Agent" ((HTTP_USER_AGENT), das Du auswerten kannst.
Danke für die Hilfe.
Gruß und Vielen Dank
Erri
Hi Erri,
Zwei User und dieselbe IP? (Sag niemals nie), aber rein technisch gesehen funktioniert dies nicht, zumindestens zur selben Zeit...
Wie dir bereits gesagt wurde, haben mehrere PC's, die hinter einen Route hängen die gleiche IP (auch zur gleichen Zeit, zumindest nach außen hin - intern gibts wieder andere IP's *g*).
Und das dürfte wohl in jedem Firmennetzwerk so sein...
Ich möchte auch nur IP
s von Crawlern nach dem Besuch verwerfen... Diese verwenden statische IP
s, welche also nicht von "normalen" Surfern genutzt werden... Diese haben (meist) dynamische IP`s von Ihren Providern. Deswegen ja die vorgegebenen Bereiche.
Nun, dann überlegen wir doch mal, wie wir es auf die "faule" Art anstellen könnten, alle entsprechenden IP's rauszuwerfen.
Du sagstest Google hätte die IP's von 66.249.64.0 bis 66.249.95.255, da gehen wir am besten mit einer for Schleife ran:
for($x = 64; $x <= 95; $x ++)
{
for($y = 0; $y <= 255; $y++)
{
$sql = "DELETE FROM
my_table
WHERE
ip = '66.149.".$x.".".$y.'
";
mysql_query($sql) OR die(mysql_error());
}
}
Durch einen Aufruf dieses Scriptes solltest du eigentlich alle entsprechenden IP's rauswerfen können. Wird aber vielleicht trotzdem noch etwas aufwendig, wenn du das für mehrere Robots machen musst....
Bzgl. Crawler wäre es vielleicht einfacher, Sie am Useragent zu erkennen. D.h. verwerfe Sie nicht, sondern untersuche das im Nachhinein in Deiner Auswertung.
Das möchte ich ja auch im Nachhinein tun...Könntest du mir dies mit dem Useragent genauer erklären? Dies habe ich nicht ganz verstanden.
Der Useragent ist eine Umgebungsvariable, die du in $_SERVER findest. Da steht im Idealfall eine Zeichenkette drin, die dir verrät, welches User Agent (= Browser) deine Seite aufgerufen hat. Beachte aber, dass ein Besucher diesen User Agenten nach Belieben fälschen kann, oft wird dies z.B. auch von einer Firewall gemacht.
MfG, Dennis.
Hi again,
for($x = 64; $x <= 95; $x ++)
{
for($y = 0; $y <= 255; $y++)
{
$sql = "DELETE FROM
my_table
WHERE
ip = '66.149.".$x.".".$y.'
";
mysql_query($sql) OR die(mysql_error());
}
}
Hm, warum wird dieser Code jetzt falsch angezeigt? Wenn man mal in die Antworten Box schaut, da steht er wieder richtig drin...
Also zur Sicherheit hier der Code nochmal ohne das Syntax Highlighting:
for($x = 64; $x <= 95; $x ++)
{
for($y = 0; $y <= 255; $y++)
{
$sql = "DELETE FROM
my\_table
WHERE
ip = '66.149.".$x.".".$y.'
";
mysql\_query($sql) OR die(mysql\_error());
}
}
MfG, Dennis.
--
Mein SelfCode: ie:{ fl:( br:> va:) ls:[ fo:) rl:( n4:# ss:) de:] js:| ch:{ sh:( mo:} zu:| [[decode](http://www.peter.in-berlin.de/projekte/selfcode/?code=ie%3A%7B+fl%3A%28+br%3A%3E+va%3A%29+ls%3A%5B+fo%3A%29+rl%3A%28+n4%3A%23+ss%3A%29+de%3A%5D+js%3A%7C+ch%3A%7B+sh%3A%28+mo%3A%7D+zu%3A%7C)]
Das Motto des SELFForums ist das \_self\_made, also das selbermachen. Deshalb sollte man bevor man irgendetwas fragt, immer erst öffentliche Quellen zu Rate ziehen!
And Again: Hi!
Hm, warum wird dieser Code jetzt falsch angezeigt? Wenn man mal in die Antworten Box schaut, da steht er wieder richtig drin...
Hier mal noch ein Screenshot: http://tutorial.riehle-web.com/selfforum/tmp/tmp2.gif
MfG, Dennis.
Hallo,
for($x = 64; $x <= 95; $x ++)
{
for($y = 0; $y <= 255; $y++)
{
$sql = "DELETE FROM
my_table
WHERE
ip = '66.149.".$x.".".$y.'
";
mysql_query($sql) OR die(mysql_error());
}
}
>
> Hm, warum wird dieser Code jetzt falsch angezeigt? Wenn man mal in die Antworten Box schaut, da steht er wieder richtig drin...
Christian Kruse hat ein neues Modul eingebaut, daß uneffizienten Code erkennt! ;-)
Im Ernst: warum gehst Du in der Schleife $y durch?
Du erfaßt doch sowieso alle von 0..255, d.h. mehr gibt es nicht, somit ist die Schleife unnötig, oder?
Gruß
Reiner
你好 Dennis,
Hm, warum wird dieser Code jetzt falsch angezeigt?
Weil du ihn falsch geschrieben hast... ;-) Syntax-Fehler, da fehlte ein
doppeltes Anfuehrungszeichen.
for($x = 64; $x <= 95; $x ++){
for($y = 0; $y <= 255; $y++) {
$sql = "DELETE FROM
my_table
WHERE
ip = '66.149.".$x.".".$y."'
";
mysql_query($sql) OR die(mysql_error());
}
}
再见,
CK
Hi Christian,
Hm, warum wird dieser Code jetzt falsch angezeigt?
Weil du ihn falsch geschrieben hast... ;-) Syntax-Fehler, da fehlte ein
doppeltes Anfuehrungszeichen.
Uuuups, peinlich, aber du hast natürlich recht ;-)
ip = '66.149.".$x.".".$y."'
^- Das hat gefehlt!
Hab dementsprechende gerade meinen Eintrag im BugTracker als "Not a Bug" gekenntzeichnet.
Nun aber zum nächsten:
mysql_query($sql) OR die(mysql_error());
Das "or" von mysql_error() wird als Operator rot hervorgehoben (bei mir), das OR hingegen, welches davor kommt und ein wirklicher Operator ist, wird nicht hervorgehoben...
Is ist a Bug? ;-)
MfG, Dennis.
Hi again,
mysql_query($sql) OR die(mysql_error());
Ich habs einfach noch nicht raus :-/
~~~php
mysql_query($sql) OR die(mysql_error());
Ach ja, könnte man das SH nicht noch in die Vorschau mit einbinden? Ich hatte z.B. gerade auf Vorschau geklickt, um zu sehen, ob das SH klappt, musste dann aber wieder feststellen, dass in der Vorschau SH deaktiviert ist - und na ja, was ich da abgeschickt habe war natürlich prompt Mist ;-)
Übrigens habe ich in der Vorschau auch die Textarea nicht so, wie ich selbige konfiguriert habe (cols gleich 100). Ist in meinen Augen ein "Bug - Annoyance" *g*
MfG, Dennis.
Hallo du da draußen,
for($x = 64; $x <= 95; $x ++){
for($y = 0; $y <= 255; $y++) {
$sql = "DELETE FROM
my_table
WHERE
ip = '66.149.".$x.".".$y."'
";
mysql_query($sql) OR die(mysql_error());
}
}
Sehe ich das richtig? Das äußerste for wird nicht als keyword erkannt, das innere aber schon. Außerdem werden keine normalen Klammern, und nur die geschweiften Klammern der inneren For-Schleife angezeigt.
Jaja, Christian, was hast du da bloß zusammengewerkelt... ;-)
Grüße von hier drinnen, aus Biberach an der Riss,
Candid Dauth (ehemals Dogfish)
--
Bismarck biss Mark, bis Mark Bismarck biss!
<http://cdauth.net.tc/>
ie:{ fl:( br: va:} ls:[ fo:| rl:( n4:( ss:) de:> js:( ch:| sh:( mo:) zu:|
» Nun, dann überlegen wir doch mal, wie wir es auf die "faule" Art anstellen könnten, alle entsprechenden IP's rauszuwerfen.
Du sagstest Google hätte die IP's von 66.249.64.0 bis 66.249.95.255, da gehen wir am besten mit einer for Schleife ran:
Das nennst du "faul"? :-) "Faul" geht so:
$sql = "DELETE FROM my_table WHERE LEFT(ip,7)='66.149.' AND INTERVAL(SUBSTR(ip,8,2),64,96)=1"
$sql = "DELETE FROM
my_table
WHERE
ip = '66.149.".$x.".".$y.'";
Warum machst du das so und nicht so: $sql = "... '64.149.$x.$y'";
Sprich: Wenn schon "doppeltes Anführungszeichen" dann Variablen gleich mit hinein.
Hi dedlfix,
Du sagstest Google hätte die IP's von 66.249.64.0 bis 66.249.95.255, da gehen wir am besten mit einer for Schleife ran:
Das nennst du "faul"? :-) "Faul" geht so:
$sql = "DELETE FROM my_table WHERE LEFT(ip,7)='66.149.' AND INTERVAL(SUBSTR(ip,8,2),64,96)=1"
Ich verneige mich zutiefst vor der "Majestät der Faulheit" :-P
Mit LEFT, INTERNAL, JOIN usw. hab ich mich noch nicht so wirklich beschäftigt.
Warum machst du das so und nicht so: $sql = "... '64.149.$x.$y'";
Sprich: Wenn schon "doppeltes Anführungszeichen" dann Variablen gleich mit hinein.
Prinzip. Mache ich es so wie ich es mache, dann zeigt mir mein Editor im Highlighting das auch als Variablen an.
MfG, Dennis.
» Ich verneige mich zutiefst vor der "Majestät der Faulheit" :-P
Wenn du schon mal fast unten bist, kannst du dich ja auch gleich etwas hinlegen und "Faulheit" üben. :-)
Mit LEFT, INTERNAL, JOIN usw. hab ich mich noch nicht so wirklich beschäftigt.
Nicht dass du da was verwechselst:
LEFT() ist eine simple String-Funktion
INTER_V_AL() zählt zu den Operatoren (wie z.B. =, <, >, IS NULL)
beides also ziemlich einfach.
Erst JOIN (tritt gelegentlich auch mit einem LEFT auf) gehört zur "hohen Kunst" der Tabellen-Verknüpfung.
Prinzip. Mache ich es so wie ich es mache, dann zeigt mir mein Editor im Highlighting das auch als Variablen an.
Du solltest dir überlegen, deinen Editor zu wechseln. Der Editor sollte ein Werkzeug sein, kein Meister, dem man sich beugt.
Hi dedlfix,
Nicht dass du da was verwechselst:
(...)
Ne, das war mir schon klar so, das MySQL Manual hilft ja auch weiter.
Prinzip. Mache ich es so wie ich es mache, dann zeigt mir mein Editor im Highlighting das auch als Variablen an.
Du solltest dir überlegen, deinen Editor zu wechseln. Der Editor sollte ein Werkzeug sein, kein Meister, dem man sich beugt.
Habe schon oft andere Editoren ausprobiert, aber irgendwie war ich bis jetzt noch mit keinem so zufrieden wie mit HomeSite 5.
MfG, Dennis.
» Habe schon oft andere Editoren ausprobiert, aber irgendwie war ich bis jetzt noch mit keinem so zufrieden wie mit HomeSite 5.
Hast du es statt eines Editors auch schon mal mit einer PHP-IDE probiert? z.B. PHPEdit
Hi dedlfix,
Hast du es statt eines Editors auch schon mal mit einer PHP-IDE probiert? z.B. PHPEdit
Hm, habe ich irgendwie noch nicht ganz verstanden. IDE - "Integrierte Entwicklungsumgebung" - was ist daran besser, als an meinem Editor (mit SH) plus meinem Apachen + MySQL und Browser?
Jetzt mal ganz einfach so doof gefragt ;-)
MfG, Dennis.
» » Hast du es statt eines Editors auch schon mal mit einer PHP-IDE probiert? z.B. PHPEdit
Hm, habe ich irgendwie noch nicht ganz verstanden. IDE - "Integrierte Entwicklungsumgebung" - was ist daran besser, als an meinem Editor (mit SH) plus meinem Apachen + MySQL und Browser?
Dass es nicht einfach nur ein Textbearbeitungsprogramm mit zusätzlichem Syntax-Highlighting ist, sondern eine auf PHP zugeschnittene Entwicklungsumgebung.
Zum Beispiel Debugger-Unterstützung: Du kannst schrittweise durch dein Script laufen und dabei alle Variablen anzeigen lassen.
Die Funktionsliste zur Codevervollständigung umfasst nicht nur starr alle PHP-Funktionen, sondern der Quelltext deines Scripts (inkludierte Dateien eingeschlossen) wird im Hintergrund geparst und auch die eigenen Funktionen, Klassen, Konstanten, Variablen werden berücksichtigt.
Ich nehme mal an, dass die Information, was was ist, vom Parser geliefert wird, so dass die Syntax-Auszeichnung im Gegensatz zu manch einem "Wald- und Wiesen-Editor" fehlerfrei arbeitet,
Um nur mal zwei wesentliche Fietschers zu nennen... ganz zu Schweigen von den vielen kleinen netten Sachen, die die Entwicklungsgeschwindigkeit erhöhen können.
Guten Morgen...
Ich danke euch allen für eure hilfreichen Antworten!
Ich werde wohl die Methode der for-Schleife wählen.
Gruß
Erri