ページランク

最も主要なサーチエンジンGoogleでは各ページを重要度(人気?)の度合に応じて1から10までのページランクをつけて検索結果に反映するようなしくみになっている。単純ではないが基本的にはページランクが高い方が検索にヒットしやすい。
指定したページのページランクGoogleから取得するスクリプトをGaucheで書いてみた。

(use srfi-1)
(use rfc.http)

(define (page-rank-checksum uri)
    (format #f "8~8,'0x"
            (fold (lambda(x y h)
                    (let1 h1 (logxor h x y)
                          (logand (logior
                                   (ash h1 -23)
                                   (ash h1 9))
                                  #xffffffff)))
                  16909125
                  (circular-list  77 105 110 105 110 103  32  80
                                  97 103 101  82  97 110 107  32
                                 105 115  32  65  71  65  73  78
                                  83  84  32  71  79  79  71  76
                                  69  39  83  32  84  69  82  77
                                  83  32  79  70  32  83  69  82
                                  86  73  67  69  46  32  89 101
                                 115  44  32  73  39 109  32 116
                                  97 108 107 105 110 103  32 116
                                 111  32 121 111 117  44  32 115
                                  99  97 109 109 101 114  46)
                  (map char->integer (string->list uri)))))

(define (page-rank uri)
  (receive (result-number headers body)
           (http-get "www.google.co.jp"
                     (string-append
                      "/search?features=Rank&client=navclient-auto&ch="
                      (page-rank-checksum uri)
                      "&q=info:"
                      uri))
           (string->number ((#/:(\d?)\n/ body) 1))))

使ってみよう。

gosh> (page-rank "http://d.hatena.ne.jp/SaitoAtsushi/")
3

こんなもんかな。
これはGoogleToolbarを調べた結果から作った。しかし、チェックサムの種類は複数あるらしい。Google pagerank extensionではもっと複雑(計算量が多い)なチェックサムのようだ。何か意味があるのか気になる。
Document ID: 78a742f51eb7ff1634642d095e78c334