Google pagerank를 알아내는 python코드

Python 2008. 1. 26. 00:09
테크노트 블로그 정말 간만에 씁니다.

서핑중에 Ruby로 된 Google PageRank Checker 라는 프로그램이 있어서 Python버전으로 단순 번역한 것입니다. 제가 루비를 안써봐서 익숙한 언어인 python으로 변경했습니다.ㅡㅡㅋ

자세한 코드 설명은 생략합니다.
구글툴바가 웹서핑시에 방문한 URL과 그 URL을 변환한 정수키값을 이용하여 툴바가 페이지랭크를 조회하는 유효한 URL을 생성하고, HTTP Request 결과로 받은 텍스트를 쪼개서 페이지랭크를 얻어오는 것이 로직의 전부입니다.
대부분의 코드는 URL을 정당한 키값으로 변환하는데 사용되었습니다.

MS-Windows 기반의 시스템에서 작동하기 위해서는 첫줄을 지우던가 적절히 고쳐야 될겁니다.

--------

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
Original version(ruby): http://snippets.dzone.com/posts/show/3284
"""
M = 0x100000000 # modulo for unsigned int 32bit(4byte)

class GooglePageRank:
def __init__(self, uri):
self.uri = uri
self.iurl = "info:%s" % uri

def m1(self, a, b, c, d):
return (((a + (M - b) + (M - c)) % M) ^ (d % M)) % M # mix/power mod

def i2c(self, i):
return [i & 0xff, i>>8 & 0xff, i>>16 & 0xff, i>>24 & 0xff]

def c2i(self, s, k=0):
try:
try: c0 = ord(s[k])
except: c0 = 0
try: c1 = ord(s[k+1])
except: c1 = 0
try: c2 = ord(s[k+2])
except: c2 = 0
try: c3 = ord(s[k+3])
except: c3 = 0
c2i = ((c3*0x100+c2)*0x100+c1)*0x100+c0
except:
c2i = 0
return c2i

def mix(self, a, b, c):
a %= M; b %= M; c %= M
a = self.m1(a, b, c, c>>13); b = self.m1(b, c, a, a<< 8); c = self.m1(c, a, b, b>>13)
a = self.m1(a, b, c, c>>12); b = self.m1(b, c, a, a<<16); c = self.m1(c, a, b, b>> 5)
a = self.m1(a, b, c, c>> 3); b = self.m1(b, c, a, a<<10); c = self.m1(c, a, b, b>>15)
return [a, b, c]

def old_cn(self, iurl = None):
if not iurl:
iurl = self.iurl
a = 0x9E3779B9; b = 0x9E3779B9; c = 0xE6359A60
size = len(iurl)
k = 0
while size >= k+12:
a += self.c2i(iurl, k); b += self.c2i(iurl, k+4); c += self.c2i(iurl, k+8)
a, b, c = self.mix(a, b, c)
k += 12
a += self.c2i(iurl, k)
b += self.c2i(iurl, k+4)
c += (self.c2i(iurl, k+8) << 8) + size
a, b, c = self.mix(a, b, c)
return c

def cn(self):
ch = self.old_cn()
ch = ((ch / 7) << 2) | ((ch - (ch / 13) * 13) & 7)
new_url = ""
for ii in range(20):
for i in self.i2c(ch):
new_url += chr(i)
ch -=9
return int("6%s" % self.old_cn(new_url))

def request_uri(self):
from urllib import quote
uri = "http://toolbarqueries.google.com/search?client=navclient-auto&hl=en&ch=%s&ie=UTF-8&oe=UTF-8&features=Rank&q=info:%s"
cn = self.cn()
quoted_uri = quote(self.uri, safe="")
return uri % (cn, quoted_uri)

def page_rank(self, uri=None):
if not uri:
uri = self.uri
else:
self.uri = uri
uri = self.request_uri()
from urllib2 import urlopen
doc = urlopen(uri)
return int(doc.read().split(":")[2])


def Main(cmdoptions, cmdargs):
for cmdarg in cmdargs:
pr = GooglePageRank(cmdarg).page_rank()
print "%4s/10 (%s)" % (pr, cmdarg)

return 0



if __name__ == "__main__":
import os, optparse
cmdparser = optparse.OptionParser(usage="%prog <uri> [<uri> ...]")
(cmdoptions, cmdargs) = cmdparser.parse_args()

os._exit(Main(cmdoptions, cmdargs))



--------
invalid-file

이 파일을 다운로드 받으셔도 됩니다.

실행 예제

실행 예제(클릭해서보세요); 꼭 URL은 ""로 묶어서 사용해야 Querystring의 &가 shell에 의해 잘못 해석되지 않습니다.


: