Amazon Product Advertising APIに対応

Python, Web No Comments »

洋書価格比較サイトで使っているAmazonのAPIを、先日公開されたProduct Advertising APIに更新しました。

Amazonのドキュメントにあったサンプルコードが間違っていたりもして、なかなか望む結果が得られませんでしたが、今のところ、正常に稼働しているようです。

最後まで引っかかっていたのは、生成したsignatureをエスケープし忘れていたところでした。お陰で、同じ内容を問い合わせているのに、リクエストがうまくいったり、エラーが出たりと挙動が一定しませんでした。失敗するURLのsignatureをよく見てみると、「+」が含まれていることに気づき、やっと問題を修正できました。

Pythonでは自前のライブラリを使っているんですが、Rubyの方はamazon-ecsに頼っているので、こちらは更新待ちです。

Product Advertising APIは秘密鍵が必要になるので、デスクトップアプリケーションを作れなそうなのが痛いなぁ。

PythonでExcelファイルの読み込み

Mac, Python No Comments »

ネットで公開されている「.xls」形式のExcelファイルを扱おうとすると、Office 2008 for MacNeoOfficeを使うのが基本でしょう。

ただ、やりたいことは、表計算ソフトの使用ではなく、データの表示と加工(CSV形式にしたり、HTMLとして出力したり)なのです。以下のような方法でできるのが理想。

  1. コマンドラインプログラムで加工
  2. GUIプログラムで加工

CocoaならどちらでもOKだろうと調べてみましたが、有益な情報にヒットせず。

そういえば、RubyでExcelファイルを扱う記事があったよなと、「Rubyist Magazine – Win32OLE 活用法 【第 2 回】 Excel」をみてみるも、残念なことに、どうもWindows環境じゃないとダメらしい。困った。

一応、Pythonのも調べてみてみたら、こちらのページを発見。

なんと、pyExceleratorを使えば、Windowsなしでエクセルのファイルを扱えるみたい。ただ、気がかりなのは、2005年以来更新されていない点。

そのあたりを更に調べてみると、「pyExcelerator以外の選択肢 – Ni chicha, ni limona -平均から抜けられない僕-」に辿り着きました。xlrdでも、Windows無しでの読み込みが可能だそうです。

早速easy_installでインストールして、READMEAPIに従って試してみると、あっさり成功。日本語も扱えそうで、一安心。

NewsgroupのFAQsによると、pyExceleratorからフォークしたxlwtを使えば、書き込みもできるらしい。ありがたいですね。

あとは、PyObjCでGUIを付けたいところですが、PyObjCを習得するのが大変そうです。

urllib2でValueError

Python No Comments »

杉並区に続き、練馬区立図書館でもスクレイピングをしてみようと、Pythonのurllib2でアクセスしてみると、ValueErrorに遭遇。

  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/socket.py", line 304, in read
    data = self._sock.recv(rbufsize)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/httplib.py", line 509, in read
    return self._read_chunked(amt)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/httplib.py", line 548, in _read_chunked
    chunk_left = int(line, 16)
ValueError: invalid literal for int() with base 16: ''

取得したデータをread()した時に、問題が発生しているみたい。他のURLでは起こらないので、データの方に問題があるとか?

ググってみると、PythonのIssue Trackerに報告があがってた。

» Issue 3721: invalid literal for int() with base 16: ” – Python tracker

こちらの書き込みに従い、MacPortsでPython 2.6.1をインストールして試してみると、問題なく成功。2.6.xでは修正されているようですね。

ただ、MacではPython 2.5.xをメインに使う予定なので、2.5が修正されないのはちょっと残念。

でも、バグを修正してくれた方々には、感謝。

杉並区立図書館の、「その日の新着図書」がわかるサイトを作ってみた

Python, Web, No Comments »

杉並区立図書館の、その日の新着図書が一目でわかるサイトを作ってみました。

スクリーンショット
» 杉並区立図書館 新着図書 更新情報 (非公式)

公式ホームページでは、一ヶ月間の新着図書が一度に表示されます。でも、毎日チェックしている身にとっては、その日入った本だけが知りたい情報だったりします。

数百冊リストアップされている図書情報から、脳内で前日との差分を取り出すのも、なかなか骨の折れる作業です。こういった単調で、面倒な定型作業は、人間ではなく、機械の方が適任でしょう。

このサイトを作ったお陰で、一度に数分から十数分かかっていた手動によるチェック作業が、数秒に短縮されました。

更新情報は、RSSでも出力するようにしてあるので、直接サイトにアクセスしなくても、livedoor ReaderGoogle リーダーのようなRSSリーダーでもチェックできます。

このサイトの利点

  • チェック時間の短縮
  • RSSリーダーでの購読が可能
  • ページ移動のためのクリックが不要に(クリック数: 10回→0回)
  • 新着図書の履歴を、過去までさかのぼれる

図書館側のメリット

新着図書をチェックしたいだけの利用者の方が非公式サイトを利用するようになれば、公式サイトへのアクセス負荷を軽減できます。RSSはFeedBurnerを介して配信しているので、高負荷になっても安心です。

杉並区立図書館のホームページは、たまに応答が遅くなったりすることもあったので、負荷軽減にもお役に立てるのではないかと思います。

仕組み

  1. Pythonの標準モジュール、urllib2でHTMLを取得。
  2. lxmlライブラリで、formの送信や、CSSSelectorクラスによるスクレイピング
  3. SQLAlchemyでSQLite3のデータベースにアクセスし、取得した図書情報がデータベースに無ければ、新着図書として記録
  4. PyRSS2Genを使って、RSS 2.0形式で出力
  5. サイトへのアクセスがあれば、PHPでデータベースから情報を読み込んで表示

以上の手順をcronに登録して、定時(10:00 AM)に自動実行しています。

lxmlによるスクレイピングの方法は、「Ian Bicking: a blog :: lxml: an underappreciated web scraping library」が大変参考になりました。lxmlは、RESTで取得したXMLデータをXPathで解析するために重宝していましたが、スクレイピングにも利用できるとは知りませんでした。cssselectメソッドが、すごく便利です。

まとめ

地域限定な、ちょっと便利なサイトですが、杉並区の図書館をご利用の方はお試しください。

» 杉並区立図書館 新着図書 更新情報 (非公式)

Google App Engineのhelloworldで、いきなり躓く

Mac, Python, Web No Comments »

ClipMenu 0.3.2のリリースも済んだので、Google App Engineの勉強を開始。ClipMenuのウェブサイトを、GAEを使って作成しようと計画中なのです。Djangoを利用すれば、多言語化したサイトができそうなので。

まずは、スタート ガイドのチュートリアルをしようと、App Engine SDKの1.1.7をインストール。helloworldで必要なファイルを作成し、dev_appserver.pyを実行したら、いきなり躓きました。

AttributeError: 'module' object has no attribute 'HTTPSHandler'

初っ端からエラーが出ると、テンション下がっちゃうよ。

たぶん同じ問題に遭遇した人がいるだろうと、Google Groupsで検索。予想通り、解決策が示されていました。

どうやら、必要なPythonのライブラリが足りていないようです。MacPortsでpy25-socket-sslをインストールすると、無事にdev_appserver.pyでウェブサーバーが起動しました。

そのサーバーの出力を見てみると、まだImportErrorが出ている模様。

Could not initialize images API; you are likely missing the Python "PIL" module. ImportError: No module named PIL

ついでにpy25-pilもインストールしておこうと思ったら、今度はインストールの途中でエラーが。

unable to execute -DNDEBUG: No such file or directory
error: command '-DNDEBUG' failed with exit status 1
Error: Status 1 encountered during processing.

またググってたどり着いたのがこちらのページ。

leopardにtrac – studio suncrest

ただ、言及先を見てみても、よくわからない。Pythonをインストールし直したりするのも、ちょっと嫌だし。とりあえず、もう一度試してみようと、zshの履歴からコマンドを再実行してみたら、なぜか成功しちゃった!

% sudo port install py25-pil                                               
Password:
--->  Building py25-pil with target build
--->  Staging py25-pil into destroot
--->  Installing py25-pil 1.1.6_0
--->  Activating py25-pil 1.1.6_0
--->  Cleaning py25-pil

どこが問題だったのか、ちょっと釈然としないんですが、ともかくApp Engineのチュートリアルが進められるようになって助かりました。

有益な情報、ありがとうございました!

Rails から web.py へ移行

DreamHost, Python, Slicehost No Comments »

BookFind.jpで使用するWebフレームワークを、Ruby on Railsからweb.pyに変更しました。サーバーは今まで通りSlicehostのVPS。Dreamhostは解約しました。

実際に移行をしたのは3週間ほど前なんですが、以前より随分と軽快に動作するようになりました。Railsは、自分の用途に対してはオーバースペックだったのと、うまく使いこなせなかったのが残念です。web.pyは他のフレームワークで標準装備されているような機能も付いてなかったりしますが、そこが逆にシンプルで良かったりもします。

テンプレートエンジンはweb.pyに付属のものではなく、Makoをチョイス。ドキュメントがちゃんとあるのと、使いやすさから選びました。ベンチマークの成績も良いようですね。テンプレート内にPythonのコードを書けるのも便利です。

Webサーバーはweb.pyの開発者さんも使っている、lighttpd。設定ファイルが読み書きしやすいです。LiteSpeedで、ブラウザベースの設定はかえって面倒だと感じたので、テキストベースの設定がちょうど良いです。lighttpdの設定の仕方は、Lighttpd – Linux Tipsがとても参考になりました。

RailsでのAjax用ライブラリはPrototypescript.aculo.usでしたが、今回はより新しいjQueryを採用しました。慣れると、すごく使いやすいです。使い方は『jQuery in Action』を読んで覚えました。リファレンス向きではありませんが、チュートリアル形式なので、一から勉強するには最適でした。

そのjQueryのファイルは、AJAX Libraries APIを通じて読み込まれるようにしています。jQueryのバージョンアップの手間が省けると同時に、インターネットの無駄なトラフィックも減らせて一石二鳥です。

そのほか、価格比較グラフの描画にGoogle Chart APIを使ったり、AJAX News Barで洋書関連のニュースを表示したりと、ちょっとGoogleに依存しすぎな気もします。アクセス解析もGoogle Analyticsですし、Googleからアクセスを遮断されでもしたら、大変そうです。

web.pyはCGI環境でも動くくらい軽快ですから、多機能を望まない方にはオススメのフレームワークです。

Tasko

Python, Web No Comments »

Tasko

web.py上で動いている、タスク管理サービス。作者さんによれば、Mac用ソフトのTaskpaperにインスパイアされてつくったとか。Taskpaperは、GTD (Getting Things Done)ツールとしては、結構有名みたいです。

web.pyでこんなツールも作れるんだなと、参考になりました。シンプルで、軽そうなのも良いですね。

WP Theme & Icons by N.Design Studio
Entries RSS Comments RSS ログイン