scrapy
Python用のスクレイパーライブラリ。
http://scrapy.org/
何がいいかというと、
はまったのは2つあって、まず再帰的にクロールする方法がわからなかったけど、これは単純にRequestのオブジェクトをYieldすればいいだけだった。
yield Request(url, callback=self.parse_blah)
次にはまったのは文字コードの問題で、HTMLResponse*1で、自動判別した文字コードが間違えている場合に、手動で変換してからxpathに渡すのが、
response._encoding = "shift-jis"
hxs = HtmlXPathSelector(response)
こんな感じでちょっと今後壊れそうな感じでやる方法しか見つからなかった。多分正しい方法ってのは、Responseを生成するところで、TextResponseに渡すencodingを正しく指定することなんだと思うけど、Responseをどこで生成しているのかが見つからなかったので、今後壊れそうな気がして怖い。
*1:TextResponseでも多分同様だと思うけど