Google pagerank를 알아내는 python코드
Python 2008. 1. 26. 00:09테크노트 블로그 정말 간만에 씁니다.
서핑중에 Ruby로 된 Google PageRank Checker 라는 프로그램이 있어서 Python버전으로 단순 번역한 것입니다. 제가 루비를 안써봐서 익숙한 언어인 python으로 변경했습니다.ㅡㅡㅋ
자세한 코드 설명은 생략합니다.
구글툴바가 웹서핑시에 방문한 URL과 그 URL을 변환한 정수키값을 이용하여 툴바가 페이지랭크를 조회하는 유효한 URL을 생성하고, HTTP Request 결과로 받은 텍스트를 쪼개서 페이지랭크를 얻어오는 것이 로직의 전부입니다.
대부분의 코드는 URL을 정당한 키값으로 변환하는데 사용되었습니다.
MS-Windows 기반의 시스템에서 작동하기 위해서는 첫줄을 지우던가 적절히 고쳐야 될겁니다.
--------
서핑중에 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에 의해 잘못 해석되지 않습니다.
'Python' 카테고리의 다른 글
Python String/Unicode translate() 함수 (0) | 2008.09.29 |
---|---|
python 디버그: line 번호 찍기 (0) | 2008.08.01 |
python 키 입력 받는 함수; input, raw_input, getpass (0) | 2008.07.13 |
python object의 멤버 attribute를 런타임에 생성하기 (0) | 2008.03.20 |
Python Built-in 가지고 놀기 (0) | 2007.08.30 |