刺身の上にたんぽぽ乗せる日記

プログラミングしたり、自販機の下に落ちてる小銭を集めたりしてます

scrapy

Python用のスクレイパーライブラリ。
http://scrapy.org/
何がいいかというと、

  • IO処理の効率が大変高いので、多重ダウンロードなどが効率的
  • リクエスト投げて、結果をとってくるところはある程度勝手にやってくれる
  • スクレイピング自体がxpathが使えるのでめちゃくちゃ楽チン

はまったのは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でも多分同様だと思うけど