#動機
クローリングとAPIの扱いについて勉強するために、実際にTwitter用のクローリングツールを作ってみることにしました。
#環境
今回開発を行う環境は以下の通りです。
MacBook Air (Retina, 13-inch, 2018)
プロセッサ 1.6 GHz Intel Core i5
メモリ 8 GB 2133 MHz LPDDR3
#APIの導入手順
APIを導入するにあたって、以下のような手順を行います。
- TwitterAPIキーの取得
- クローラーの実装
##1. TwitterAPIキーの取得
まずこちらのサイトでTwitterAPIキーを手に入れます
Twitter Developers
こちらでAPIキーが欲しいアカウントでログインしたあとCreate an appをクリックしたあと承認を押します。
その後色々聞かれますがこれらに適当に答えます。そうしたら以下の四つのAPIキーが手に入ります。
Consumer Key
Consumer Secret Key
Access Token
Access Secret Token
##2. クローラーの実装
クローラーはモジュールとしても使えるように実装していきます
まず以下のようなconfig.pyを作成します
Consumer_Key = "Comsumer Key"
Consumer_Secret_Key = "Consumer Secret Key"
Access_Token = "Access Token"
Access_Secret_Token = "Access Secret Token"
次に__init__.py
という空のファイルを作成しておきます
そしてこれらのファイルを使って、クローラーを実装していきます。
実装するクローラーファイルの名前はtweet_butler.pyとします。これをconfig.pyファイルと同じ階層に作成して実装していきます。
###import
from . import config
from requests_oauthlib import OAuth1Session
import json
from . import config
の部分は相対パスでimportするもので__init__.py
ファイルがないとImport errorが起こってしまうので注意してください。
config.pyファイルはAPIキーを使用するために、requests_oauthlibライブラリはOAuth認証をするために必要となります。さらにAPIのレスポンスはjsonファイルで帰ってくるのでjsonライブラリもインポートしておきます。
次にAPIを用いて検索を行います。
CK = config.Consumer_Key
CS = config.Consumer_Secret_Key
AT = config.Access_Token
AS = config.Access_Secret_Token
twitter = OAuth1Session(CK, CS, AT, AS)
params = { q : "検索ワード" }
res = twitter.get(url, params = params)
これでAPIからのレスポンスが得られます。
その後ステータスコードが200であることを確かめてから本文をjson形式で手に入れます。
if res.status_code == 200:
search_result = json.loads(res.text)
これらの動作をクラスとして行うようにしたいので、新しくButlerクラスを用意します。
###Butlerクラス
class Butler:
def __init__(self,setting = config):
self.api = OAuth1Session(setting.Consumer_Key, setting.Consumer_Secret_Key, setting.Access_Token, setting.Access_Secret_Token)
self.search_url = "https://api.twitter.com/1.1/search/tweets.json"
def search(self,word,count=10):
params = {"q":word,"count":count}
res = self.api.get(self.search_url, params = params)
if res.status_code == 200:
search_results = json.loads(res.text)
tweets = [Tweet(result) for result in search_results["statuses"]]
return tweets
検索結果を受け取る際に、tweet(result)
というコードがありますが、これはtweetを辞書形式で扱うのは面倒なのでtweetのクラスを別に作ってそこに辞書型の配列を渡しています。
###Tweetクラス
class Tweet:
def __init__(self,tweet):
self.dict = tweet
self.tweet_id = tweet["id"]
self.user_id = tweet["user"]["id"]
self.user_name = tweet["user"]["screen_name"]
self.text = tweet["text"]
self.created_at = tweet["created_at"]
self.favorite_count = tweet["favorite_count"]
self.hashtags = tweet["entities"]["hashtags"]
self.symbols = tweet["entities"]["symbols"]
self.mention = tweet["entities"]["user_mentions"]
def get_text(self):
return self.text
今の時点では、tweetからは本文のみしか必要ないのでtweetクラスは簡単に作っています。これでbutlerから受け取ったtweetのリストに対して、get_textを行えば本文がそれぞれ手に入ります。
#続く
次はBatlerにuserのプロフィールを検索する機能をつけたり、userのクラスを作ってみたりしたいと思います。