PythonとTwitterAPIでクローリング１〜簡易な検索機能

#動機
　クローリングとAPIの扱いについて勉強するために、実際にTwitter用のクローリングツールを作ってみることにしました。

#環境
　今回開発を行う環境は以下の通りです。

　MacBook Air (Retina, 13-inch, 2018)
　プロセッサ　1.6 GHz Intel Core i5
　メモリ　　　8 GB 2133 MHz LPDDR3

#APIの導入手順
　APIを導入するにあたって、以下のような手順を行います。

1. TwitterAPIキーの取得
2. クローラーの実装


##1. TwitterAPIキーの取得
　まずこちらのサイトでTwitterAPIキーを手に入れます
　[Twitter Developers](https://developer.twitter.com/en/apps)
　こちらでAPIキーが欲しいアカウントでログインしたあとCreate an appをクリックしたあと承認を押します。
　その後色々聞かれますがこれらに適当に答えます。そうしたら以下の四つのAPIキーが手に入ります。

　Consumer Key
　Consumer Secret Key
　Access Token
　Access Secret Token

##2. クローラーの実装
　クローラーはモジュールとしても使えるように実装していきます
　まず以下のようなconfig.pyを作成します

```python:config.py
Consumer_Key = "Comsumer Key"
Consumer_Secret_Key = "Consumer Secret Key"
Access_Token = "Access Token"
Access_Secret_Token = "Access Secret Token"
```
　次に`__init__.py`という空のファイルを作成しておきます

```python:__init__.py

```
　そしてこれらのファイルを使って、クローラーを実装していきます。
　実装するクローラーファイルの名前はtweet_butler.pyとします。これをconfig.pyファイルと同じ階層に作成して実装していきます。

###import
```python:tweet_butler.py
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を用いて検索を行います。

```python:tweet_butler.py
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形式で手に入れます。

```python
if res.status_code == 200:
    search_result = json.loads(res.text)
```

これらの動作をクラスとして行うようにしたいので、新しくButlerクラスを用意します。

###Butlerクラス

```python:tweet_butler.py
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クラス
```python:tweet_butler.py
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のクラスを作ってみたりしたいと思います。



#参考
[TwitterAPIを用いたクローラー作成](https://datumstudio.jp/blog/twitterapi%E3%82%92%E7%94%A8%E3%81%84%E3%81%9F%E3%82%AF%E3%83%AD%E3%83%BC%E3%83%A9%E3%83%BC%E4%BD%9C%E6%88%90)
[twitter developer](https://developer.twitter.com/en/docs/tweets/search/api-reference/get-search-tweets)