CPANのpython版であるPyPIを見ても中々どのモジュールを使えば良いのか解らないなぁと思ったので、ダウンロード数でソートするサイトを作ってみました。名前はPyPI Rankingです。ややアレな響きがありますが、致し方ありますまい!本当はDjango-nonrelかKayframeworkを使いたかったのですが、app-engine-patchの練習用に取得したアプリケーションIDを使い回す関係で、仕方なしにapp-engine-patchを使っています。
アクセスはこちらから。
基本的にはダウンロード数でモジュールリストをソートしているだけです。一応タグごと作者ごとでもソートできます。最近は割とpythonには慣れてきているつもりだったのですが、上位に出てくるモジュールをことごとく使った事が無くて、まだまだ精進が足りないなぁと実感しています。
ちなみに現時点のダウンロード数で上位5は以下になります。常識ですか。そうですか。僕はsetuptoolsしか使った事ないですけども。
- PasteDeploy 1.3.3
- zc.buildout 1.4.3
- setuptools 0.6c11
- PasteScript 1.7.3
- zc.recipe.egg 1.2.2
またこのサイトはクローラの実験を兼ねていまして、PyPIのmodule listにに登録されている約9400個のモジュールの各ページを1日1回のペースでクローリングさせています。
1日分のリソース消費量でボトルネックとなりそうなのはCPU Timeで無料分の14%を消費しています。またIncomming Bandwidthも13%を消費していて、単純計算だと1日あたり7万リクエストで無料分のリソースは使い切ってしまいます。
なおスクレイパー部分のコードは以下です。特に複雑な処理はしていません。あ、でも正規表現処理にコンパイル済みオブジェクトを使ったらもう少し効率良いかもしれないですけども。
def handle_response(link, response): soup = BeautifulSoup(response) # get module name title = soup.find('title').string.strip() module_name = title.split(':')[1].strip() # get max download count table = soup.find('table', attrs={'class':'list'}) max = 0 if table: for td in table.findAll('td'): if re.match(r'^\d+$', str(td.string)): max = max if max > int(td.string) else int(td.string) # get author name author_list = [] author_names = unescape(soup.find('ul', attrs={'class':'nodot'}).find('li').find('span').string).strip() for author_name in [a.strip() for a in get_author_list(author_names)]: author = PyModuleAuthor.all().filter('name =', author_name).fetch(1) author = author and author[0] or PyModuleAuthor(name=author_name, lastupdate=(date.today() + timedelta(days=-1))) # for update author's counter author_list.append(author.put()) # store data # 以下省略
というわけで更新頻度にも寄りますが、無料分だとせいぜい数万件程度の小規模なデータしかクロールできませんね。ただtaskqueueを並列化すると、数十件/sec程度のスループットが出るので、有料リソースを使えば結構実用的なのかもしれませんが、それだったら自前でサーバ準備する方がコストパフォーマンスが良い気もしますね。継続して実験したいと思います。
関連する記事
タグ: app-engine-patch, pypi, python




[...] This post was mentioned on Twitter by えふえぬ野良, taichino. taichino said: Blogged Pythonモジュールをダウンロード数でソートするPyPI Ranking作った http://bit.ly/dA7wKH [...]