82430


**やりたいこと**  
下記のサイトのランキングをスクレイピングするために,  
通信状況を調べjsonファイルからデータを取得しようと考えています。

<https://www.spooncast.net/jp/ranking/topfan?date_type=daily>

**実際のコード**  
下記のコードを実行しましたがエラーになりました。

[code]

    import pandas as pd
    import requests
    
    url_rank = ('https://jp-api.spooncast.net/ranks/fan/?date_type=daily')
    
    headers = {'Content-Type': 'application/json'}
    r = requests.get(url_rank, headers=headers)
    users = pd.DataFrame.from_dict(r.json()['results']['author'])
    users = users[['nickname', 'profile_url']]
            
    
[/code]

**エラー内容**

[code]

    ---------------------------------------------------------------------------
    TypeError                                 Traceback (most recent call last)
    <ipython-input-17-0958c513ae04> in <module>
          4 headers = {'Content-Type': 'application/json'}
          5 r = requests.get(url_rank, headers=headers)
    ----> 6 users = pd.DataFrame.from_dict(r.json()['results']['author'])
          7 users = users[['nickname', 'profile_url']]
          8 
    
    TypeError: list indices must be integers or slices, not str
    
[/code]

strではなく整数かスライスでなければならないと書かれていますが、よくわかりません。  
原因と解決策を教えていただけると嬉しいです。

また、このサイトはランキングが一つのリンクにまとまっておらず、4つに分かれています。  
<https://jp-api.spooncast.net/ranks/fan/?date_type=daily>  
[https://jp-
api.spooncast.net/ranks/fan/?cursor=cD0zMA%3D%3D&date_type=daily](https://jp-
api.spooncast.net/ranks/fan/?cursor=cD0zMA%3D%3D&date_type=daily)  
[https://jp-
api.spooncast.net/ranks/fan/?cursor=cD02MA%3D%3D&date_type=daily](https://jp-
api.spooncast.net/ranks/fan/?cursor=cD02MA%3D%3D&date_type=daily)  
[https://jp-
api.spooncast.net/ranks/fan/?cursor=cD05MA%3D%3D&date_type=daily](https://jp-
api.spooncast.net/ranks/fan/?cursor=cD05MA%3D%3D&date_type=daily)

開発者ツールについて使い慣れていないからかもしれませんが、これらの情報を一つに取得する方法はないのでしょうか？  
それとも取得したデータを結合するとかしないとだめでしょうか？

宜しくお願いします。


CC BY-SA 4.0
2021-09-11T15:02:49.047
82429
2021-09-14T00:31:43.147
2021-09-14T00:31:43.147
3060
47546
question
python json web-scraping
とあるサイトの通信状況を調べて、JSONファイルの中身をPythonで取得しようとしたがうまくいかない


> strではなく整数かスライスでなければならないと書かれていますが、よくわかりません。原因と解決策を教えていただけると嬉しいです。

エラーメッセージ `list indices must be ...` にある通り、`r.json()['results']`
は辞書(dict)のリストになっています。なので、list comprehension か map で中身の dict
を取り出す必要があります。具体的には以下の様にします。

[code]

      users = pd.DataFrame.from_records(i['author'] for i in r.json()['results'])
    
[/code]

> また、このサイトはランキングが一つのリンクにまとまっておらず、4つに分かれています。
>
> 開発者ツールについて使い慣れていないからかもしれませんが、これらの情報を一つに取得する方法はないのでしょうか？  
>  それとも取得したデータを結合するとかしないとだめでしょうか？

JSON データに `next` というタグが存在します。ここに次のランキングデータへの URL が格納されています。なので、この URL
を辿って行きます。最後の JSON データの `next`
タグには空文字列(`""`)が入っているので、これを繰り返し処理の終了条件とします(単方向のリンクリストを辿る処理と同じです)。

[code]

    import pandas as pd
    import requests
    
    url_rank = 'https://jp-api.spooncast.net/ranks/fan/?date_type=daily'
    headers = {'Content-Type': 'application/json'}
    
    users = []
    while url_rank:
      json_data = requests.get(url_rank, headers=headers).json()
      data = pd.DataFrame.from_records(i['author'] for i in json_data['results'])
      users.append(data[['nickname', 'profile_url']])
      url_rank = json_data['next']
    
    users = pd.concat(users).reset_index(drop=True)
    
[/code]

**実行結果**

`print(users.to_markdown(index=False))`

nickname | profile_url  
---|---  
lin3529 |
<https://lh3.googleusercontent.com/a/AATXAJx6o-PjTqmgXSo6Mo8btONK14fbJLuXP_Jyjbjw=s96-c>  
朧狼/☙♅❧廻煉豹月 | <http://jp-
cdn.spooncast.net/profiles/Q/qzoDbQwizpoPv0/8d4299f8-a4bb-4d5d-b094-42388a7699fc.jpg>  
ྖᴷ❥⃝果奈 | <http://jp-
cdn.spooncast.net/profiles/5/lN8oW5VsDZbrl0/eca7cf6a-f98c-4ecb-a464-b4d1bd3a613b.jpg>  
✼̥.*ᶜここ | <http://jp-
cdn.spooncast.net/profiles/O/GQXJOObin2dV0l/d825680d-4c2a-4faa-b1e5-69a9a4903158.jpg>  
華-ｼﾛ- | <http://jp-
cdn.spooncast.net/profiles/E/EM8mpE0tnv9vmN/556d4da5-c43c-443b-a7e5-3f74ed9b2bb1.jpg>  
... | ...  
⚛︎*.⋆なる・J | <http://jp-
cdn.spooncast.net/profiles/X/No94RXbfORa3O0/974a2d90-7380-458e-bebf-d65310d9da0c.jpg>  
しゅん | <http://jp-
cdn.spooncast.net/profiles/0/EM8Nx0lFnEpjjj/e25449d8-0672-4163-bf19-a535e2dc0f4c.jpg>  
ちょんまる.㌨ | <http://jp-
cdn.spooncast.net/profiles/j/XL5BpjGFdkBbRK/aed5d327-5c69-4195-9082-fe960b105b43.jpg>  
⁷⁴なじ | <http://jp-
cdn.spooncast.net/profiles/L/JaoG6LDue3ML6O/c021388f-4860-4f4c-aaca-73b7ba1d86e6.jpg>  
黎斗 | <http://jp-
cdn.spooncast.net/profiles/G/PMAGnGjub5bKjE/afd151dc-15d3-443a-ba6d-a385125d8edc.jpg>


CC BY-SA 4.0
2021-09-11T16:47:40.877
82430
2021-09-11T18:29:30.887
2021-09-11T18:29:30.887
47127
47127
82429
answer