サンプルコード実行と解析
また、後日、セットアップ方法はまとめるが、 とりあえず、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
となる。