huhtikuu 09, 2004

Web-sivujen refererien kaivaminen perlillä

"Miltä sivuilta on linkki tälle yhdelle käytössäni olevalle sivulle?" on mielenkiintoinen kysymys. Siihen vastaavat monet webbilokianalysaattorit, mutta tarvitsin itse hyvin yksinkertaisen työkalun, siispä tein sen Perlillä. Käyttäminen vaatii Perl-tulkkia, vähän ohjelmakoodin ymmärrystä ja mahdollisuuden- saada omaan sivustoon liittyvä http-palvelimen lokitiedosto käyttöönsä.

Koodi on kaikessa kauneudessaan tässä:


#!/usr/bin/perl -w

# Skriptin perustietorakenne: hash, jossa avaimina
# sivujen urlit. Arvoina on viittaus hashiin, jossa
# puolestaan avaimena refererit ja arvoina kunkin
# refererin esiintymislukumäärä
my %urlit;

while (<STDIN>) {
  
  my @f = split;

  # Url esiintyy lokissa 7. sarakkeessa -- muuta tarvittaessa
  my $url = $f[6];

  # Referer-osoite on 11. sarakkeessa (lainausmerkkeihin suljettuna)
  my $ref = $f[10]; $ref =~ s/\"//g;

  next if ($ref eq '-');

  # Jos haluat nähdä myös oman saittisi sisäiset viittaukset,
  # kommentoi seuraava rivi:
  next if ($ref =~ /^http:\/\/(www\.)?heikniemi\.net\//i);

  # Onko Google-haun tulos?
  if ($ref =~ /http:\/\/www\.google.*q=([^&]+)/) {
    my $hakusana = $1;
    $hakusana =~ tr/[+]/[ ]/;
    $ref = "Google-haku: $hakusana";
  } 
  # Onko Google-kuvahaun tulos?
  elsif ($ref =~ /http:\/\/images\.google.*imgurl=([^&]+)/) {
    $ref = "Google-kuvaosuma: $1";
  }

  # Jos tätä urlia ei vielä ollut esiintynyt, luodaan
  # sille tyhjä ali-hash
  if (!defined $urlit{$url}) {
    $urlit{$url} = {};
  }

  if (!defined $urlit{$url}->{$ref}) {
    $urlit{$url}->{$ref} = 1;
  }
  else {
    $urlit{$url}->{$ref}++;
  }
}

# Tulostetaan tulokset urleittain aakkosissa, ja
# niiden sisällä refererit esiintymiskertojen mukaan

foreach $url (sort keys %urlit) {
  print "$url\n" . "-" x length($url) . "\n";
  my %refs = %{$urlit{$url}};

  foreach $ref (sort {$refs{$b} <=> $refs{$a}} keys %refs) {
    printf("%5d  %s\n", $refs{$ref}, $ref);
  }

  print "\n";
}


Ja syntaksiksi käy esimerkiksi: type munloki.txt | perl tilasto.pl

Tuloksena tulee tämännäköisiä tulosteita:

/rikoslaki/rl49.html
--------------------
    2  http://www.cs.tut.fi/~jkorpela/tekoik/tekl.html
    1  Google-haku: rikoslaki 49
    1  Google-haku: Teollisoikeusrikos
Posted by Jouni Heikniemi at 09.04.04 10:50
tietotekniikka