栗’s diary

Python勉強中。トレードに役立つようなTwitter bot開発中。暗号通貨の自動売買もやってみたい。

【読書メモ】Pythonクローリング&スクレイピング -データ収集・解析のための実践開発ガイド-

 

 グーグル先生(とどり先生)のお力を借り、素人に毛の生えた程度にはスクレイピングが出来るようになり、取得した情報をbotでツイートすることができるようになったわけだが、ここでもう一段大人の階段を昇りたくこの本を購入した。(ちなみにKindle版。)

 

1章からいきなりWindowsユーザーは仮想マシンUbuntuを利用してね(ニコッ)ってきて私にはレベル髙すぎたかと思ったが、そこは何とか回避してもある程度OKな気がしている。(まだやってみてないのでわからないが。)

Pythonの基礎知識」なる項目も存在するがたぶんこれだけじゃわからないだろう。Pythonに関しての基礎知識は別途必要になるのでそれを習得しているのが前提。

最初に素人に毛の生えた程度と言ったが、そんな私が「そうだよね。うん、やったやった。」と頷いていたのが3章まで。4章「実用のためのメソッド」からは本格的な学びの時間。クローラー(クローリングとスクレイピングは違うんですよ!)作成にあたっての注意、エラー処理など直近気になっていたことが目白押し!5章は様々な実例。「これはやったことあるな」「そんな事も出来るのか。また使う機会あるかもな。」とか思いながら読み進める。

頭がついていかず、また使う時にきっちり読もうと流し読みになったのが6章から。Scrapyについて熱くその利便性を語られているんだが、今はまだそんな高度なことしようと思っていない私は「・・・」。

7章はサーバーで運用する話。これは検索結果 Google App Engine (GAE)を使って多少やっているんだけど、この本ではAmazon Web ServicesAWS)を使っての説明。また調べて試してみようかねって気にはさせられたが今の段階ではピンと来ず。並列処理の箇所だけは「これ使いこなしたい」ってなった。

 

というわけで、まだ理解できていない部分が多く残ってはいるが、Pythonによるクローリング・スクレイピングについて基礎的なところから高度なところまで網羅的に学べるのではないかと、素人に毛の生えた私が言ってみる。

ただ、実例コードがいくつも乗っているがそこから自分のしたいことに応用が出来るのか、そう簡単じゃない気がしてるがそこは適宜グーグル先生の力を借りながら右往左往するしかないのかなと。

とりあえず本見ながらやってみますわ。実践第一。プログラミングするために新しいPCも購入したので仮想マシンUbuntuもやってみますよ、えぇ。

 

ツイッターbot作成方法まとめ(バージョン1)

GoogleSpreadSheetをデータベースとして使えるようになった今、当初目指していたツイートbotバージョン1が完成した。すなわち、定期的に情報をツイートする、サイト情報が更新されたらツイートするという二つの機能を実装できるようになった。
今回はバージョン1完成を記念し、これまでの日記風ブログをまとめる形で、ツイートbot作成方法の流れをおさらいしてみようと思う。

1.Pythonを使える環境を整える

私がPythonを導入して1年近く経っていたので、当ブログではその詳細には触れなかったが、「anaconda」をインストールしPython環境を 整え、「jupyter」で編集している。足りないmoduleがあれば「pip install」もしくは「conda install」と唱えれば大体うまくいく(はず)。使用環境を整えたい人がいれば、その辺のキーワードでググってみるといいのではないだろうか。参考までに最近見かけたPython導入記事を置いておく。改めて見ると長いな...。

データサイエンティストを目指す人のpython環境構築 2016 - Qiita

2.Twitter APIの取得

まずは、手動クリックで呟いてみる事から。

ツイッターbot作成の道(その1) - 栗’s diary

3.Google App Engine(GAE)を導入する

(定期的に)自動でツイートするにはサーバーを利用する必要がある。そこで私が利用したのが、グーグルのGoogle App Engine。下記記事にその時の体験を書いているが、いま読み返すと見にくいなぁ...まあ日記ですから。ローカルで上手くいくものがサーバー上だとエラーになる現象には本当手を焼いた。

ツイッターbot作成の道(その1) - 栗’s diary

ツイッターbot作成の道(その2) - 栗’s diary

Google App Engineによるアプリ(ツイッターbot)制作まとめ - 栗’s diary

私の場合、無料でも使える有償アカウントが結局必要になった。

ツイッターbot作成の道(その7):GAE有償アカウント、そして完成へ - 栗’s diary

4.ログを残す方法をマスターする

サイトが更新されたら呟く。それって結局頻繁にそのサイトを訪れて前回から変更があれば呟くという定期botの応用形なんですよね。その際に前回情報を残しておく必要があるわけで。GAEの中のファイルは外から更新できない仕様のようなのでどこか外部に。Googleはサンプルとしてデータストアの使用を挙げていますし、今後どこかでそれは使う予定ですが、とりあえずGoogleSpreadSheetを使ってみましたよと。

ツイッターbot作成の道(その6): GoogleSpreadSheet - 栗’s diary

 

あっさり書くとこんな感じでしょうかね。

今後はWebスクレイピングの技術を高め、pdfの解析、zipファイルの中のエクセルファイルの解析(日銀め...)など出来るようになりたいと思います。

また監視サイトを増やしていった場合に起こるであろう遅延との闘いにも備えないといけません。

慣れて来たらGoogleSpreadSheetからデータストアへの移行もするでしょう。たぶんそっちの方が処理が早いはずだから。

その先は、テキストマイニングとか機械学習とかディープラーニングとかよくわかってませんが、読み込んだデータから市場に与える影響度なんか出せたら格好いいなと思ってます。

短い間、ご愛読ありがとうございました。栗先生の次回作にご期待ください。

ツイッターbot作成の道(その7):GAE有償アカウント、そして完成へ

ツイッターbotも完成だなと、まとめブログを書こうと過去記事を振り返っているとある事に気づきました。

https://appengine.google.com/に行ったらエラーログを見れるという事に...。

そこで吐き出されていたエラー

The Socket API will be enabled for this application once billing has been enabled in the admin console.

あっ、無料じゃSocket API使えないのか...。

今までは60日間無料トライアルを使ってましたが6月26日で切れました。それまで上手くいっていたGoogleSpreadSheetとデータのやり取りが出来なくなってエラーを吐くという事に。くっ、GoogleSpreadSheetマスターしたのに使えないのか...と徒労感を一瞬味わいましたが、有償アカウントに切り替えて無料で使うことが出来るとの事。さっそく設定して無事に難を乗り切りました。たぶん。(後から請求来ないよな、ドキドキ。)

APP ENGINEの料金

有償アカウントへのアップグレード  |  Free Trial  |  Google Cloud Platform

Quotas  |  App Engine  |  Google Cloud Platform

予算の設定などは Google Cloud Platform から。

ついにツイッターbotバージョン1完成しました。

まだ、zipファイル開いてExcelの中身読み込むなんて高等テクニック使えないのでとりあえずこれで勘弁。

ツイッターbot作成の道(その6): GoogleSpreadSheet

ツイッターbotを作る技術として、最後に残るは更新されるや否や呟く。

そのためには、更新されたかどうかを判定するために過去の情報をストックしとかないといけないわけです。

第4回ではjsonファイルに保存しようとして見事に失敗したわけですが(ツイッターbot作成の道(その4) - 栗’s diary)、アプリ外に保存場所を確保しないといけません。

 GAE経由でデータを残す方法としてちょっとググった所、GQLデータストアってのがありました。

GAEのデータストアを使ってみました - 主にプログラムを勉強するブログ

DataStore « python練習帳

これら記事によると、GQLってのはSQLを使い慣れた人用、じゃない人はデータストアらしいです。

これらの技術は、後々使うかもしれません。ただ、使い慣れたもので容易にデータを確認したいと思った栗氏。またYahoo! Financeから金融関係の情報を引っ張ってこられるので使いこなしておきたいとも思った栗氏。

データの保存場所にGoogleSpreadSheetを使ってみる事にしました。

初期設定方法はPython3でGoogle SpreadsheetをDBのように利用するを参考に。思った以上に面倒。

Google側のAPIを有効にしたりKeyを取得したり。

スプレッドシート側で共有設定したり。

正直、何やってるかよくわからないまま言われるがままに設定したらとりあえず初期設定完了。(説明がなかった部分として、サービスアカウントは「App Engine default service account」で。メールアドレスもなかったのでJSONファイルをテキストエディタで開いてゲット。)

ソースコードはこんな感じに。

import gspread
from oauth2client.service_account import ServiceAccountCredentials

scope = ['https://spreadsheets.google.com/feeds']
credentials = ServiceAccountCredentials.from_json_keyfile_name('[ダウンロードしたJSONへのパス]', scope)
gc = gspread.authorize(credentials)
doc_id = '[スプレッドシートのURLからコピーした文字列]'
gfile   = gc.open_by_key(doc_id)
wsheet  = gfile.worksheet(シート名)
records = wsheet.get_all_records()

指定シートのデータを無事に取得できました。
credentialsを取得する方法はUsing OAuth2 for Authorization — gspread 0.3.0 documentationを参考にして、.from_json_keyfile_nameを利用。
両サイトにある「from oauth2client.client import SignedJwtAssertionCredentials」は古いようで、python - ImportError: cannot import name SignedJwtAssertionCredentials - Stack Overflowの回答欄を参考に「from oauth2client.service_account import ServiceAccountCredentials」を使用。

具体的にデータをやり取りする方法は以下のサイトが参考になりました。

[Python] Google SpreadSheetをAPI経由で読み書きする - YoheiM .NET

gspread API Reference — gspread 0.3.0 documentation

 

GAE上でやる場合には、ImportError: No module named gspread から始まって色々なmoduleがないって言われるので都度追加してあげる。ラスボスとして前回記事のようなエラーに遭うかもしれないのでご注意を。