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

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

新規登録して質問してみよう
ただいま回答率
86.02%
スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Twitter

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

Python

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

Q&A

解決済

Twitteのタイムラインの3200件以上のスクレイピングについて

Lia
Lia

総合スコア9

スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Twitter

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

Python

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

1回答

0グッド

0クリップ

246閲覧

投稿2022/11/03 10:13

編集2022/11/05 11:21

前提

pythonにて、TwitterAPIを介してTwitterをスクレイピングしました。
ここでは例としてアニメ「ドラえもん」の公式アカウントのタイムラインを取得しています。

windows11
jupyter notebook (python)
ライブラリはtweepyを使用
TwitterAPIのアクセスレベルは「Elevated」となっています。

実現したいこと

公式アカウント(公式マーク)の入ったタイムラインのみがcsvファイルにうまく収集できないです。
公式ではないものは収集できるのですが、公式の場合、エラーも何も出ずに何秒か経ってからcsvファイルが生成されます。中身を観ると空白なので、読み込んではいるけどうまく出力できないようです。
なのですべてのアカウントに対して指定期間をしても取得できるようにしたいです。

原因

TwitterAPIは3200件までしか取得できないようになっていますが、それは「取得する件数が3200件まで」だとおもっていました。しかし、アカウントのツイート数がそもそも3200を超えていた場合、2日間の期間のみを取得するために期間指定しても、今回のようにcsvファイルが空白の状態になってしまうのではないかと予想しました。

例えば近日の期間指定(2022/1/1~2022/3/1)だと「最新ツイートから3200件を超えていない」ため取得できました。しかし2019年あたりを指定するとやはり空白になってしまいましたのでほぼ原因は突き止められました。

3200件以上のツイートをしている巨大な公式アカウントのスクレイピングは過去を遡り古いツイートを取得できる方法はないのでしょうか
何かアドバイスありましたらよろしくお願いいたします。

コード説明

タイムラインの期間指定、そしてアカウント作成日時の変数を取得するためにコードの中ほど、UTCをJSTに変換したり、日本時刻に変換したりしています。

該当のソースコード

python

1import tweepy 2import pandas as pd 3import csv 4import time 5import datetime 6from datetime import datetime,timezone 7import pytz 8 9 10# 各種ツイッターのキーをセット 11consumer_key = '' 12consumer_secret = '' 13access_key = '' 14access_secret = '' 15 16auth = tweepy.OAuthHandler(consumer_key, consumer_secret) 17auth.set_access_token(access_key, access_secret) 18api = tweepy.API(auth) 19 20 21startdate = pd.to_datetime("2015/11/13", utc = True) 22enddate = pd.to_datetime("2016/4/3", utc = True) 23 24tweet_data = list() 25fmt = "%Y-%m-%d_%H:%M:%S" 26 27#screen_nameは@から始まる名前(ユーザー名) 28tweets = tweepy.Cursor(api.user_timeline, screen_name = "doraemonChannel", exclude_replies = True).items() 29 30 31#関数: UTCをJSTに変換する 32def change_time_JST(u_time): 33 34 #イギリスのtimezoneを設定するために再定義する 35 utc_time = datetime(u_time.year, u_time.month,u_time.day, \ 36 u_time.hour,u_time.minute,u_time.second, tzinfo=timezone.utc) 37 38 #タイムゾーンを日本時刻に変換 39 jst_time = utc_time.astimezone(pytz.timezone("Asia/Tokyo")) 40 41 # 文字列で返す 42 str_time = jst_time.strftime("%Y-%m-%d_%H:%M:%S") 43 return str_time 44 45 46for tweet in tweets: 47 #ツイート時刻とユーザのアカウント作成時刻を日本時刻にする 48 tweet_time = change_time_JST(tweet.created_at) 49 create_account_time = change_time_JST(tweet.user.created_at) 50 51 52 if tweet.created_at < enddate and tweet.created_at > startdate: 53 54 tweet_data.append([ 55 tweet.id, 56 tweet_time, 57 tweet.text, 58 tweet.favorite_count, 59 tweet.retweet_count, 60 tweet.user.name, 61 tweet.user.friends_count, 62 tweet.user.followers_count, 63 create_account_time, 64 ]) 65 66 67labels=[ 68 'ツイートID', 69 'ツイート時刻', 70 'ツイート本文', 71 'いいね数', 72 'リツイート数', 73 'アカウント名', 74 'フォロー数', 75 'フォロワー数', 76 'アカウント作成日時' 77] 78 79#tw_dataのリストをpandasのDataFrameに変換 80df = pd.DataFrame(tweet_data,columns=labels) 81 82file_name="doraemon.csv" 83 84df.to_csv(file_name, encoding='utf-8-sig',index=False) 85

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

回答1

0

自己解決

API制限の3200件以上は遡れないというものでした。
期間指定しても最新からの3200件なので注意が必要でした。

投稿2022/11/09 00:26

Lia

総合スコア9

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

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

ただいまの回答率
86.02%

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

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

質問する

関連した質問

同じタグがついた質問を見る

スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Twitter

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

Python

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