Wizard In The Market
システムトレードの魔術師

*

話題のクローラー・スクレイピング!PythonならScrapyが超優秀な件

公開日: : Python , ,

WS000216

Rubyの読書会に行ったら、Pythonの面白いお話を聞けたというお話です。

Rubyクローラー本の読書会に参加

先日、Rubyによるクローラー開発技法 読書会 第2回に参加してきました。

こういう会に参加すると、自分の知識の狭さを痛感してもっと勉強しなきゃなぁという気になります。また次回も参加させてもらいたいです。参加者の皆さん、色々ご教示いただき、ありがとうございました。

読書会では本の内容から広がった話がとても面白かったです。個人的には、Rubyのクローラー本の中身を実際に使うということは少ない気がしましたが、他の人がどのようにスクレイピングをしているのかということを知ることができたのはとても有意義でした。

具体的な読書会の内容は西山さんのブログにお任せするとして、そこでcuzicさんから教えていただいたPythonのScrapyのご紹介をします。

フレームワーク Scrapy

ぐぐってみると、真っ先に出てきた orangainさんのブログに詳しい解説が載っています。その記事が優秀すぎるので今更書くことも少ないかもしれませんが、自分なりにScrapyの紹介をしてみますね。

クローリングからスクレイピングまで強力にサポート

クローリングしながら一気にスクレイピングで情報をまとめてしまうということが、フレームワークで簡単にできるようになります。クローラー本来の使い方をしたい人にはとても便利なフレームワークじゃないでしょうか。

クローラーとしての機能

  • 既定サイトから深さを指定してクロール
  • Sitemapからパースしてクロール
  • クッキーやHTTPのキャッシュ等も対応
  • クローラーにクロールする条件だけ書けば動くようになっている
  • Webサーバーとして立ち上げて、botとして動かせる
  • etc…

Scrapyの優秀なところは、このクローリングの設定の簡潔なところです。ざっくり説明すると、クローリングに含めたい条件を正規表現やsitemapの設定をしてあげるだけでクローリングの設定が終わります。この辺りはフレームワークの利点ですね。

スクレイパーとしての機能

  • HTMLやXMLで書かれたデータの展開、取得
  • 結果の出力にはJSON, CSV, XMLが選べ、保存先もFTPからS3, ローカルストレージから選べる
  • スクレイプした結果に関連付けられた画像を自動でダウンロードできるパイプラインが書ける
  • etc…

基本的にはHTMLのやXMLからXPathで指定して情報を抜き出すという使い方になります。保存先の変更も容易なのは使い勝手が良さそうです。

他にもできること

  • インタラクティブなシェルからScrapyを操作できる
  • 各クローラから共通で利用できるデータの整理フィルター

インタラクティブなシェルからScrapyを操作というのは楽しそうです。こちらに紹介があります。実際にxPathでちゃんと情報が抜き出せるかなど、インタラクティブに確認できるのはとても楽です。

上記コマンドのURLを指定するだけで、インタラクティブモードで対象サイト上のscrapyが立ち上がります。

実際に使ってみよう

yahooファイナンスのこのページより「あ」行で始まる株式会社の名前と銘柄コードをJSONで保存するクローラーを作ります。

インストール方法

pipで簡単にインストールできます。ただし、Python 2.7専用なので注意してください。

プロジェクトの作製

railsでよく使っていたような形でフレームワークが入ったプロジェクトを作成します。このような形のファイル構成が自動で作成されます。

クローリングとスクレイピングだけをしたければ、items.pyにスクレイピング結果を格納するItemクラスを作製して、spidersフォルダの下にクローラーの.pyファイルを作成するだけでクローラーとして使えるようになります。では実際に作ってみましょう。[※1]ただ、今回はJSONを日本語の結果で出力したいため、pipelineを作成しなければならなかったので、一手間かかります。

item.pyの編集

item.pyでは、取得するItemの内容を予め確保しておく必要があります。dictionaryクラスのキーを予め確保しておくイメージです。

今回は、会社の名前と銘柄コードを取得したいのでnameとstock_idを確保してみました。

spider(クローラー)の作製

プロジェクトのspidersフォルダ下にstock.pyファイルを作製します。

今回はCrawlSpiderクラスを使いました。このクラスでは、start_urlsにURLを指定すると、Rulesで定義した条件のもと、クローリングしてくれます。Rulesの第二引数で指定したメソッドがクローリングの際に呼び出されます。

SgmlLinkExtractorがこのファイルの肝ですね。どのようにクロールするかの条件を指定するものです。これだけをしっかり指定すれば、クローラーの設定は全て済んでいるといっても言い過ぎではないと思います。

parse_start_urlは開始URLをパースの対象にするためのメソッドです。CrawlSpiderクラスを使うと、通常のparseメソッドのオーバーライドはしてはいけないらしく、このような仕様でしか全てのページをparseする仕様は実現できません。

最後にparse_stockメソッドにて、スクレイピング内容を記述しています。yieldで返るitemクラスがJSONに書き込まれるファイルになります。

pipelines.pyの編集

通常ですとこの作業は不要なのですが、残念ながらJSONの標準出力に日本語が対応していないため、pipeline上でJSON書き込み用のクラスを設定する必要があります。

このクラスは、下記ページより引用しました。

setting.pyの設定

コメントの内容以外に特に説明する必要はないかと思います。

これで、全体の作製が完了しました。

クローラーの起動

上記コマンドでクローラー(stock.py)を起動できます。

動作が完了すると、stock-code.jsonに「あ」行で始まる株式会社の銘柄コード一覧がJSONで保存されています。

ソースコード GitHub

使ってみた感想

RubyのAnemone等よりはかなり簡潔にクローラーを書けそうです。確かに単にクローラーを作るという観点においては、とても便利なフレームワークです。一般公開されている株価を毎日取得させる処理みたいなのにはとても便利でしょう。ただ、フォームへの入力機能やクリック機能がないため、ログインのページを持ったページに対応しにくいこと、クローリングの途中で情報を取得し、その情報と他を組み合わせてクローリングすること等ができなさそうなので、個人的には使いどころに悩むなぁといったところです。Postのメッセージを送ることはできるんですが、ログインページに可変のログイン情報があった場合はそれを取得して送信という処理の対応が難しそうでした。ともあれ、とても優秀なフレームワークなので、触って見る価値は十分ありますよ!

ご参考になれば幸いです!

にほんブログ村 為替ブログへ 
Fx-Kirin

About Fx-Kirin

2009年10月にFXを開始、翌年2010年5月から脱サラをしてFX業界に専念。 2012年10月頃から本格的に勝ち始め、一月で資産を倍にする、2年半月間負けなし等、安定した収支で2013年11月に生涯FX収支が1億を超える。 投資スタイルはシステムトレード。プログラミングの知識がほぼない状態から、独学で自分がしたいと思うことであればほぼ実現することが可能なレベルまで成長。好きな言語はRuby, Python。必要となればC++からVBA、Pascal等なんでも行う。MT4/MT5のプログラミングも得意。 2011年にはFXで稼いだ資金をもとにシンガポールに移住し、留学も兼ねて起業をチャレンジするほど、ビジネスを興すことに熱意がある。国内の業者を主に使い始めたことから、2012年に帰国。零細株式会社経営中。自分が得た経験から少しでもこれからFXを始める人の一助になればとブログを日々更新している。

References   [ + ]

1. ただ、今回はJSONを日本語の結果で出力したいため、pipelineを作成しなければならなかったので、一手間かかります。

Adsense

  • このエントリーをはてなブックマークに追加
  • Pocket
  • 4 follow us in feedly

関連記事

記事はありませんでした

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">

Adsense

92218308_7751adc40c_z
これが原因か!TinyMCE AdvancedのStop Removingオプションは使わなほうが良い件

WordPressを使い建ての頃は、エディタの独特さと付き合うのが苦手でした。全部HTM

WS000217
話題のクローラー・スクレイピング!PythonならScrapyが超優秀な件

Rubyの読書会に行ったら、Pythonの面白いお話を聞けたというお話です。 Rubyクロ

WS000163
簡単お手軽!Pluginでrobots.txtを設定!

今日もWordPressのプラグイン関係の記事です!Google Web Masterを使っている際

shutterstock_160357592
概要がおかしい!そんなときのTwitter Cards Meta のバグ修正

こんにちは!キリンです。先日の記事で、Twitter Cards Metaを使えば簡単にTwitte

5858249526_2298a25375_m
おしゃれなTwitter Cardsをプラグインで簡単に表示する方法

Twitter Cardsはツイッターをしていると見ることが多い、おしゃれでなかなか良い感じ

→もっと見る

PAGE TOP ↑