読者です 読者をやめる 読者になる 読者になる

Lean Baseball

Engineering/Baseball/Python/Agile/SABR and more...

初心者がPythonを覚える為の本の選び方を体系化してみた(2017版)

Python プログラミング

こんにちは.野球(とグルメ)の人です.

会社と仕事はメッチャ楽しいのですが,今日はそれと関係なくPythonの話題を久々に.*1

昨年から,「AI(えーあい)」だの「でぃーぷらーにんぐ」だの「機械学習」といったワードとともにPythonを覚えようとしている方が多いらしく,

  • 何から学ぶべきか
  • 何の本がオススメか
  • 簡単に覚えて僕もいっちょ前に「えーあい」したいのだが!

みたいな質問を公私共々沢山いただく機会が多くなりました.*2

今まで学んだ・実践したPythonの学び方・本を整理するのにいい機会だ!

...ということで,

  • レベル別の本の選び方
  • オススメ書籍(三行レビュー付き)
  • イベントや勉強会との付き合いかた

について一筆書きたいと思います!

免責事項

前触れもなく書くとマサカリが飛んできそうなので一応書いときます.

  • あくまでも個人(shinyorke)の見解です,この内容が正解・銀の弾丸ではありません.
  • 世の中にある全てのPython本・イベントを網羅しているモノではありません.「取り上げられていない書籍/イベントがダメ」ということではないのであしからず!
  • 所属企業・組織および,参加している団体・組織は一切関係ありません.
  • その他書いてないことも私(shinyorke)個人の見解です.

基本的に私の経験で書いてるものなのでご意見・フィードバックお待ちしております.

初心者がPythonを覚える為の本の選び方を体系化してみた(2017版)

というわけで,体系化してみた絵がこちらになります.

中身は順を追って解説します.

f:id:shinyorke:20170115161603p:plain

学習のポイント(または避けられない選択)

PCの有無

言わずもがなですね.

環境は直接Pythonをインストールしたり,Cloud系の学習・開発環境サービスを用いるどちらでもOKかと思いますが,いずれにしてもPCが無いと始まりません.

会社や学校のPCを活用でも良いですが,個人的には本気で覚えてモノを作るならやっぱり自分で買っちゃったほうがいいと思います.

(たとえ中古であったとしても無いより334倍マシです)

プログラミング経験の有無

f:id:shinyorke:20170115163011p:plain

いちばん重要なポイントかもしれません

何人かご相談していて思うこととしては,

によって,オススメするべき本や学習の方法が異なるんじゃないかと言うことです.

何かしら言語を知っている場合は知っている言語の置き換えで読みやすい本や学び方を取るべきだし,「え,プログラミングって言語があるの?」レベルから始める方はそもそも「プログラミングis何?」から学ぶべきという感じになっちゃうのでアプローチが確実に異なります.

「今年は富士山に登るぞ!」という人だって,既に他の山(1000m級)で登山経験があるのかそれともピクニック程度なのかによって準備が異なりますよね?

それと同じです多分.

平たく言えば,

自分が今どの立ち位置・レベルにいるかを正確に把握することが重要となります!

プログラミング言語を覚えた後の目標・成し遂げたいイメージがついているかどうか

f:id:shinyorke:20170115163025p:plain

目的指向かどうか,というところになります.

これはいつも自分に言い聞かせているのですが,

  • 目標・成し遂げたいことをちゃんと言語化してから覚える(メモでもなんでもいい)
  • プログラミングはあくまでも手段
  • プログラミングする必要があればガッツリ覚える,そうでも無かったらやらない

Pythonの場合,データ分析や数理的な処理・分析に強いかつ作りやすい特性があるのでデータ指向の方は覚えたほうが良いというのがありますが,Webアプリやちょっとしたインフラ作業など,他に代替手段があるものについては「本当にPythonでやる必要あるかな?」を先に考えるのがいいのかなと思っています.

確かにPythonは学習コストが低い・アプリからデータまで一気通貫に作れる強みとエコシステムが揃っているのですが,言語そのものにフォーカスしすぎるのものね...ということです.*3

オススメ書籍(三行レビュー付き)

上記の体系表に載せた本の簡単なレビューです.

気になった本は是非手に取ってもらえると!

なお,手に入れる際には最新版がベストです!(リンクは最新版です)*4

プログラミングを学ぶ

独習Python入門――1日でプログラミングに強くなる!

独習Python入門――1日でプログラミングに強くなる!

ホントの本当にプログラミングを学んだことがない状態から始めるのにオススメです.

詳しくはこちらのエントリーを御覧ください(手前味噌ですがw).

「独習Python入門」は一生付き合える入門本だと334回言いたい - Lean Baseball

Pythonを学ぶ

みんなのPython 第4版

みんなのPython 第4版

私がPythonをはじめた時はこの本からスタートしました(第二版だったと記憶).

言語仕様から勘どころまでわかりやすく書いており,最新版(第四版)ではデータ分析についても触れています.

(レベルを問わず)プログラミング経験者は迷ったらみんPyがベストかと思います.

Pythonチュートリアル 第3版

Pythonチュートリアル 第3版

オライリー本かつ,Pythonの生みの親(Guidoさん)の本です.

導入部から解説までガッツリかいてます.

みんPyと比べ堅い作りでプロユース(仕事目的)な方には一冊あったほうが良い感じです.

やりたいことが決まってる/決まってない

やりたいこと別のオススメ本です.

決まってない方にも決まってないなりに読める本があるので紹介します.

やりたいことがわからない

Pythonエンジニア養成読本[いまどきの開発ノウハウ満載!] (Software Design plus)

Pythonエンジニア養成読本[いまどきの開発ノウハウ満載!] (Software Design plus)

Pythonそのものの歴史やコミュニティーのことに軽く触れつつ,

データやWebアプリ,インフラ(Ansible)など網羅的に触れている本です.

まずはこの本で一通り試してやりたい方向性の本を買ってみる!という使い方が良いかと思います.

Web開発・お仕事など

Pythonプロフェッショナルプログラミング第2版

Pythonプロフェッショナルプログラミング第2版

Pythonを使ってWebアプリケーションを作る!というお仕事をする方には必読の一冊です!

単にWebアプリを作るだけでなく,テストやコードレビューに自動化,オススメのライブラリなど痒い所の情報が手に入る一冊です.

個人的には無いと仕事にならない一冊です.

Effective Python ―Pythonプログラムを改良する59項目

Effective Python ―Pythonプログラムを改良する59項目

コードレビューをしたり,「もっときれいなコードを書きたい!」という時にオススメです.

私は辞書的な使い方をしていますが読む度に知らないことに気がつきます.

書くのに慣れてきたら手元にあるといいですね.

データ分析・機械学習ほか

この分野は恐ろしく本がたくさん出ているので絞って紹介します.*5

Webスクレイピング以外の話題は網羅的に載っています.

IPython(Jupyter)の使い方から可視化(matplotlib)やデータ処理(pandas)など必要なものがほぼ揃います.

この一冊でPyData(Pythonでデータを扱う営みの総称)の3割いや半分くらいはわかりそうです.

機械学習系はこの二冊が人気かつ内容もしっかりしている印象です.

基礎から載ってる「ゼロから〜」は数学弱い自分としては助かってます(真顔)

Python機械学習〜」は導入部から可視化・分析に必要なノウハウをほぼ網羅していてお得感と深さがあります.

Webスクレイピング(データの取得と前処理)

PythonによるWebスクレイピング

PythonによるWebスクレイピング

Pythonを元にしたWebスクレイピングの教科書です.

Beautifulsoup4(Pythonスクレイピングライブラリ)の使い方をベースにノウハウが満載です.

特に法令的なところや「人間らしく振る舞う」所は忘れがちなので助かります.

最近出た本でこれも評判いいですね.

最近はやりつつあるscrapyの解説ががっつりあります.

体系的にも読みやすくていい本かと思います.

イベントや勉強会との付き合いかた

学ぶのに本をよむ・写経するのも良いですが,

一番手っ取り早いのはイベント・勉強会に参加して経験者にもまれてくることです!

...という経験談・ノウハウはこちらをご参照ください(手前味噌パート2)

www.slideshare.net

本を読む・写経する以外のポイントはたった3つで,

  • Get out of the building(家や会社の中だけでなく,外に出て交流しよう)
  • Output & Feedback(覚えたこと・成果は外に出す,フィードバックをもらう)
  • Networking(詳しい人・面白い人・同じ勉強をしている人でつながろう)

覚えやすいでしょ?

なぜそういう結びなのか,についてはスライドを読んでもらえると幸いです.

というわけで,素敵なPythonライフを!

*1:JOINして一週間ですがチームとサービスのエネルギーに圧倒されそうでヤバイです(真顔)いずれブログか何かに書きます.

*2:会社や外部の勉強会だけでなく,(前職の)ビザスクMatcher(マッチャー)を通じて問い合わせも幾つかあり,嬉しい悲鳴を上げております(震え声)

*3:余談ですが,個人的に相談を受けた内容で「これはPythonじゃなくていい」「Python覚える云々以前の問題」というときには情報の探り方や目標の立て方・ストーリー作りに時間を費やしています.たまに「Pythonの話まったくなかった」というフィードバックも貰いますがw

*4:たまに古本屋で買ってやる方もいますがバージョンが古くて現状と合わなかったりして学習と本質的に異なる部分でハマる&時間損失をするので古い本は絶対オススメしません

*5:本当に大杉だし玉石混交で困る

RettyにJOINします&新年の抱負

f:id:shinyorke:20170103161603j:plain

野球のチームだと思いました?No!食とグルメのチームですよ!!*1

写真は昨年食べて一番美味しかったお寿司です,本題とはあまり関係ありません.*2

私, @shinyorkeは1/9(月)をもって株式会社ビザスクを退職,1/10(火)より実名型グルメサービス「Retty」の運営元であるRetty株式会社(Retty.Inc)にJOINすることになりました.

ちなみに今(2017/1/4-1/9)までは有給消化期間ということで身体を休めたり野球のプロダクトについて夢を馳せたりしています.

Rettyでも引き続きエンジニアとして,

  • サーバーサイドアプリケーションの開発
  • データ可視化・分析(Pythonistaっぽいお仕事)
  • (エンジニア向けな意味での)情報発信とかコミュニティーとの繋がりetc...
  • その他盛りだくさん

に携わる予定です.

このエントリーでは,移籍の経緯とか今後について,

  • Rettyで成し遂げたいこと&新年の抱負
  • 過去三年(2014-2016)の振り返り(retrospective)
  • 今後三年の展望(futurespective)

の3つの章でポエムしたいと思います.

仕事始め,気持ちとやる気の暖機運転がてら読んでもらえると幸いです.

Rettyで成し遂げたいこと&新年の抱負

ここ半年(去年の夏から年末まで)に起こったことのまとめです.

なぜ転職したのか

ビザスクではサービスの企画開発・データ分析&インフラチームの立ち上げおよび広報・採用につながるコンテンツ運営(主にTechブログやエンジニアの外部発表)などを担当させてもらいました.

その中で多くの学びがありましたが,

  • 将来的な目標(ビジネス・野球両方)を達成するにあたり,今の組織で最短ゴールは狙えるのか?
  • 自分が理想とするプロダクト・チームと会社が理想とするプロダクト・チームに差があるような気がする*3
  • スポットコンサルティングが創りたい世界像を中の人じゃなくて外から作ってもよいのでは?

...などなど,いくつかのクエスチョンが芽生え,夏頃(8,9月かな?)に感じ,まずは時間が許す限り,Wantedly・知人紹介などを通じ,色々な会社・チームに会うことにしました.

そんな最中,ほぼレギュラー参加していた勉強会にてRettyの中の人のプレゼンに興味を持ち,繋がりを駆使して採用選考に乗り,そのままストレートに決まりました.

出会ったのが10月,その後は選考やエンジニアチームとのミートアップなどを通じ,じっくりと価値観やプロダクト,サービスの事について語り合い自分としては非常に腹落ちがした状態でJOINを決断しました.

なぜRettyだったのか

食を通じて

世界中の人々をHappyに。

http://corp.retty.me/より引用

このビジョンに共感したことと,何よりも(アプリの記録上)4年前(2012年ころ)から普段使いしているくらい,Rettyを愛用していてかつ,

以前はアジャイルと野球と食事ネタでブログを寄稿していたぐらい,食に対しては野球とPythonと同じぐらいこだわりと強い価値観があり,家族・友達そしてその先々にいる人たちの食生活をHappyにしたい!という覚悟ができたからです.*4

なお,その当時に書いていたブログはこちらです(2012-2014の1年半くらい).

www.manaslink.com

今となっては閉店しているお店もあるのでなつかしいですね...そんなブログを書いたり,仕事や友達同士の飲み会を知ってるお店で開催したりという中で,

  • ユーザーさん(外でご飯を求めて探したりしている皆様)に対する負
  • 飲食店さんが感じている負
  • 自分が飲み会やイベントの幹事・進行を通じた「場作り」で感じた負

というものに改めて気が付きかつ,

  • 食文化の素晴らしさ
  • 食がもたらす場作りとコミュニケーション
  • 自炊したり,レシピを共有したりする以外に伝えるべき「食育*5

というテーマも改めて気が付き,

これらを実現する場所としてRettyしか無いな!ということでJOINする決断をしました.

また,選考の過程において経営陣やマネージメント層のみならず,メンバーのみなさんも自分の意志・ストーリーを持ってガチで私と対話(勿論私も思いをガチで返しています)できてとても気持ちがよく,

(JOINが決まった後に読みましたが)Joy, Incの世界に近くてとても良いなと思ったのも決断を後押しする理由の一つでした.

ジョイ・インク 役職も部署もない全員主役のマネジメント

ジョイ・インク 役職も部署もない全員主役のマネジメント

新年の抱負

Rettyおよび個人として成し遂げたいこと.

Rettyのメンバーとして

プロダクト開発・データ分析などのタスク・チームづくりを通じて,Rettyが持っている価値の最大化をいかにエンジニア・スクラムマスターとしてしていくか?が大きな目標となるかな?と思っています.

JOINしたモチベーション(様々な負の解決&夢の実現)を大切にしつつ,Rettyを使っているユーザーさん達の幸せを如何に最大化するか?をテーマにやっていきたいと思っています.

各論めいたところは...ここでは書けないのでそれは後々形になったものから公に出ればいいと思っています.

個人として

まず,Pythonコミュニティーの一員としては,スタッフとしても協力させてもらっているPyCon mini Kumamoto 2017の成功が最初の目標となります.

PyCon mini Kumamoto 2017

また,みんな大好き野球に関しては,

  • (いい加減)コミュニティー化する
  • データ収集&分析のOSS化(主にPython)
  • 野球データ分析に関するプロダクトをローンチする(まずはβ版)

というのが最大の目標になる予定です.

また,個人としては,

  • 認定プロダクトオーナーの取得
  • 数学力を高める
  • 最低限の英語力

これらをなんとかできたらと思っています.

なぜ野球(関連の仕事ができそうな)チームに行かなかったのか

一言で言うと,

プロ野球にしてもMLBにしても侍ジャパンにしても,JOINするなら,エンジニアorデータ分析な立場で責任ある立場で入りたいからです!

細かい話は避けますが,データの活用・分析で野球のチームや野球そのものを変えるのであれば,エンジニアとしてOSSやコミュニティーの力を最大に活かしたいかつ,

イノベーションは過去の権威ではなく技術で起こすものと信じているので,技術でなんとかしたい!という思いが強いからです!!*6

技術でなんとかした後に,オリンピックの前期間にスポットではいる...などそのような世の中が出来るまで待とういや作る手伝いを可能な限りできたらと思っています.

世の中にはスポットコンサルという仕組みもあったり,副業・パラレルキャリアが当たり前になったりするでしょうし...

過去三年(2014-2016)の振り返り(retrospective)

この件はポエムもポエムなので読み飛ばしても大丈夫です(自分の思考整理メモにお化粧した程度のアレです)

昨年のビザスク以前に,リクルート・ITコンサルタント時代からのストーリーで語ったほうが整理が付きそうなのであえて3年前(2014年)から振り返ります.

[2014]ITコンサルタント->リクルート

ちょうどこのブログをはじめた頃*7ですね.

初っ端のエントリーがよく燃えた記憶があります(黒歴史)*8

shinyorke.hatenablog.com

それはさておき,当時は独立系のITコンサル企業でITコンサル兼エンジニアとして,サーバーサイドアプリの開発・インフラエンジニアの真似事を繰り返しつつ,研究開発系のプロジェクトに従事していました.

かなり辛かった時期ですが,その頃に出たアプリ(今はサービス終わってる)がかなり有名になって嬉しかったです.

がしかし,ここでいくつかの思いが芽生え始めました.

...というビジネスマン・エンジニアとしての希望と,「2020年には東京オリンピックで野球やるぞ!」という中二病な夢が強くなり,(業態的に)ITコンサルタントじゃ無理!という判断に至り,ちょうどいいタイミングで縁があったリクルート(正確にはリクルート住まいカンパニー,以下SUUMOと略します)にJOINしました.

shinyorke.hatenablog.com

SUUMOには9月からJOIN,最初の半期(〜2015年3月まで)は新規事業のプロダクトオーナー兼エンジニアをさせてもらいました(途中からエンジニア専任).

また,PyCon JPへの初参加&初登壇をキッカケに「野球Hackの人」「Python野球のお兄さん」として名前が出始めたのもこの年でした.

gihyo.jp

[2015]リクルートでの1年

SUUMOにJOINしてからは,

  • 新規事業のプロダクトオーナー兼エンジニア(上述の通り)
  • 既存サイトのリニューアル
  • 社内外でのイベント登壇とそのフォロー
  • アジャイルスクラムの推進や実践
  • Tech Blogの立ち上げなど,エンジニア文化作りと発信

などなど...多くのミッションを通じて様々な学び・価値観を得ました.

同時に,SUUMO以外のリクルート各社のエンジニアをはじめ,素晴らしい人々との出会いやコラボレーションがありました.*9

一時期心身ともに壊れたりしてかなり辛い時期もありましたが...

閑話休題.

長いようで短い一年の中で,自分の今と今後を考えるにあたり,クエスチョンが出来たのもこの時期でした.

  1. 自分,思ったより不動産や住まいの事に対して当事者になれてない*10
  2. ずっとマネージメントや管理業務してるけどそれ本当にやりたいことだったっけ?
  3. (上記を考えた上で)自分が理念・意志をもって全力疾走できるサービス・プロダクトって何だろう?

役員や上長は当然のことながら,周りの後輩や新人たちが住宅や住まいに運命と命をかけている中*11,「え,住めれば借家で全然よくね!?」ぐらいに考えていた私にはかなりのショックと刺激をもらいました.

その中で,

本当にやりたいことって何だったっけ?

を本気で考えはじめ,外の人たちとの接点を重ねた結果出会えたビザスクにJOINすることを決めました.

その時の経緯とサマリーはこんなエントリーにまとめさせてもらいました.

shinyorke.hatenablog.com

「自ら機会を創り出し、機会によって自らを変えよ」という教えを転職という形で叶えたのが2015年の末でした.*12

なおこの頃には「Pythonと野球のお兄さん」「野球の人」としてのブランディングがしっかり固まっており,「野球に向けての目標」についてはちゃんと進捗してました.

shinyorke.hatenablog.com

[2016]ビザスクでの1年

ビザスクのスポットコンサルティングは、

組織、世代、地域を超えて、知見を集めつなぐことで、

世界のイノベーションに貢献します。

https://visasq.co.jp/ より引用

(細かい話はここでは語れませんが)このビジョンに強く共感したことと,プレーヤー(エンジニア)として力を求められているしかもPythonアジャイルで!!!

...というのがビザスクにJOINしたモチベーションと理由の全てでした.

ITコンサルそしてSUUMO時代からクエスチョンだったコンサルや業務委託という考え方に挑戦できる魅力,そして将来副業・パラレルキャリアが当たり前になる時代の先頭に立つべきサービスとしてのビザスクに大変共感を持ち,CEO面接から数日で退職を決めてJOINしました.

ビザスクの中では,他のエンジニアメンバー同様企画・開発を同時に進めながら,

  • アジャイルスクラム・カンバンを軸としたプロセスの最適化(スクラムマスター的な意味で)
  • データ分析・可視化を円滑に進めるための基盤構築とチームづくり(PyData+プロダクトオーナーな意味で)
  • Tech Blog,イベント(PyCon JPなど)を通じた情報の発信とブランディング強化

といった事を通じてビザスクおよびスポットコンサルティングを広めるお手伝いをさせてもらいました.

サービスの数字の追い方,広告やSEOや採用,広報といった知識を実践だけでなく,リアルに事業の数字を追いながらサービスを育てるノウハウと大切さを学んだのがスタートアップに一年いた大きな学びでした.

そんな中で気がついた新たな疑問が...上記「Rettyで成し遂げたいこと&今年の抱負」に書いたとおりです.

今後三年の展望(futurespective)

2020年(40歳)の自分が目指している世界,一言で言えば,

Rettyで食を通じたHappyな世界を創りつつ,野球の仕事ができる自分でいたいと思っています!

半身は食の仕事をしながら,残り半身は野球の仕事...というパラレルキャリアな世の中がその頃にはできていて,東京オリンピックの野球競技をスタッフとしてお手伝いできていれば最高だな!...と思っています.

さいごに

転職前後におけるお悩み相談や数々の壁打ち,情報交換といった所で今回は多くの人の助けをお借りすることができたことをとても感謝しています.

仕事関係のみならず,普段からのコミュニティー活動そして関わってくださった皆さんの協力と優しさがなければホント心折れていましたし.

この場を借りて厚く御礼を申し上げます(._.)

というわけで本年もどうぞよろしくお願いいたします!

最後までお付き合い頂きありがとうございました.

P.S. (前回の転職から一年も経っていませんが)例のリストのリンクはこちらです.

amzn.asia

*1:フルなんちゃら総務だと思った?残念!酔っ払いだよ! の言い回しをパクりましたすいませんすいません

*2:私の地元,斜里町(北海道・知床)のお寿司屋さんです.> すし善

*3:平たく言うと...いや直接的に言うと音楽性の違いです.察してください.

*4:本当は野球とアジャイルだけで書きたかったのですが,当時の編集部から「これだとコンテンツ弱い」「ガジェットさん(当時の呼び名)はいつも美味しいもの食べてるんだから店紹介しろよ!」という声が上がり,”渋々”食をコンテンツに加えた経緯があります.なお掲載に当たっては個人としてちゃんと一回一回掲載許可を取ってました.

*5:手前味噌で恐縮ですが,母親および漫画「味いちもんめ」で得た食と人の価値観が自分の食育の全てです.とくに母が教えてくれた価値観はユーザーさんに受け入れられる限り形にしたいです.

*6:スポーツって何やかんや古い世界なので...下から「入りたいです!」って言って入っちゃ駄目だと思うの&入るならユーザー価値と技術で圧倒したい

*7:独自ドメインで別にやってた過去もありますがそれは抹消済み

*8:この本棚論は今でも自信ありますけどね&ここで炎上したのをキッカケにWebライティングを真剣に考えるようになった感ある

*9:特に大きかったのはアジャイルサムライ監訳者の@nawotoさんとの出会い,同じR内でイベントをご一緒させてもらったり幾つかの接点で大きな学びをもらいました

*10:ITコンサルタントから転職を選んだ際,業界やサービスそのものに意志を持てるか?を考えていなかったのが大きな反省点であり学びでした

*11:自宅やマンションを買うぐらいは当たり前で,進んでる人たちはビルのオーナーやったりスペースを貸したりしてました,若手でも.そこがSUUMOの中の人達の本当の強さ

*12:全くもって後悔はしていない

Pythonを用いたWebスクレイピングの開発ノウハウ〜スポーツデータの場合(野球風味)

Webスクレイピング Python 野球

クローラー/Webスクレイピング Advent Calendar 2016 - Qiitaのクローザーとしてマウンドに立ちます@shinyorke(しんよーく)ともうします.

このエントリーではみんな大好きな野球(メジャーリーグ)を題材に,

を,自分の実体験を元に紹介します.

年末年始?来年とかに, 「俺もスポーツデータで機械学習やるぞ!」 という方(と自分)の参考になればと幸いです.*1

というわけでプレイボール⚾

対象読者&取りあつかわないこと

対象読者

  • スクレイピングおよびPythonのプログラミング初〜中級者
  • 何かしらのテーマ,特にスポーツでWebスクレイピングをされたい方
  • データに強いPythonスクレイピング&分析したい方
  • とにかくスポーツ,特に球技が大好きだ(野球に限らず)
  • 野球のルールとデータの意味を知っている(誰が出ていて,どっちが勝ってるか分かる程度でOK)

取りあつかわないこと

特にクローラー(scrapyのノウハウとか)について期待している方は別のエントリーをご覧頂ければと思います.*2

  • 特定のサイト・データを周期的・自動的に取得する,つまりクローラーのの解説とか各論
  • Python以外の言語・ライブラリの話題
  • 野球・メジャーリーグのデータおよび指標の解説

Starting Member

Pythonを用いたWebスクレイパー開発の勘どころ

スポーツに関係なく,PythonでWebスクレイパーの開発をする際の流れを元に勘どころを紹介します.

ちなみにこれは完全に我流です(が自信はある).

Webスクレイパー開発の流れ

私はスクレイピングを行う際,必ず以下の作業&定義を決めてから開発を行っています.

スクレイピングの対象ページを眺める&コードを追う

まずこれをしないと何も始まりません!

スクレイピングしたいページをChromeの開発者ツール(SafariFirefoxなど好きなブラウザでOK)を用いて,

眺める

ここでは, スクレイピングする必要が無ければスクレイピング以外の手段を使うという事を前提に調べていきます.

  • APIの有無
  • オープンデータや公式データ無いかな?

を地道に調べます.

たとえばWikipediaスクレイピングしなくても, 公式のデータベースがあったりするので必要ないな,とわかるだけでも無駄なプログラミングをせずに済みますし,ライセンスなどの問題に当たる必要がなくなります.

コードを追う

  • HTMLの構成, 特にデータの出どころ
  • CSSのルールや名前
  • サイトの構造

などを辿っていきます.

重要なポイントはやっぱりデータの出どころで,

  • HTMLに直接書いている場合(tableタグとかdivタグ)はHTMLをスクレイピングするツールを使う
  • AngularやReactなどのシングルページアプリケーションやJQuery等でAPIを呼び出してるアプリの場合はJavaScriptスクレイピングする仕組みを使う

要するに,対象のデータがHTMLなのかJSなのかを見極める事を重点的に行います.

要件を決める

(スクレイピングに限らず)やみくもにコーディングすると目的がどっか行ったりするので,要件を決めます.

私は目的,もっといえば「なぜスクレイピングするか」のストーリーをちゃんと作りたい人なので,

ということをしています.

とはいえ,「お勉強のためにスクレイピングしたい」「いやまあ使い捨てのツールだし」っていう場合は,

  • 環境や動作条件(Pythonのバージョン,出力フォーマットなど)をメモる
  • なんちゃってで動くWebスクレイパーを作る,平たくいうとプロトタイピングする

というのも良いでしょう.

なお,私は恒常的につかうWebスクレイパーを作りたかったのでインセプションデッキに要件とゴールを書きました.

インセプションデッキ(一部抜粋)

Webスクレイパーに加え,分析環境も作ってたので内容が若干煩雑かも.

f:id:shinyorke:20161225160046j:plain

f:id:shinyorke:20161225160216j:plain

f:id:shinyorke:20161225160231j:plain

ライブラリ(もしくはフレームワーク)の構成を決める

ここでようやっとライブラリやフレームワークを選ぶ段階に入ります.

Pythonの場合,Webスクレイピングの手段として,

  • 素のPython(urllibなど)を使う
  • 便利なHTTPクライアント「requests」
  • HTMLをスクレイピングするなら「Beautiful Soup」
  • Webクローラーを含めてオールインワンで開発「scrapy」
  • 分析しながらカジュアルにスクレイピング&Dataframe化する「pandas」のread_htmlメソッド

という5つの手段があります(他にもあると思うけど知らない).

それぞれの強みと利点を簡単に紹介します.

素のPython(urllibなど)を使う

  • (当たり前だが)ライブラリの導入がいらない
  • 好きなようになんでも書ける
  • なんでも書ける!ということは自分で書くコードの総量が増える&メンテナンスが煩雑に
  • Pythonそのものの勉強目的を除きオススメしません!*3

便利なHTTPクライアント「requests」

github.com

  • HTTP Request/Responseを人間らしくカジュアルに扱える神ライブラリ
  • モジュールやメソッドがかなり直感的で使いやすい
  • ちょっとリッチなHTMLなどをスクレイピングするときにはコード量が増える印象
  • JSON/XMLなどで返すAPIを扱うときは一番ラク&最強です!

HTMLをスクレイピングするなら「Beautiful Soup」

Beautiful Soup Documentation — Beautiful Soup 4.4.0 documentation

  • PythonでWebスクレイピングといえば!の代表格でとても扱いやすい!
  • 特定のタグの捜索や正規表現(find/find_all)に加えてCSSセレクタ(select)での特定や抽出ができる
  • HTMLのWebスクレイピングはまずbeautiful soupで間違いない
  • クローラーに必要な機能(ファイル/データベース出力,定期的なクロール)は自前で実装が必要,そこまで必要になったらscrapyで
  • xpathには対応していない,これもやりたくなったらscrapyかな

Webクローラーを含めてオールインワンで開発「scrapy」

Scrapy | A Fast and Powerful Scraping and Web Crawling Framework

分析しながらカジュアルにスクレイピング&Dataframe化する「pandas」のread_htmlメソッド

pandas.read_html

  • pandasのDataframeをすぐ作りたいかつ,ページがtableタグで構成されているときは一番手っ取り早い!
  • データ型まで保証はしてくれませんが必要なDataframeが1行で書けるのはかなり強力
  • 前処理(ゴミを取り除く,欠損値対応など)を地道にできる人はさっさとpandasでやっちゃうのが良さそう

なお,このブログでも事例を紹介させてもらいました(野球ネタです).

shinyorke.hatenablog.com

どの手段が一番オススメか!?

私個人の意見としては,

  • RESTful APIを叩くだけならrequests
  • 一時的にHTMLをスクレイピングするならBeautiful Soup
  • クローラーを作る必要がある要件だったらscrapy一択
  • Try and Errorで分析しながらやるor手早くまとめるならpandas.read_html
  • 迷ったらBeautiful Soup!

ですね.

何をやるのにもscrapyは最強なのですが,迷った時はBeautiful Soupを使っています,欠点(xpath使えない,クローラー化が面倒)については回避の方法もありますし,何よりライブラリが完成度高く,事例がたくさんあるので個人的にはBeautiful Soup推しです.

と,いいつつ最近はscrapyの方が使う機会増えてますけどねw*5

スポーツデータをスクレイピングする際のコツとノウハウ

お待ちかね,スポーツデータの話です.

野球やサッカーといったデータを使った分析事例が増えていたり,自分でもやる方も増えている印象があり(火付け役の一人として)とても嬉しいのですが,スクレイピングそのものが辛くなるようなハマりどころが存在します.

いくつか事例(≒僕の黒歴史)を紹介します.

ページ構造/APIのインターフェースが不完全

  • スクレイピングの後にやりたいことにたいして,データが見当たらないもしくは別ページ・APIに存在する
  • 例えば野球の場合,指標の計算で盗塁死(cs)が欲しい!と思ってもデータが無かったり
  • 別サイトからスクレイピングする,盗塁死が無くても計算可能な近似式を使うなどで回避
  • Webスクレイパーを開発終了後に気がつくので本当にたちが悪い!(涙目)

データ・指標に関する仕様が見当たらない

  • 「知ってて当然だよね?」と言わんばかりに指標の説明などが全く持ってない!
  • 距離や長さがメートルなのかフィートなのか?とかそのレベル
  • 本物の一球速報サイトや海外の文献を漁って仕様を類推,確かめながら作るなどして対応
  • スピードガンやPitch f/xは仕様がそもそもガラパゴスだという事を把握(学び)野球専用の機械だししょーがない.

計算が合わない

  • 前処理・指標計算の結果が実際の結果と合わない
  • 前述の「インターフェース不完全」「仕様が謎」問題から起こる不幸
  • こればっかりはスポーツ(野球)のドメイン知識を駆使して地道に解くしか無い

処方箋

そんな不幸を避けるためには,

要件をちゃんと作る・書く

ガッツリな仕様は無くてもやっぱ転ばぬ先の杖は要件かなと.

  • データの不完全性や仕様を予め把握
  • どこにデータがあるの?とかフォーマットはHTML?JSなの?とか
  • インセプションデッキとかお絵かきとか面倒くさいと思うでしょう?事前に整理することによって気がつくことがあるんですよ!!!

ドメイン知識をつける

スポーツデータに限った話ではないですが本当に重要.

  • 野球なら野球、サッカーならサッカーのドメイン知識をこれでもかっ!ってぐらいつける
  • ルール、データの種類から対象リーグのトレンドだったり傾向だったり.
  • 野球の場合は上記に加えてセイバーメトリクスの基礎も覚えるとなお良い.
  • 「オレ,審判とかスコアラーできちゃう!?」ぐらいに磨けば完璧
  • 球場やTVで試合みる延長線上でデータをスクレイピングしたり分析できたりすると思うなよ!

メジャーリーグベースボールのデータセットスクレイピングする(pitchpx)

一個の事例として.

昨年末〜今年にかけて,MLBの一球速報データをスクレイピングしてデータセットにするWebスクレイパー(コマンドラインツール)を自作しました!

github.com

こちらで何ができるか?というと,

  • 2007年以降のMLB全試合(プレーオフ含む)の一球データをCSVとして取得
  • 投球,打席の結果がメイン
  • ついでに出場選手や審判のデータセットも含む

コマンドラインでサクッととれます.

事例についてはこのブログやPyCon JP 2016で発表させてもらいました.

使いたい方や気になる方はぜひご覧ください!

shinyorke.hatenablog.com

shinyorke.hatenablog.com

qiita.com

なお開発の時のtipsはこんな感じ,

  • Python 3専用で作った
  • Beautiful Soupベースで開発
  • 本当はクローラーにしたかったのでscrapyを使うつもりだったが,開発当時Python3を正式サポートしていなかったこと, scrapyに慣れていなかった事もあり断念
  • 初速はテスト無しで開発,ある程度安定した後テストを書いた&CIを入れた

好きな言語・好きな開発手法を思いっきりできたので気持ちよかったです.

まとめ

そら(Webスクレイパーを書くならPythonが最強で)そう(事前の下調べや要件づくり,ドメイン知識が大切に)よ(決まっているじゃないか)

私がPythonistaということもありますが,ちょっとしたWebスクレイパーPythonを使うのがベストかなと思います.

あとは最近書いていませんが,Rubyのnokogiriとかもいいよなー,とか.

その他の言語については自分自身スクレイピングの知見が無いので是非ともフィードバックを頂けると幸いです!

長文となりましたが最後まで読んでいただきありがとうございました!

(Appendix)参考文献

今回のブログを書くにあたり参考にした文献など.

書籍(Python)

オライリーのWebスクレイピング本は名著です&初学者の方には独習Python入門のスクレイピングのページが良いです(beautiful soupの事例です)

PythonによるWebスクレイピング

PythonによるWebスクレイピング

独習Python入門――1日でプログラミングに強くなる!

独習Python入門――1日でプログラミングに強くなる!

その他最近スクレイピングの本が出ていますが...まだ読んでないので良い本があれば教えて欲しい.

書籍(野球・サッカーのドメイン知識)

主に野球・サッカーのドメイン知識をつけるなら!

サッカー データ革命 ロングボールは時代遅れか

サッカー データ革命 ロングボールは時代遅れか

Analyzing Baseball Data with R (Chapman & Hall/CRC The R Series)

Analyzing Baseball Data with R (Chapman & Hall/CRC The R Series)

4‐2‐3‐1―サッカーを戦術から理解する (光文社新書)

4‐2‐3‐1―サッカーを戦術から理解する (光文社新書)

ブログ・スライドなど

主にamacbeeさんのブログ・スライドを参考にさせてもらいました.

amacbee.hatenablog.com

qiita.com

qiita.com

speakerdeck.com

*1:本題と関係ありませんが最近スポーツhackしたい方が増えているので何かコミュニティ作る&イベントやろうと思ってます

*2:日本プロ野球用に作ってるけど事情により非公開(察し)

*3:言語そのものの勉強だとしても,やるなら一回でいいと思う

*4:PythonでのDjango,RubyでのRailsを覚えるときのような「言語とは関係ないクセ」があるということです

*5:自分が慣れてきたのと,最初からクローラー化する前提での開発が多いのでscrapyを選択しています