~rom1v/blog { un blog libre }

Extraire les recherches Google des logs Apache

Aujourd’hui, c’est un billet de distraction pour geeks.

Lister les recherches

Si vous utilisez Apache, voici une commande qui liste dans l’ordre alphabétique les recherches Google ayant permis aux internautes d’arriver sur vos sites :

php -r "echo urldecode(\"$(zgrep 'http://www\.google\.\w*/' /var/log/apache2/*|grep -o '[?&]q=[^&"]*'|cut -c4-)\");"|sort|uniq -c

EDIT 25/06/2011 : cette commande semble échouer lorsque la liste des recherches est trop longue, celle donnée à la fin du billet est donc à préférer.

(pour les autres moteurs de recherche, il faudrait s’inspirer de ce qu’ont fait les développeurs de Piwik)

Voici à quoi ressemble le résultat de la commande :

      1 ubtunu tiny tiny rss
      5 ubuntu
      1 ubuntu 10.04 change startup screen
      1 ubuntu 10.04 configurer compte messagerie hotmail dans couriel
      3 ubuntu 10.04 cryptage
      1 ubuntu 10.04 écran grub invisible au démarrage
      2 ubuntu 10.04 ecran noir nvidia 
      1 ubuntu 10.04 et video nvidia
      1 ubuntu 10.04 grub nvidia
      1 ubuntu 10.04 grub-pc couleur
      4 ubuntu 10.04 installation partition home chiffrée

Le texte correspond aux recherches, le numéro devant indique le nombre de fois où elles ont été effectuées.

Analyse

Billets les plus recherchés

Sans conteste, les deux billets qui amènent le plus d’internautes par Google concernent pluzz et apk.

Et parfois ça ne doit pas les aider beaucoup : certains recherchent par exemple “pluzz plus belle la vie” dans Google à partir d’Internet Explorer, je ne suis pas sûr que mon script shell pour pluzz réponde à leurs attentes.

Recherches insolites

Dans la liste, il y a forcément des recherches drôles ou étranges. En voici quelques unes que j’ai trouvées dans mes logs :

  • “clitoris.apk” : il y a vraiment une application pour tout !
  • “comment afficher 350 sous linux” : c’est si différent que sur les autres systèmes d’exploitation ?
  • “comment on invente une machine pour voler à usage individuelle” : dérober ou s’envoler ?
  • “du-ble-plein-les-poches es ce une arnaque” : sans doute…
  • “est-il possible de prelever de l’argent sans que ça se voit sur le compte” : je veux rester discret…
  • “l’ecran d’un ordinateur portable est de 14,1 pouce avec 1024*768 pixel quelle est la taille de l’ecran N*H en cm ?” : le moteur de recherche, j’en suis sûr, va comprendre ma question, faire le calcul, et me répondre…
  • “logiciel adopy” : comme ça se prononce !
  • “pour quel raison on doit interdire le zoo” : les animaux c’est dangereux !

Il y a certains sites qui s’amusent à référencer ce genre de recherches, par exemple Comment devenir un ninja gratuitement ?

N’hésitez pas à poster les vôtres…

Challenge

J’ai essayé d’écrire la commande la plus courte possible. Je n’ai pas réussi à faire moins de 129 caractères sans perdre d’information ou prendre plus de risque (par exemple on pourrait remplacer apache2 par a*2, mais c’est plus risqué).

Par contre, cette commande ne fonctionne pas correctement si l’on rajoute |less (on ne peut pas se déplacer avec haut et bas), je ne sais pas trop pourquoi ni comment le résoudre (si certains ont une idée).

Une autre commande, sans php (en 141 caractères), ne pose pas ce problème :

zgrep 'http://www\.google\.\w*/' /var/log/apache2/*|grep -o '[?&]q=[^&"]*'|cut -c4-|echo -e $(sed 's/$/\\n/;s/+/ /g;s/%/\\x/g')|sort|uniq -c

Si vous avez des astuces pour faire mieux que 129 (ou 141), ne vous gênez pas ;-)

Scripts

D’autres ont fait des scripts plus complets, qui permettent de récupérer des informations supplémentaires, par exemple la page sur laquelle l’internaute est arrivé en effectuant cette recherche…

Commentaires

®om

@Kooothor Tu as des \\ au lieu de \ sur ta capture d’écran…

Fugitif
php -r "echo urldecode(\"$(zcat -f /var/log/apache2/*|grep 'http://www\.google\.\w*/'|grep -o '[?&]q=[^&"]*'|cut -c4-)\");"|sort|uniq -c
bash: /usr/bin/php: Liste d'arguments trop longue

Marche po

Fugitif

Par contre

php5 -r "echo urldecode(\"$(cat /var/log/apache2/access.log |grep 'http://www\.google\.\w*/'|grep -o '[?&]q=[^&"]*'|cut -c4-)\");"|sort|uniq -c

marche très bien

®om

@Fugitif Qu’est-ce qui est important comme changement entre tes deux commandes ? php5 au lieu de php ou le fait de ne lire qu’un seul fichier de log ?

Et la commande donnée à la fin du billet fonctionne-t-elle mieux ?

Leto2

Pour réduire un peu la taille, remplacer “zcat truc|grep machin” par “zgrep machin truc” ;-)

®om

@Leto2 Merci, j’ai remplacé dans le billet, ça fait gagner 7 caractères (et j’ai appris quelque chose ^^).

Fugitif

C’est pas l’ajout du php5 qui arrange les choses, mais le faite de ne prendre en compte qu’un seul log de apache2. Chez moi j’ai modifier logrotate pour garder 52 fichiers en .gz, donc pas mal de boulot pour zgrep.

De toutes façon /usr/bin/php sur Ubuntu 10.04 n’est qu’un lien vers /etc/alternatives/php qui est lui même un lien vers /usr/bin/php5

La 2ème commande fonctionne mieux, mais serai plus lisible avec un |sort -nr à la fin pour afficher les recherches les plus utiliser en premier.

Là c’est trier par ordre alphabétique.

Francis

Je dis peut-être une connerie, mais en mettant * à la place de “http://”, qui ne sert pas a grand chose ?

Fugitif

@Francis

Ta commande ne fonctionne pas, par contre

zgrep 'www\.google\.\w*/' /var/log/apache2/*|grep -o '[?&]q=[^&"]*'|cut -c4-|echo -e $(sed 's/$/\\n/;s/+/ /g;s/%/\\x/g')|sort|uniq -c

fonctionne.

Un http:// en moins :-)

lekant

HS : Tu sais que ton post arrive en première page de la recherche “google plus” ? :D

®om

@lekant

En recherchant quoi ? La chaîne de caractères “google plus” ?

Si oui, c’est sans doute parce que tu es logué avec ton compte Google, et qu’il fait le lien avec ton Google reader. Car chez moi ce n’est pas le cas ^^

À ce sujet, lire Le risque de l’individualisation de l’internet.

lekant

“google plus”

tout simplement.

Fugitif

@lekant

la recherche “google plus” ne mène pas ici

Je vois d’ailleurs pas le lien entre google+ et se blog lol

lekant

Google orienterait ses recherches en fonction des partages Greader? vu que je partage souvent ce qu’il y a sur ce blog… eh bien au temps pour moi

Fugitif

La publicité ciblé c’est pas nouveau chez Google.

St3f

Par contre, cette commande ne fonctionne pas correctement si l’on rajoute |less (on ne peut pas se déplacer avec haut et bas), je ne sais pas trop pourquoi ni comment le résoudre (si certains ont une idée)

IDEE :: Est-ce que ceci te convient ?

( zgrep 'www\.google\.\w*/' /var/log/apache2/*|grep -o '[?&]q=[^&"]*'|cut -c4-|echo -e $(sed 's/$/\\n/;s/+/ /g;s/%/\\x/g')|sort|uniq -c) | less

En fait les parenthèses vont permettre au shell de créer un nouveau processus dans lequel sera effectuée ta commande et une fois ce processus terminé, le résultat sera finalement renvoyé dans l’ entrée standard de less. Il est possible que rien ne se passe à l’écran pendant que le processus s’exécute, cependant des qu’il sera terminé le résultat sera lu (ligne par ligne ce qui est plus souple pour les tres gros fichiers) par less.

®om

@St3f

Ce n’était pas la commande que tu as utilisée entre les parenthèses qui ne fonctionnait pas avec less, mais celle avec php.

Ceci étant dit, j’ai appliqué le principe à cette commande :

(php -r "echo urldecode(\"$(zgrep 'http://www\.google\.\w*/' /var/log/apache2/*|grep -o '[?&]q=[^&"]*'|cut -c4-)\");"|sort|uniq -c)|less

et ça ne fonctionne pas mieux avec less.

Mais bon, de toute façon la première commande que j’ai donnée avec php est à éviter, elle ne fonctionne que si le nombre de recherches est très faible.

St3f

Au temps pour moi …

C’est vrai que j’ai lu (un peu trop vite sûrement ;) ) les commentaires et avait cru comprendre que la commande (que j’ ai mis entre parenthèse dans mon dernier post) était celle qui fonctionnait mais, que son résultat n’était pas lu correctement avec “less”…

Désolé. Cela dit, peut-être que ma bourde aura servie à quelque lecteur :)

@+!

Sympa.

Je m’en sert pour mon proxy.

Par contre j’aimerai sortir les IP avec…

Les commentaires sont fermés.