2013-07-07 12 views
7

Ho creato un gestore di pubblicità piuttosto semplice per un sito Web in PHP.Escludere bot e spider da un contatore View in PHP

Dico di base perché non è complesso come gli annunci di Google o Facebook o anche la maggior parte degli ad server di fascia alta. Non gestisce pagamenti o altro o persino indirizza gli utenti.

Serve allo scopo per il mio sito a basso traffico se semplicemente per mostrare un banner pubblicitario casuale, conteggiare visualizzazioni di impressioni e clic.

Caratteristiche:

  • annuncio di slot/posizione a pagina
  • immagine
  • Banner
  • Nome
  • contatore Vista/impressione
  • Clicca contatore
  • di inizio e di fine, o senza fine
  • Disabilita/abilita annuncio

Tuttavia, desidero aggiungere gradualmente più funzionalità al sistema.

Una cosa che ho notato è che il contatore di Impressioni/visualizzazioni sembra spesso gonfiato.

Credo che la causa di questo è da ragni e robot di reti sociali così come spider dei motori di ricerca.

Ad esempio, se qualcuno immette un URL da una pagina del mio sito Web in Facebook, Google+, Twitter, LinkedIn, Pinterest e altre reti, tali siti spesso spideranno il mio sito per raccogliere le pagine Web Titolo, immagini e descrizione .

Mi piacerebbe molto essere in grado di disabilitare questo conteggio come impressioni pubblicitarie/conteggi delle visualizzazioni quando un vero essere umano non sta visualizzando la pagina.

Mi rendo conto che sarà molto difficile rilevarli tutti, ma se c'è un modo per ottenerne la maggioranza, almeno renderà le mie statistiche un po 'più accurate.

Quindi sto cercando aiuto o idee su come raggiungere il mio obiettivo? Si prega di non dire ad utilizzare un altro sistema di pubblicità, che non è nelle carte, grazie

enter image description here

+2

Si dovrebbe prendere in considerazione il filtraggio sulla user-agent. Tuttavia, un robot intelligente sarà sempre in grado di imitare un browser. – hexafraction

+0

Suggerirei di pubblicare un post su jax dopo il pageload con id di banner sulla pagina. Inoltre, puoi disabilitare questo script di aggiornamento in robots.txt –

risposta

11

È necessario pubblicare gli annunci con JavaScript. Questo è l'unico modo per evitare la maggior parte dei crawler. Solo i browser caricano dipendenze come immagini, JS e CSS. Il 99% dei robot li evita.

Si può anche fare questo:

// basic crawler detection and block script (no legit browser should match this) 
if(!empty($_SERVER['HTTP_USER_AGENT']) and preg_match('~(bot|crawl)~i', $_SERVER['HTTP_USER_AGENT'])){ 
    // this is a crawler and you should not show ads here 
} 

Avrai molto migliori statistiche in questo modo. Usa JS per gli annunci.

PS: Si potrebbe anche provare a impostare un cookie nel JS e successivamente la verifica per esso. I crawler potrebbero ricevere i cookie inviati in PHP da HTTP, ma quelli impostati in JS, con il 99,9% di possibilità che si perdano. Perché hanno bisogno di caricare un file JS e interpretarlo. Questo è fatto solo dai browser.

+0

Questa soluzione sembra essere la migliore a questo punto, ma per un'app pubblicita 'sviluppata da me non raccomanderei, i crawler evolvono ad un ritmo molto alto. Poiché sempre più siti Web utilizzeranno js per convalidare gli utenti, i crawler lo implementeranno anche ... –

+0

@alexalex ** No non lo faranno, come JS risponde all'input dell'utente. ** Mouse, tastiera e così ... così a il crawler non può generare tutte le combinazioni di quell'input e tenere traccia di ciò che sta facendo il JS. Google include JS mentre scatta istantanee di pagine per l'anteprima. Ma rimangono bloccati anche sul layer 'onLoad' e nessuno dell'interattività. * Quindi ... NO.* Nessun crawler interno giustifica il caricamento di JS, ora e nel prossimo futuro. – CodeAngry

+0

Mi piace il grassetto ... http://www.emoticode.net/python/rendered-javascript-crawler-with-scrapy-and-selenium-rc.html cosa intendi per prevedibile? da come? stiamo parlando di un gestore di pubblicità, quindi posso vedere molti motivi per creare un crawler che colpirà gli annunci ... Volevo solo dire che qualsiasi soluzione per il rilevamento spider/bot questo campo è una soluzione solo per il dato tempo -> deve essere costantemente aggiornato ... dicendo che l'uso di js è il migliore è corretto (ho svalutato la risposta) ma questa è la soluzione per un futuro prevedibile ... Non ne sono così sicuro ... –

0

Si potrebbe fare qualcosa di simile: C'è una buona lista dei cingoli in formato testo qui: http://www.robotstxt.org/db/all.txt

supporre che hai raccolto tutti gli agenti utente in quel file in un array chiamato $botList

$ua = isset($_SERVER['HTTP_USER_AGENT']) ? strtolower($_SERVER['HTTP_USER_AGENT']) : NULL; 

if($ua && in_array($ua, $botList)) { 
    // this is probably a bot 
} 

Naturalmente, l'agente utente facilmente può essere cambiamento d o potrebbe mancare a volte, ma i motori di ricerca come Google e Yahoo sono onesti su se stessi.

+0

-1 Non stai insegnando a guardare attraverso 256 KB di programmi utente e confrontare le stringhe con così tante possibilità! Non gli stai dicendo di uccidere l'esibizione del suo sito web! Destra? – CodeAngry

+0

Hai controllato quell'elenco? Ho detto di prendere solo il testo degli user agent e metterli in un array. E intendevo non in runtime, una volta con la codifica manuale. Ciò non avrebbe quasi alcun effetto sulle prestazioni. Il tuo atteggiamento è molto non costruttivo. – keune

+0

È molto non costruttivo :) E sempre pro-performance. Leggi la mia risposta per vedere il mio atteggiamento. – CodeAngry

0

Un crawler scaricherà robots.txt, anche se non lo rispetta e lo fa per curiosità. Questa è una buona indicazione che potresti avere a che fare con una, anche se non è definita.

È possibile rilevare un crawler se visita un numero enorme di collegamenti in un tempo molto breve. Questo può essere piuttosto complicato da fare nel codice però.

Ma questo è possibile solo se non si desidera o non è possibile eseguire Javascript. Altrimenti vai con la risposta di CodeAngry.


Edit: In risposta a @ di Keune risposta, si potrebbe tenere tutte gli IP di visitatori e farli passare attraverso la lista in un job cron, quindi pubblicare il conteggio dei visitatori aggiornato.

+1

** Eseguo la scansione del Web come un matto ma non mi preoccupo mai di 'robots.txt';) ** Inoltre, l'accesso al' robots.txt' può essere eseguito da 'raw access logs 'o' generando il file in php'. Complicano un po 'le cose e non impediscono ai crawler loschi ... ** La velocità di accesso può essere un indicatore **, ma quasi sempre carico una pagina da ciascun dominio durante la scansione. E può strozzare gravemente l'accesso in scrittura del DB se non eseguito correttamente. – CodeAngry

+0

Sei un ragno maleducato allora. – rath

+2

Sono un ** spider SEO **. Siamo tutti uguali :) Perché vorresti rimanere fuori quando devi passare inosservato ... – CodeAngry

0

Prova questa:

if (preg_match("/^(Mozilla|Opera|PSP|Bunjalloo|wii)/i", $_SERVER['HTTP_USER_AGENT']) && !preg_match("/bot|crawl|crawler|slurp|spider|link|checker|script|robot|discovery|preview/i", $_SERVER['HTTP_USER_AGENT'])) { 
    It's not a bot 
} else { 
    It's a bot 
}