質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Twitter

Twitterは、140文字以内の「ツイート」と呼ばれる短文を投稿できるサービスです。Twitter上のほぼ全ての機能に対応するAPIが存在し、その関連サービスが多く公開されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

1回答

2025閲覧

python searchtweetsパッケージを用いたツイートの取得・保存

yukifujiwara

総合スコア11

Twitter

Twitterは、140文字以内の「ツイート」と呼ばれる短文を投稿できるサービスです。Twitter上のほぼ全ての機能に対応するAPIが存在し、その関連サービスが多く公開されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2018/12/27 06:25

編集2018/12/28 02:14

pythonとfull archive premium APIを用いて、Tweetを取得しようとしています。

利用しているPC:windows 10 pro
anaconda3をウエブからダウンロード
pythonのバージョン:3.7.0

python searchtweetsパッケージ [GitHub]のサイトを参考にしているのですが、上手くいきません。


  • 試しに30days sandbox APIを利用して、12/1に投稿された「iphone」を含むツイートを取得しようとしました。

twitter_keys.yaml という名前のファイルを作成し、以下のコードを打ちました。
()の中は私のconsumer keyなどを入力しています。
Anaconda3ファイルの中に保存しています。

search_tweets_api: account_type: premium endpoint: <https://api.twitter.com/1.1/tweets/search/30day/().json> consumer_key: <()> consumer_secret: <()>

以下をコマンドプロンプトに入力しました。

python search_tweets.py --max-results 100 --results-per-call 100 --filter-rule "iPhone lang:ja since:2018-12-01 until:2018-12-02" ---filename-prefix test_search --print-stream

すると"can't open file 'search_tweets.py': [Errno 2] No such file or directory"と表示されます。
イメージ説明


以下をコマンドプロンプトに入力しました。

search_tweets.py --max-results 100 --results-per-call 100 --filter-rule "iPhone lang:ja since:2018-12-01 until:2018-12-02" ---filename-prefix test_search --print-stream

すると以下の画面が開きます。(長いです)
開く画面は、左上に「Python 2.7.8: search_tweews.py - C:\Users\SOCIAL002\Anaconda3\Scripts\search_tweets.py」と表示されている白い画面です。(python Shell)

#!c:\users\social002\anaconda3\python.exe # Copyright 2017 Twitter, Inc. # Licensed under the Apache License, Version 2.0 # http://www.apache.org/licenses/LICENSE-2.0 import os import argparse import json import sys import logging from searchtweets import (ResultStream, load_credentials, merge_dicts, read_config, write_result_stream, gen_params_from_config) logger = logging.getLogger() # we want to leave this here and have it command-line configurable via the # --debug flag logging.basicConfig(level=os.environ.get("LOGLEVEL", "ERROR")) REQUIRED_KEYS = {"pt_rule", "endpoint"} def parse_cmd_args(): argparser = argparse.ArgumentParser() help_msg = """configuration file with all parameters. Far, easier to use than the command-line args version., If a valid file is found, all args will be populated, from there. Remaining command-line args, will overrule args found in the config, file.""" argparser.add_argument("--credential-file", dest="credential_file", default=None, help=("Location of the yaml file used to hold " "your credentials.")) argparser.add_argument("--credential-file-key", dest="credential_yaml_key", default=None, help=("the key in the credential file used " "for this session's credentials. " "Defaults to search_tweets_api")) argparser.add_argument("--env-overwrite", dest="env_overwrite", default=True, help=("""Overwrite YAML-parsed credentials with any set environment variables. See API docs or readme for details.""")) argparser.add_argument("--config-file", dest="config_filename", default=None, help=help_msg) argparser.add_argument("--account-type", dest="account_type", default=None, choices=["premium", "enterprise"], help="The account type you are using") . . .(文字制限を超えるため中略) argparser.add_argument("--debug", dest="debug", action="store_true", default=False, help="print all info and warning messages") return argparser def _filter_sensitive_args(dict_): sens_args = ("password", "consumer_key", "consumer_secret", "bearer_token") return {k: v for k, v in dict_.items() if k not in sens_args} def main(): args_dict = vars(parse_cmd_args().parse_args()) if args_dict.get("debug") is True: logger.setLevel(logging.DEBUG) logger.debug("command line args dict:") logger.debug(json.dumps(args_dict, indent=4)) if args_dict.get("config_filename") is not None: configfile_dict = read_config(args_dict["config_filename"]) else: configfile_dict = {} extra_headers_str = args_dict.get("extra_headers") if extra_headers_str is not None: args_dict['extra_headers_dict'] = json.loads(extra_headers_str) del args_dict['extra_headers'] logger.debug("config file ({}) arguments sans sensitive args:".format(args_dict["config_filename"])) logger.debug(json.dumps(_filter_sensitive_args(configfile_dict), indent=4)) creds_dict = load_credentials(filename=args_dict["credential_file"], account_type=args_dict["account_type"], yaml_key=args_dict["credential_yaml_key"], env_overwrite=args_dict["env_overwrite"]) dict_filter = lambda x: {k: v for k, v in x.items() if v is not None} config_dict = merge_dicts(dict_filter(configfile_dict), dict_filter(creds_dict), dict_filter(args_dict)) logger.debug("combined dict (cli, config, creds) sans password:") logger.debug(json.dumps(_filter_sensitive_args(config_dict), indent=4)) if len(dict_filter(config_dict).keys() & REQUIRED_KEYS) < len(REQUIRED_KEYS): print(REQUIRED_KEYS - dict_filter(config_dict).keys()) logger.error("ERROR: not enough arguments for the program to work") sys.exit(1) stream_params = gen_params_from_config(config_dict) logger.debug("full arguments passed to the ResultStream object sans password") logger.debug(json.dumps(_filter_sensitive_args(stream_params), indent=4)) rs = ResultStream(tweetify=False, **stream_params) logger.debug(str(rs)) if config_dict.get("filename_prefix") is not None: stream = write_result_stream(rs, filename_prefix=config_dict.get("filename_prefix"), results_per_file=config_dict.get("results_per_file")) else: stream = rs.stream() for tweet in stream: if config_dict["print_stream"] is True: print(json.dumps(tweet)) if __name__ == '__main__': main()

どのようにすれば上手くいくでしょうか。
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

can110

2018/12/27 06:38

「以下の画面が開きます。」とありますが、どのようなアプリケーションの画面でしょうか? (メモ帳、コマンドプロンプトなど??) また、OS、Pythonバージョンなどの環境についても追記ください。
yukifujiwara

2018/12/27 06:54

利用しているPC:windows 10 pro anaconda3をウエブからダウンロードしました。 pythonのバージョン:3.7.0 開く画面は、左上に「Python 2.7.8: search_tweews.py - C:\Users\SOCIAL002\Anaconda3\Scripts\search_tweets.py」と表示されている白い画面です。(python Shellというものでしょうか、、、) 質問いただいた内容は、本文にも追記しておきます。 よろしくお願いします。
can110

2018/12/27 07:04

了解しました。
guest

回答1

0

ベストアンサー

まず前提として、質問者様はAPI付属のコマンドラインアプリであるsearch_tweets.pyを実行されようとしていると思われます。しかし実際にはsearch_tweets.pyファイルがアプリケーションIDLE開いてしまっているようです。
実行するには、コマンドプロンプトでpython search_tweets.py --max-results ~のように先頭にpythonと打ってください。するとsearch_tweets.pyが実行されるはずです。

そのうえで…

YAMLファイルはどこに保存すればよいか

どこでもよいです。--credential-fileで指定できるようになっています。
未指定だと~/.twitter_keys.yamlにあるとみなされます。

コードはコマンドプロンプトに打つのか

コマンドラインアプリsearch_tweets.pyではなく、独自に作成したコード上でAPIを利用したいということでしょうか?
でしたら、適当なテキストエディタで.pyファイルを作成してコードを書きます。このあたりは、通常のPython上での開発と同じです。
具体的なコードの記述例はsearch-tweets-python/examples/api_example.rstなどに記載されています。

出力したファイルはどこにあるのか

再びコマンドラインアプリsearch_tweets.py上でのお話に戻ります。
コマンドラインで実行中のカレントディレクトリに、--filename-prefixで指定したファイル名で出力されるようです。また、中身はJSON形式のようです。

以上の事柄はPython Twitter Search APIに記載されていますので、長いですがひととおり目を通す必要があります。

なお、もしPyhton導入直後で開発に不慣れであれば、まずは基礎的な知識(テキストファイルの読み書きなど)を先に学習することをお勧めします。

投稿2018/12/27 07:04

編集2018/12/27 07:06
can110

総合スコア38262

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yukifujiwara

2018/12/27 08:37

回答ありがとうございます。 先頭にpythonをつけて、先ほどの"search_tweets.py" を実行したところ、"SyntaxError: invalid syntax"と返されます。 どこに間違いがあるか、GitHubを見ながら修正してみましたが上手くいきません。 pythonの経験がすごく浅いのでじっくり勉強したいのですが、個人的な理由ですぐにツイートを取得する必要があり困っています。 もしこの分野に詳しい方がいればお力をお借りしたいと考え投稿させていただきました。 よろしくお願いします。
can110

2018/12/27 08:44

もしかしてPythonの対話モード上でsearch_tweet.pyと入力していませんか? ただこれは推測なので、スクリーンショット画面を質問本文に貼ると他の方含め回答もらえるかもしれません。 なお、数日でよいので基礎的な部分だけでも学習して押さえておいたほうがよいです。 本来の目的以前の部分に時間をとられ、結果的に時間がかかってしまう恐れが十分にあります。
yukifujiwara

2018/12/28 02:23

コメントが遅くなり申し訳ありません。 おっしゃる通り、対話モード上で"python search_tweets.py --max..."を入力すると、"SyntaxError: invalid syntax"と返されました。 対話モードを解除し入力すると、"can't open file 'search_tweets.py': [Errno 2] No such file or directory"と返されます。 先頭にpythonを付けずに入力しIDLEで開かれたものに、キーなど入力してpythonで実行するのでしょうか。 アドバイスありがとうございます。一度pythonの基本的なところも調べてみようと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問