以前に書いた、こちらの記事 「TwitterAPI でツイートを大量に取得」 で、ツイートを取得するプログラムを作ってみました。この時は、取得したツイートを print して終わりだったのですが、せっかくなので保存することを考えてみます。
保存先は MongoDB です。スキーマの定義が不要で楽そうだし、キー・バリュー形式でデータ保存するので TwitterAPI との相性もよさそうだからです。
MongoDB 環境づくり
インストール
インストールはいたって簡単でした。
- ① MongoDB のサイト から下記インストーラー(時点で最新)をダウンロード
mongodb-win32-x86_64-2008plus-ssl-3.2.6-signed.msi - ② インストール (デフォルトのままで OK)
- ③ データ用、ログ用のディレクトリを作成 (どこでもいいし、名前も任意)
たとえば
データ用 E:\MongoDB\data
ログ用 E:\MongoDB\log
起動確認
インストール先ディレクトリへ移動し、
1 |
> cd C:\Program Files\MongoDB\Server\3.2\bin |
起動。–dbpath にデータ用ディレクトリ、–logpath にログ用ディレクトリ\ログファイル名
1 |
> mongod --dbpath E:\MongoDB\data --logpath E:\MongoDB\log\log.txt |
Mongoシェル
Mongoシェル は対話型のクライアントで、コマンドベースで MongoDB を操作できます。Oracle にとっての SQL*Plus みたいなものです。
起動は、インストール先ディレクトリへ移動し
1 |
> mongo |
と入力するだけです。
バッチファイル
MongoDB をサービスとして登録可能なようですが、たまに使いたいだけなので、それはちょっと大げさ。バッチファイルを作成することにしました。
MongoDB 起動用
1 2 |
cd C:\Program Files\MongoDB\Server\3.2\bin mongod --dbpath E:\MongoDB\data --logpath E:\MongoDB\log\log.txt |
Mongoシェル 起動用
1 2 |
cd C:\Program Files\MongoDB\Server\3.2\bin mongo |
pymongo
python から MongoDB を操作するためにパッケージ pymongo を使います。インストールは
1 |
pip install pymongo |
これで環境まわりは OK。
ツイート保存
ツイート取得機能は 「TwitterAPI でツイートを大量に取得」 で作成済みなので、それをそのまま利用します。(以降のサンプルでは http://ailaby.com/twitter_api/#id6_1 のソースを twitterAPI.py として保存して使用)
MongoDB に保存
以下のプログラムで、”渋谷” を含むツイートを 50,000 件取得し MongoDB に保存します。DB名、コレクション名は
- DB名 : mydb
- コレクション名 : shibuya
にしました。ちなみに “コレクション” というのは RDB の “テーブル” に相当します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
# -*- coding: utf-8 -*- from pymongo import MongoClient # http://ailaby.com/twitter_api/#id6_1 のソースを # twitterAPI.py で保存 from twitterAPI import TweetsGetter client = MongoClient('localhost', 27017) db = client.mydb tweets = TweetsGetter.bySearch(u'渋谷').collect(total=50000) for tweet in tweets: tweet2 = {} tweet2['id'] = tweet['id'] tweet2['text'] = tweet['text'] tweet2['created_at'] = tweet['created_at'] tweet2['user'] = {'screen_name' : tweet['user']['screen_name']} db.shibuya.insert(tweet2) |
tweet をそのまま insert してもいいのですが、TwitterAPI のレスポンスには結構いろいろな付加情報がのっており、その分サイズも大きいので、ここでは欲しい項目だけ tweet2 に移しかえて保存しています。トータルの実行時間は一時間強でした。
MongoDB から読み込み
書き込んだツイートを読みだします。
1 2 3 4 5 6 7 8 9 10 11 12 |
from pymongo import MongoClient client = MongoClient('localhost', 27017) db = client.mydb cnt = 0 for record in db.shibuya.find(): cnt += 1 print '----',cnt print record['text'] |
Mongo シェルで確認
保存した内容は Mongo シェルでも確認できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
> use mydb switched to db mydb > db.shibuya.count() # 件数確認 50000件 50000 > db.shibuya.findOne() # 先頭の 1 件を表示 { # メッセージ内容は xxx で伏せました "_id" : ObjectId("57655a53f01f301c24f0eaa4"), "text" : "xxxxxxxxxxxxxxxxxxxxxx", "created_at" : "Sat Jun 18 14:27:06 +0000 2016", "id" : NumberLong("744174606148198400"), "user" : { "screen_name" : "xxxxx" } } |
MongoDB 終了
Mongoシェルの終了は
1 |
> exit |
MongoDB の終了は ctrl-C です(データ書き込み中だとこわい。正しい落とし方が他にあるのかも)。
a.okuya says:
python勉強中。初心者です。
「TwitterAPI でツイートを大量に取得」に記載されている「ソース」をコピペして、TweetsGetter.pyというpythonファイル名でセーブしました。次に、「MongoDB に保存」に記載されているコードをコピペして、getTweets_saveMongo.pyというファイル名でTweetsGetter.pyと同じディレクトリにセーブして、getTweets_saveMongo.py実行させたところ、以下のエラーとなります。
修正方法をご教示願います。
>python getTweets_saveMongo.py
Traceback (most recent call last):
File "getTweets_saveMongo.py", line8, in
from twitterAPI import TweetsGetter
ModuleNotFoundError: No module named 'twitterAPI'
a.okuya says:
自己解決しました。TweetsGetter.pyというpythonファイル名でセーブするのではなく、twitterAPI.pyでセーブし直したら解決しました。お騒がせしました。
py says:
管理人様、いつも参考にさせていただいております。
大量にツイートをmongoDBに保存しようとこちらを参考に実行したところ、最初のツイート取得は問題なく行えました。しかし取得上限に達しリセットされるまで待機状態になると復活せず、
TimeoutError: [WinError 10060] 接続済みの呼び出し先が一定の時間を過ぎても正しく応答しなかったため、接続できませんでした。または接続済みのホストが応答しな かったため、確立された接続は失敗しました。
というメッセージが出てきます。
別のPCで行ったところ問題なく実行されるのですが、この場合何が原因かわかりますでしょうか。