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月 16
ネットで公開されている「.xls」形式のExcelファイルを扱おうとすると、Office 2008 for MacかNeoOfficeを使うのが基本でしょう。
ただ、やりたいことは、表計算ソフトの使用ではなく、データの表示と加工(CSV形式にしたり、HTMLとして出力したり)なのです。以下のような方法でできるのが理想。
- コマンドラインプログラムで加工
- GUIプログラムで加工
CocoaならどちらでもOKだろうと調べてみましたが、有益な情報にヒットせず。
そういえば、RubyでExcelファイルを扱う記事があったよなと、「Rubyist Magazine – Win32OLE 活用法 【第 2 回】 Excel」をみてみるも、残念なことに、どうもWindows環境じゃないとダメらしい。困った。
一応、Pythonのも調べてみてみたら、こちらのページを発見。
なんと、pyExceleratorを使えば、Windowsなしでエクセルのファイルを扱えるみたい。ただ、気がかりなのは、2005年以来更新されていない点。
そのあたりを更に調べてみると、「pyExcelerator以外の選択肢 – Ni chicha, ni limona -平均から抜けられない僕-」に辿り着きました。xlrdでも、Windows無しでの読み込みが可能だそうです。
早速easy_installでインストールして、READMEとAPIに従って試してみると、あっさり成功。日本語も扱えそうで、一安心。
NewsgroupのFAQsによると、pyExceleratorからフォークしたxlwtを使えば、書き込みもできるらしい。ありがたいですね。
あとは、PyObjCでGUIを付けたいところですが、PyObjCを習得するのが大変そうです。
2月 16
杉並区に続き、練馬区立図書館でもスクレイピングをしてみようと、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が修正されないのはちょっと残念。
でも、バグを修正してくれた方々には、感謝。
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メソッドが、すごく便利です。
まとめ
地域限定な、ちょっと便利なサイトですが、杉並区の図書館をご利用の方はお試しください。
» 杉並区立図書館 新着図書 更新情報 (非公式)
Recent Comments