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

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

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

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

Python

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

Q&A

解決済

2回答

662閲覧

Tweepyの時間指定キーワード検索であるはずのツイートがない

Twitter_muzui

総合スコア1

Twitter

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

Python

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

0グッド

0クリップ

投稿2022/12/12 07:16

編集2022/12/14 11:49

実現したいこと

tweepyを使って時間指定をして特定のキーワードを含むツイートを全件取得し、CSV形式で出力したい。
また、リツイートを弾き、 botも弾きたいため、URLを含むツイートも除外。
災害関連のツイートを取得したいため、「火事」や「火災」などで何度か試行している。

発生している問題・エラーメッセージ

CSVで出力はできているが、iOS版のtwitterで検索した場合にあるはずのツイートが無かったり、「火事」と検索するとハッシュタグ「#火事」が含まれている「火事」を含むツイートがPython側で検索に引っ掛からなかったりする。
また、ハッシュタグ「#火事」と検索してもまったく検索に引っ掛から無かったりする。

該当のソースコード

TwitterアカウントはElevatedクラスで、Twitter API v1.1を使用しています。

Python

1#ライブラリのインポート 2import tweepy 3from datetime import datetime,timezone 4import pytz 5import pandas as pd 6 7#Twitterの認証 8api_key = "" 9api_secret = "" 10access_key = "" 11access_secret = "" 12auth = tweepy.OAuthHandler(api_key, api_secret) 13auth.set_access_token(access_key, access_secret) 14api = tweepy.API(auth) 15 16#検索条件の設定 17searchkey = '#火災 -filter:retweets -filter:links' 18date_since = "2022-12-07_23:59:59_JST" 19date_until = "2022-12-08_11:29:59_JST" 20 21#検索条件を元にツイートを抽出 22tweets = tweepy.Cursor(api.search_tweets, 23 q=searchkey, 24 lang='ja', 25 since = date_since, 26 until = date_until, 27 ).items() 28 29#関数: UTCをJSTに変換する 30def change_time_JST(u_time): 31 #イギリスのtimezoneを設定するために再定義する 32 utc_time = datetime(u_time.year, u_time.month,u_time.day, \ 33 u_time.hour,u_time.minute,u_time.second, tzinfo=timezone.utc) 34 #タイムゾーンを日本時刻に変換 35 jst_time = utc_time.astimezone(pytz.timezone("Asia/Tokyo")) 36 # 文字列で返す 37 str_time = jst_time.strftime("%Y-%m-%d_%H:%M:%S") 38 return str_time 39 40#抽出したデータから必要な情報を取り出す 41#取得したツイートを一つずつ取り出して必要な情報をtweet_dataに格納する 42tweet_data = [] 43data_number = 0 44for tweet in tweets: 45 #ツイート時刻とユーザのアカウント作成時刻を日本時刻にする 46 data_number += 1 47 tweet_time = change_time_JST(tweet.created_at) 48 create_account_time = change_time_JST(tweet.user.created_at) 49 #tweet_dataの配列に取得したい情報を入れていく 50 tweet_data.append([ 51 data_number, 52 tweet.id, 53 tweet_time, 54 tweet.text, 55 tweet.favorite_count, 56 tweet.retweet_count, 57 tweet.user.screen_name, 58 tweet.user.name, 59 ]) 60 61#取り出したデータをpandasのDataFrameに変換 62#CSVファイルに出力するときの列の名前を定義 63labels=[ 64 'No.', 65 'ツイートID', 66 'ツイート時刻', 67 'ツイート内容', 68 'いいね数', 69 'リツイート数', 70 'ユーザID', 71 'アカウント名', 72 ] 73#tweet_dataのリストをpandasのDataFrameに変換 74df = pd.DataFrame(tweet_data,columns=labels) 75 76#CSVファイルに出力する 77#CSVファイルの名前を決める 78file_name='' 79#CSVファイルを出力する 80df.to_csv(file_name,encoding='utf-8-sig',index=False)

試したこと

制限があったりするので時間を空けつつ色々検索ワードを変えて試してみているが特に進展はなく、むしろひっかからないツイートが多い。

プログラミングがあまり得意ではないので分かりやすく教えてもらえると幸いです。
よろしくお願いします。

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

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

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

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

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

yuma.inaura

2022/12/12 07:29

コードはコードブロックで囲ってみましょう
quickquip

2022/12/12 07:55

公式クライアントやWeb版Twitterとは結果が異なりますよ(仕様として同じ結果にはならないです) > 「火事」と検索するとハッシュタグ「#火事」が含まれている「火事」を含むツイートがPython側で検索に引っ掛からなかったりする は(内容上問題なさそうなツイートなら)具体的にstatus idを示した方がよいと思います。というか示されない限り特にコメントできなさそうです(上記の理由で)
Twitter_muzui

2022/12/13 06:38

コメントありがとうございます。 すみません、StatusIDとは何でしょうか? ちなみに12/7 23:30:00~12/8 11:59:59においての「#火事」を含むツイートを検索したところ検索結果は0件となっており、仕様がよくわからず困っています。
Twitter_muzui

2022/12/14 04:00

ご丁寧にありがとうございます。 該当のツイートの例としてはStatusIDの抜き方が間違えていたらアレなのでURLで言うと 「https://twitter.com/j_sky_japan/status/1600479031941812225?s=21」が例です。 検索結果が0件に関しては検索のパラメータが searchkey = '#火事 -filter:retweets -filter:links' date_since = "2022-12-07_23:30:00_JST" date_until = "2022-12-08_11:29:59_JST" になってます。再現性がないのはアカウントごとになにか異なるのでしょうか・・・
quickquip

2022/12/14 05:11

(たまたま)接続しているAPIのエンドポイントの物理的なアクセス先で結果が違う、みたいなことは普通にありえると思います。 since, until の指定が間違ってるのですが動作に支障はないレベルのようで、該当のツイートがヒットできるのは確認してます。 質問のコードを第三者が実行できように編集するのは最低限必要ではないかと。
Twitter_muzui

2022/12/14 10:02

すみません、API keyなどは書かないほうがいいと思って省いています。 結局のところ同じコードで取得しているツイートが違うのであればコード自体に問題があるのではなく、通信上の問題、もしくは仕様という認識で合っていますでしょうか? もしそうだとしたら改善策は特にないですかね・・・?
quickquip

2022/12/14 10:21 編集

インデントがわかるようにしてください(あいまいに書いてしましたが、最初のyuma.inauraさんのコメントですでに出てます)。もちろんキーは空白でよいです。 仕様として「ヒットするとは限らない」はたしかにそうなのですが、他の原因がないかどうかは気になります。
Twitter_muzui

2022/12/14 11:45

何度もご丁寧に返答していただきありがとうございます。 コードブロックとはそのことだったんですね、VSCodeからそのままコピー&ペーストしただけでした。 すみませんでした。修正して以後気をつけます。 tweepyを使っておられないとのことですが、tweepy側に問題があるという可能性もあるのでしょうか? もしくはハッシュタグがURL判定になっていて'-filter:links'が弾いている可能性とか・・・ 日付的にも12/7のツイートが検索できなくなるので同じ条件で試すということができないのが申し訳無いです・・・
Twitter_muzui

2022/12/14 12:00

すみません、今'-filter:links'を消去して再度試してみたところ、上の返信で検索に引っかからない例としてあげたツイートがひっかかりました。どうやら画像や動画が埋め込みリンクとして動作しているみたいで、URLを除外すると画像や動画が添付されているツイートも除外してしまうみたいです。 検索に引っかからないツイートが全部これに該当するのかどうかは分かりませんし、tweepy側にもしかしたら何かある可能性もありますが、少なくとも引っかからず気になっていたツイートは表示されましたので、一旦解決?かもしれないです。 数日かけて何度もご丁寧な返答ありがとうございました。
Twitter_muzui

2022/12/14 12:04

何か適当に回答を投稿していただければベストアンサーにします。 よろしくお願いします。
quickquip

2022/12/16 05:37

自己回答でベストアンサーして大丈夫です(私はそちらのほうが好ましいと思っています)
Twitter_muzui

2022/12/19 05:10

返信が遅れてしまい申し訳ありません。 了解しました。ありがとうございました。 また何かあればよろしくお願いします!
guest

回答2

0

自己解決

動画・画像が含まれるツイートでは動画・画像が埋め込みリンクとして添付されているため、検索条件に'-filter:links'を入れてURLを除外してしまうと動画・画像が含まれるツイートが表示されなくなるので、検索に引っかからなかったみたいです。

投稿2022/12/19 05:12

Twitter_muzui

総合スコア1

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

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

0

iOS版のtwitterで検索した場合にあるはずのツイートが無かったり

まずTwitterAPI全般の制限として、アプリ上の検索結果とは異なる(取りこぼしがありえる)可能性があったと思います。
公式の発言は探しきれませんでしたし、access levelsによるかもしれませんが。

以下の回答は削除

> 「火事」と検索するとハッシュタグ「#火事」が含まれている「火事」を含むツイートがPython側で検索に引っ掛からなかったりする。

これについては検索キーワードの仕様Building queries for Search Tweetsを確認してみてください。
動作未検証ですが'#火災 -filter:retweets -filter:links''#火災 -is:retweet -has:links'であるべきかと思います。

投稿2022/12/12 07:49

編集2022/12/12 08:17
can110

総合スコア38266

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

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

can110

2022/12/12 08:18

ご指摘ありがとうございます。 たしかに異なるバージョンのページを参照していたため回答修正しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問