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年に帰国。零細株式会社経営中。

References   [ + ]

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

Adsense

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

関連記事

Python x64 & MinGW64 環境の構築

流石に詰まりまくったのでまとめることにする。 MSYS2 をインストール 個人的にこれからメインで使いたいと思っ

記事を読む

Quantopian の pyfolio を単利運用に対応させる。

pyfolio は どんなデータを入れても複利運用として計算してしまうので、人によっては望まない検証方法だったりし

記事を読む

ipdb だけではなく IPython.embed も使おう

ipdb だと複数行の挿入ができなかったりするが、その問題が解消される。明らかにこちらのほうが使い勝手がいい。行のデ

記事を読む

vim-slime を使って VIM の内容をコンソールに送信

この記事はVim Advent Calendar 2016の20日目の記事です。 選択行の内容をコンソールに送信

記事を読む

Call Python/Numpy Function within Metatrader 4

Github Link [bm url="https://github.com/fx-kirin/mt4-nump

記事を読む

Pythonのsocketでプロセス間通信をして価格データ等を送信する

どうも、お久しぶりです。キリンです。 取り敢えず1ヶ月ほど、連続でブログの更新を続けてみたのですが、そ

記事を読む

no image

stop automatically closeing vim-ipython output with jedi-vim

Even though I commented out the following code in vim_ipytho

記事を読む

Python の超お手軽のネットワーク分散コンピューティングライブラリSCOOP

SCOOPとは ssh とPython の設定を適切にするだけで、簡単にネットワーク間での分散処理が実行できる。

記事を読む

Pythonで簡単自動化!PyAutoGuiが便利すぎて感動したのでご紹介

以前こんな記事を書いていたのですが、これがまったく不要になるとても便利なPython Libraryがあった

記事を読む

Python での ポートフォリオの計算

Python でのポートフォリオの計算 ポートフォリオの計算について色々調べてみた。とりあえず使いたいって人はpo

記事を読む

Comment

  1. […] 話題のクローラー・スクレイピング!PythonならScrapyが超優秀な件 | Wizard In The Market […]

Message

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

Adsense

システムトレードを始める前に知っておきたかったこと

今日の勉強会で発表してきました。nbviewer に共有しておきます。 システムトレードを始め

chmod で やらかしてしまったときの対処法

メモ書きです。 find | xargs とかを普通にやってしまうと、すぐに argument

AMD Ryzen & Nvidia GTX 1080 BTO PC 構成・組立と Ubuntu インストール

まだググっても、構成例とか出てないので参考になるんじゃないかなと。機械学習用ですが、全然ゲーム用

Windows のデスクトップアプリをSSHクライアントから再起動する

シェルスプリクト一発で、システムトレードの設定を一括で更新して、MT4を再起動したいとかそういう

UX21A のディスプレイが壊れたので修理

UX21A のディスプレイがぶっ壊れた。 画面にラインが入ったり、ディスプレイが揺れたりするよ

→もっと見る

PAGE TOP ↑