5月 13
洋書価格比較サイトで使っているAmazonのAPIを、先日公開されたProduct Advertising APIに更新しました。
Amazonのドキュメントにあったサンプルコードが間違っていたりもして、なかなか望む結果が得られませんでしたが、今のところ、正常に稼働しているようです。
最後まで引っかかっていたのは、生成したsignatureをエスケープし忘れていたところでした。お陰で、同じ内容を問い合わせているのに、リクエストがうまくいったり、エラーが出たりと挙動が一定しませんでした。失敗するURLのsignatureをよく見てみると、「+」が含まれていることに気づき、やっと問題を修正できました。
Pythonでは自前のライブラリを使っているんですが、Rubyの方はamazon-ecsに頼っているので、こちらは更新待ちです。
Product Advertising APIは秘密鍵が必要になるので、デスクトップアプリケーションを作れなそうなのが痛いなぁ。
2月 17
gooのWebクローラの「ichiro」が、robots.txtに従ってくれずに、困ってしまいます。ichiroを”Disallow”に加えたのに、BookFindに、10秒おきに連続アクセスし続けるのです。
「Webクローラについて – goo ヘルプ」には、「robots.txt に従います」と書かれているんですが、約一ヶ月ほど様子を見ても、いっこうに改善が見られません。
「ichiroがウザいです。 – freefielder.jp」でも、同じようにgooのbotに困っている方がいるようです。
仕方がないので、ウェブサーバーのlighttpdでアクセス拒否をすることにしました。以下のサイトが参考になりました。
この三行をlighttpdの設定ファイルに追加しました。
$HTTP["useragent"] =~ "ichiro" {
url.access-deny = ( "" )
}
アクセスログに、リアルタイムで”ichiro”のアクセスに対して403を返しているのが記録されていくので、きちんと設定が反映されているようです。
検索サイトのbotが来ること自体はかまわないんですが、もう少し、サーバーに優しくアクセスして頂けると助かります。
2月 13
杉並区立図書館の、その日の新着図書が一目でわかるサイトを作ってみました。
» 杉並区立図書館 新着図書 更新情報 (非公式)
公式ホームページでは、一ヶ月間の新着図書が一度に表示されます。でも、毎日チェックしている身にとっては、その日入った本だけが知りたい情報だったりします。
数百冊リストアップされている図書情報から、脳内で前日との差分を取り出すのも、なかなか骨の折れる作業です。こういった単調で、面倒な定型作業は、人間ではなく、機械の方が適任でしょう。
このサイトを作ったお陰で、一度に数分から十数分かかっていた手動によるチェック作業が、数秒に短縮されました。
更新情報は、RSSでも出力するようにしてあるので、直接サイトにアクセスしなくても、livedoor ReaderやGoogle リーダーのようなRSSリーダーでもチェックできます。
このサイトの利点
- チェック時間の短縮
- RSSリーダーでの購読が可能
- ページ移動のためのクリックが不要に(クリック数: 10回→0回)
- 新着図書の履歴を、過去までさかのぼれる
図書館側のメリット
新着図書をチェックしたいだけの利用者の方が非公式サイトを利用するようになれば、公式サイトへのアクセス負荷を軽減できます。RSSはFeedBurnerを介して配信しているので、高負荷になっても安心です。
杉並区立図書館のホームページは、たまに応答が遅くなったりすることもあったので、負荷軽減にもお役に立てるのではないかと思います。
仕組み
- Pythonの標準モジュール、urllib2でHTMLを取得。
- lxmlライブラリで、formの送信や、CSSSelectorクラスによるスクレイピング
- SQLAlchemyでSQLite3のデータベースにアクセスし、取得した図書情報がデータベースに無ければ、新着図書として記録
- PyRSS2Genを使って、RSS 2.0形式で出力
- サイトへのアクセスがあれば、PHPでデータベースから情報を読み込んで表示
以上の手順をcronに登録して、定時(10:00 AM)に自動実行しています。
lxmlによるスクレイピングの方法は、「Ian Bicking: a blog :: lxml: an underappreciated web scraping library」が大変参考になりました。lxmlは、RESTで取得したXMLデータをXPathで解析するために重宝していましたが、スクレイピングにも利用できるとは知りませんでした。cssselectメソッドが、すごく便利です。
まとめ
地域限定な、ちょっと便利なサイトですが、杉並区の図書館をご利用の方はお試しください。
» 杉並区立図書館 新着図書 更新情報 (非公式)
11月 26
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のチュートリアルが進められるようになって助かりました。
有益な情報、ありがとうございました!
7月 13
Amazonに倣って、BookFind.jpでも「前のページ」と「次のページ」の移動に、キーボード・ショートカットを割り当ててみました。
洋書のカテゴリをブラウズ中に、「前のページ」に戻る場合にはPキーを2回、「次のページ」に進む場合はNキーを2回押と、リンクをクリックすることなくページを移動できます。
アマゾンのサイトでも重宝している機能で、こちらではjQueryを利用しました。Internet Explorerでイフェクトが綺麗に出ないのが、ちょっと残念なところ。
7月 12
Amazon.comで洋書を物色していると、ふとAmazon.co.jpでの値段が気になったりします。
アマゾンのページでASINかISBNをコピーして、BookFind.jpで検索すれば目的は果たせるわけですが、手作業でこれをするのはちょっと面倒なものです。
そこで作ってみたのが、このブックマークレット。Amazon.com、Amazon.co.uk、Amazon.co.jpの洋書ページから、BookFind.jpの当該ページへ、ワンアクションで移動できます。
» 「Bookfind.jpで洋書価格を比較」するブックマークレット – BookFind.jp – 洋書価格比較サイト
JavaScriptのコードは、こんな感じになります。
var u=location.href;
var d="http://www.amazon.co(m|.uk|.jp)/";
var m=u.match(new RegExp(d+"(gp/product|.*?/dp)/([0-9]{9}[0-9x])"));
if (m && (m.length >= 4)) {
var asin=m.pop();
location.href='http://bookfind.jp/isbn/'+asin;
}
else {
window.alert('Amazonで、対象とする洋書のページを開いてから使用してください。');
}
このコードをbookmarkletterを使ってbookmarkletに変換しました。bookmarkletterのおかげで、ブックマークレットの作成がずいぶんと楽になりました。作者さんに、感謝です。
bookmarklet作成に役立つサイトには、Bookmarklet Builderもあります。こちらは、bookmarkletを読みやすいJavaScriptコードに整形できるのが便利です。
7月 10
「【ハウツー】Web開発者必見! jQuery UI ウィジェット3選」に触発されて、BookFind.jpにjQuery UIを導入してみました。
今回採用したのは、TabsとEffect “Pulsate”のふたつ。
jQuery UI Tabs
Amazonのカスタマーレビューを表示する際に、日本、米国、英国をタブで切り替えられるようにしました。タブパネル内のデータ取得はオンデマンドで行うので、レビューに興味のない方は不要なデータを読み込む必要が無く、ページのロードが早くなります。
タブのデザインは、ThemeRollerで配布されている、「Smoothness」をそのまま使用させていただきました。
マイコミジャーナルにも書かれているように、Internet Explorerの表示が若干期待と違いますが、追々修正していきたいです。
jQuery UI Effect “Pulsate”
日米英のAmazon洋書価格の最安値を強調する視覚効果に使用しました。これまではjQuery単体で、hide()してfadeIn()で、似たようなことをやっていました。おかげで、簡単に点滅効果を出せるようになりました。
ちなみに、「pulsate」とは「振動させる」という意味だそうです。
“pulsate”の検索結果(7 件):英辞郎 on the Web:スペースアルク
Recent Comments