また、後日、セットアップ方法はまとめるが、 とりあえず、Twitter-Get-Old-Tweets-Scraperのセットアップが完了した。

結局のところ、インストールするパッケージリストに、いまは存在しないものがあり、そこでつっかかっていただけだった。無難に、一つ一つインストールできるものだけ、 入れたら、普通に動いた(苦笑)

ちなみに、今回はPython3.7環境にしている。(仕様上、Python2.x系へは対応していない模様。おそらくURLリクエスト系の仕様変更に伴うだろうから、たぶん簡単に直せると思う)

さて、いよいよTwitterのスクレイピングコードの作成へ。 まずは、チュートリアルにあるサンプルを実行しようとすると、一部できないところがあった。おいおい・・・

サンプルコードの中身を見ると、結構おざなりなところが所々あった。 まず、ユーザー名指定する場合、サンプルコードでは、

python main.py --username "barackobama" --max-tweets 1

とあったが、これだと、No query placed.とエラー表示されて実行できない。 それもそのはずで、scraper/controllers.pyの160行目〜175行目を見ると、

data = ''

if hasattr(tweet_criteria, 'username'):
    data += ' from:' + tweet_criteria.username

if hasattr(tweet_criteria, 'since'):
    data += ' since:' + tweet_criteria.since

if hasattr(tweet_criteria, 'until'):
    data += ' until:' + tweet_criteria.until

if hasattr(tweet_criteria, 'query'):
    data += ' ' + tweet_criteria.query
else:
    print('No query placed.')
    return

これはいけない。。。この仕様だと、オプション引数--queryが無いと、175行目で必ずreturnが返ってそこで終了してしまう。 作者の意図を汲み取ると、ここは--query--usernameのどちらか一方でもあれば良いので、(両方はOK)

data = ''

if hasattr(tweet_criteria, 'query'):
    data += ' ' + tweet_criteria.query

if hasattr(tweet_criteria, 'username'):
    data += ' from:' + tweet_criteria.username

if data == '':
    print('No query placed.')
    return

if hasattr(tweet_criteria, 'since'):
    data += ' since:' + tweet_criteria.since

if hasattr(tweet_criteria, 'until'):
    data += ' until:' + tweet_criteria.until

とすれば良いだろう。 ちなみに、変数dataへ格納するパラメータの並び順を変えてしまったが、 後述するリクエストURLに流してこんでみると、順番は関係ない模様。 ちょっとかっこ悪い書き方だが、いちおうこれで、サンプルの使用法通りに使えるようになる。

例えば、 キーワードだけ(「やったぜ日産」)を指定して、2016年1月1日〜2018年11月20日のツイート10件を取得する場合

python main.py --query "やったぜ日産" --since 2016-01-01 --until 2018-11-21  --max-tweets 10

キーワード(「やったぜ日産」)とユーザ名(「Syamu_Garage」さん)の両方を指定して、2016年1月1日〜2018年11月20日のツイート10件を取得する場合

python main.py --query "やったぜ日産" --username "Syamu_Garage" --since 2016-01-01 --until 2018-11-21  --max-tweets 10

最後に問題だった、ユーザ名だけ(「Syamu_Garage」さん)を指定して、2016年1月1日〜2018年11月20日のツイート10件を取得する場合

python main.py --username "Syamu_Garage" --since 2016-01-01 --until 2018-11-21  --max-tweets 10

応用として、--queryの引数は、どうもスペース区切りで入れると、AND条件となるようだ。 例えば、”Apple” かつ “Pen” 両方を含むツイートを取得したい場合は、

python main.py --query "Apple Pen" --max-tweets 10

となる。