#!/usr/bin/perl -w # search_rank2.plx # more full-featured search-ranking script: multiple engines, # multiple search queries, Web-based output. use strict; use WWW::Search; # configuration: my $max_results = 50; my $base_url = 'http://www.devicelink.com/'; my @engines = qw(AltaVista Google Lycos); my $result_fs_path = '/w1/e/elanus/search_rank'; my $result_web_path = '/search_rank'; my $index_file = "$result_fs_path/index.html"; my %data; # HoH: primary key: engine name. secondary key: query string. # value: rank # see end of script, after the __END__ token, for list of search queries my $url_pattern = quotemeta($base_url); chomp(my @queries = ); foreach my $engine (@engines) { my $engine_dir = $result_fs_path . '/' . $engine; unless (-e $engine_dir) { mkdir $engine_dir or die "can't mkdir '$engine_dir': $!"; } my $search = new WWW::Search($engine); $search->maximum_to_retrieve($max_results); foreach my $query (@queries) { my $query_dir = clean_name($query); my $result_dir = $engine_dir . '/' . $query_dir; unless (-e $result_dir) { mkdir $result_dir or die "can't mkdir '$result_dir': $!"; } my $detail_file = "$result_fs_path/$engine/$query_dir/index.html"; my $detail_url = "$result_web_path/$engine/$query_dir/"; my $localtime = localtime; open DETAIL, "> $detail_file" or die "can't open $detail_file for writing: $!"; print DETAIL <<"EOF"; $engine results for '$query'

$engine results for '$query'

Report run $localtime

All results

EOF $data{$engine}{$query} = my $rank = 'None'; my $count = 1; $search->native_query(WWW::Search::escape_query($query)); while (my $result = $search->next_result()) { if ($rank eq 'None' and $result->url =~ /$url_pattern/o) { $data{$engine}{$query} = $rank = $count; } my $url = $result->url; my $title = $result->title || $result->url; my $description = $result->description || 'None provided'; print DETAIL <<"EOF"; EOF ++$count; } print DETAIL <<"EOF";
Rank Site
$count $title
$url
$description
EOF close DETAIL; } } my $localtime = localtime; open INDEX, "> $index_file" or die "can't open $index_file for writing: $!"; print INDEX <<"EOF"; $0 results

$0 results for $base_url

Report run $localtime

EOF my @engine_links = map { qq{$_} } sort @engines; print INDEX '

', join(' | ', @engine_links), "

\n"; foreach my $engine (sort keys %data) { print INDEX qq{

$engine

\n}; print INDEX <<"EOF"; EOF foreach my $query (sort keys %{$data{$engine}}) { my $query_dir = clean_name($query); print INDEX <<"EOF"; EOF } print INDEX <<"EOF";
Query Rank
$query $data{$engine}{$query}

Return to top of page

EOF } print INDEX "\n"; close INDEX; sub clean_name { # accept a string, turn whitespace to underscores and # remove non-alphanumeric chars, and return it. my $name = shift; $name =~ s/\s+/_/g; $name =~ s/\W+//g; $name; } __END__ medical device medical manufacturing medical manufacturing suppliers stainless steel tubing