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

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

新規登録して質問してみよう
ただいま回答率
85.30%
Instagram API

Instagram APIは、写真共有SNSであるInstagramの投稿写真をWebサイトに掲載するためのAPIです。取得することでWebサイトと連携し、自動的に投稿写真を表示することができます。

Python

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

Q&A

解決済

2回答

728閲覧

Instagramのデータ取得にあたり、最大数以上のデータを取得したい

ttttt08

総合スコア17

Instagram API

Instagram APIは、写真共有SNSであるInstagramの投稿写真をWebサイトに掲載するためのAPIです。取得することでWebサイトと連携し、自動的に投稿写真を表示することができます。

Python

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

0グッド

0クリップ

投稿2022/10/12 02:56

編集2022/10/13 10:13

前提

下記のHPを参考にし、データを取得しています。
https://gaaaon.jp/blog/instagram

Instagramのデータ取得件数は最大で50件であると記載されていたので、下記コードで実行した結果、50件+’next’のurlも確認できています。

response = requests.get(url) json_data = response.json() for i in range(50): print(json_data["data"][i]) print (json_data["paging"]) info = json_data df2 = pd.json_normalize(info['data']) df2.to_csv(r"sample02.csv",encoding='utf-8-sig')

実現したいこと

51件目以降のデータも取得したく、下記コードにて実行してみました。
*print("======================================")は、50件が何回繰り返されているのか自身が分かりやすくするなるように書いています。

response = requests.get(url) json_data = response.json() for b in range(2): url=json_data["paging"]["next"] response = requests.get(url) json_data = response.json() print("======================================") print("======================================") for i in range(50): print(json_data["data"][i]) print (json_data["paging"]) info = json_data df2 = pd.json_normalize(info['data']) print(df2) df2.to_csv(r"sample03.csv", mode = 'a',encoding='utf-8-sig')

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

発生したエラーメッセージは下記のようになります。

--------------------------------------------------------------------------- KeyError Traceback (most recent call last) Input In [61], in <cell line: 5>() 2 json_data = response.json() 5 for b in range(2): ----> 6 url=json_data["paging"]["next"] 7 response = requests.get(url) 8 json_data = response.json() KeyError: 'paging'

これは、取得しようとしている元の件数がfor文で2回回していますが、それ以下の件数のためエラーになっているのか、それとも、そもそも構文が間違っているのでしょうか?

参考にしているHPでは、「2ページ目以降(51件以降)は同じURLを叩き続ける(返ってくるデータは更新される)必要がある」とありますが、これは、

response = requests.get(url) json_data = response.json() for i in range(50): print(json_data["data"][i]) print (json_data["paging"]) info = json_data df2 = pd.json_normalize(info['data']) df2.to_csv(r"sample02.csv",encoding='utf-8-sig')

のコードを叩き続ければ、勝手に51件目、61件目となっていくのでしょうか?

51件目以降も取得するにはコードのどこを変更したらよいのでしょうか。また、現在のコードの何処が間違っているのでしょうか。

ご指導の程、よろしくお願いします。

追記

教えていただいたコードにて実行した際の画像になります。イメージ説明
イメージ説明

追記02

上手く実行できるものと、エラーが出てしまうものの違いは、何が問題なのでしょうか…
イメージ説明

イメージ説明

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

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

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

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

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

guest

回答2

0

ベストアンサー

修正例2です。

python

1max_request_num = 3 # 最大何ページまで取得するか 2for b in range(max_request_num): 3 response = requests.get(url) 4 json_data = response.json() 5 print("======================================") 6 print("======================================") 7 8 # 取得したデータをあるだけprintする 9 for d in json_data["data"]: 10 print(d) 11 12 info = json_data 13 df2 = pd.json_normalize(info["data"]) 14 print(df2) 15 df2.to_csv(r"sample03.csv", mode="a", encoding="utf-8-sig") 16 17 # データが50件未満の場合、このページでリクエストを打ち切る 18 if len(json_data["data"]) < 50: 19 break 20 21 # forループの1回目だけurlを更新する 22 if b == 0: 23 url = json_data["paging"]["next"] # 2回目以降のurl

投稿2022/10/13 04:59

T_F

総合スコア74

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

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

ttttt08

2022/10/13 06:24

T_F様 迅速かつ丁寧に対応していただきありがとうございました! 無事、エラーなることなく実行することが出来ました。
T_F

2022/10/13 08:23

お役に立てたようで何よりです!
ttttt08

2022/10/13 10:07

追加でご質問なのですが、 様々なハッシュタグ検索を行っていたのですが、教えていただいたコードでうまく実行できるものと以下のようなエラーが出てしまうものがありました。 --------------------------------------------------------------------------- KeyError Traceback (most recent call last) Input In [3], in <cell line: 6>() 10 print("======================================") 12 # 取得したデータをあるだけprintする ---> 13 for d in json_data["data"]: 14 print(d) 16 info = json_data KeyError: 'data' 「KeyError: 'data'」となっていたので、一度「json_data["data"]」で確認すると、同じように下記の様なエラーが出てしまいました。 --------------------------------------------------------------------------- KeyError Traceback (most recent call last) Input In [7], in <cell line: 1>() ----> 1 json_data["data"] KeyError: 'data' 同じコードで、どこではじかれているのか分かりません… 画像も追記で載せていますので見ていただけると幸いです。
T_F

2022/10/13 11:21

最初のpagingのKeyErrorと同様に、json_dataにdataがないようです。 リクエストしてもdataを送ってもらえなくなっているのだと思います。 推測ですが、考えられる理由としては、 ①結果が0件でデータがない ②リクエストを大量に送りすぎて利用制限がかかった あたりかなと思います。 調査方法としては、実際のハッシュタグ検索結果と照らし合わせる、うまくいったハッシュタグがエラーのハッシュタグのリクエストのすぐ後でもうまくいくか確かめる、時間を置いて再度リクエストする、うまくいくハッシュタグとエラーが出るハッシュタグとの違いを考察してみる、などを地道に試してみてください。
ttttt08

2022/10/13 22:05

分かりました! 丁寧にありがとうございました🙇‍♀️
guest

0

KeyError: 'paging'
となっており、2回めのリクエストのレスポンスにはpagingがないようです。
for b in range(2):より前の1回目のリクエストで取得した
url=json_data["paging"]["next"]
のurlをそのまま2回目以降使い続けるということではないかと思います。

また、1回目のリクエストの内容をprintできていないので、forループ内でのみリクエストした方が良いです。

以下、修正例です。

python

1url = "1回目のurl" 2 3# 1回目のリクエストの結果もprintするためにコメントアウト 4# response = requests.get(url) 5# json_data = response.json() 6 7for b in range(3): 8 # url=json_data["paging"]["next"] # 一番下に移動 9 response = requests.get(url) 10 json_data = response.json() 11 print("======================================") 12 print("======================================") 13 14 for i in range(50): 15 print(json_data["data"][i]) 16 # print (json_data["paging"]) # 2回目以降は使えないのでコメントアウト 17 18 info = json_data 19 df2 = pd.json_normalize(info['data']) 20 print(df2) 21 df2.to_csv(r"sample03.csv", mode = 'a',encoding='utf-8-sig') 22 23 # forループの1回目だけurlを更新する 24 if b == 0: 25 url = json_data["paging"]["next"] # 2回目以降のurl

アクセストークンなどが手元にないのでコードを実行できず、推測の回答です。
手打ちのコードなのでバグなどあるかもしれませんが、一旦これで結果を教えてください。

投稿2022/10/12 14:02

T_F

総合スコア74

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

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

ttttt08

2022/10/13 04:10 編集

T_F様 修正ありがとうございます! 実行してみた結果、 print("======================================") print("======================================") は3回出てきており、その下に以下のようなエラーが出ていました。 --------------------------------------------------------------------------- IndexError Traceback (most recent call last) Input In [6], in <cell line: 5>() 10 print("======================================") 12 for i in range(50): ---> 13 print(json_data["data"][i]) 14 # print (json_data["paging"]) # 2回目以降は使えないのでコメントアウト 16 info = json_data IndexError: list index out of range
ttttt08

2022/10/13 01:32

Excelも確認したところ、102行で51件目以降も取得出来ている模様でしたが、101件目以降の数件は出力されていないようでした。 追記で写真を載せますのでご確認お願いいたします。
T_F

2022/10/13 04:58 編集

結果と写真ありがとうございます。確認しました。 3回目まで回っているところを見ると、データの取得自体は無事できるようになったようで良かったです。 エラーの内容は、3回目ではデータが50件未満しかないことが原因だと思われます。 おそらくサイトが3ページ目で終わっているのでしょう。 対策は、データ数が50件であると決め打ちせず、データをある分だけ取り出すようにすることです。 それに応じて、データが50件未満の場合にリクエストを打ち切る処理も必要です。 3回目の途中のエラーを解消することで、3回目の結果もExcelに反映されます。 以下、修正例です。クエリや最大ページ数を変更して10ページほど確かめてみてください。 (再度手打ちのコードなので軽微なバグなどあるかもしれませんがご容赦ください。) max_request_num = 3 # 最大何ページまで取得するか for b in range(max_request_num): response = requests.get(url) json_data = response.json() print("======================================") print("======================================") # 取得したデータをあるだけprintする for d in json_data["data"]: print(d) info = json_data df2 = pd.json_normalize(info["data"]) print(df2) df2.to_csv(r"sample03.csv", mode="a", encoding="utf-8-sig") # データが50件未満の場合、このページでリクエストを打ち切る if len(json_data["data"]) < 50: break # forループの1回目だけurlを更新する if b == 0: url = json_data["paging"]["next"] # 2回目以降のurl 追記:コメント投稿ではインデントがすべてなくなってしまうようです。再度回答で投稿してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問