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

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

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

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

Twitter

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

Python

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

Q&A

解決済

1回答

657閲覧

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

Lia

総合スコア9

スクレイピング

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

Twitter

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

Python

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

0グッド

0クリップ

投稿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

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

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

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

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

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

guest

回答1

0

自己解決

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

投稿2022/11/09 00:26

Lia

総合スコア9

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問