Python - 从 json 中提取数据时出现问题

Python - Problem with extract data from json

要提取 Instagram 条目的数据,我需要下载媒体列表,然后为每个条目单独下载数据。 我只是做错了什么,因为它只为我获取 1 个条目的数据,而不是为我必须更改才能正确获取它的每个人获取数据。

这是目前的代码:

import urllib.request as o
import json
import csv
from pandas.io.json import json_normalize
import pandas as pd

url = 'https://graph.facebook.com/v3.2/1234567891011/media?fields=media_type,like_count,comments_count,timestamp&limit=500&access_token=xxx'
link1 = 'https://graph.facebook.com/v3.2/'
link2 = '/insights?metric=engagement%2Cimpressions%2Creach%2Csaved&access_token=xxx'
with o.urlopen(url) as jfile :
    data1 = json.load(jfile)
    df = json_normalize(data1["data"])
    linki = []
    for dane3 in df:
        linki = link1 + df['id'] + link2
        dx = []
        with o.urlopen(linki[0]) as file2 :
            data2 = json.load(file2)
            dx = json_normalize(data2["data"],
                              record_path ='values',
                              meta =['id', 'name', 'title'])
            dx['ident'] =dx['id'][0].split("/")[0]
dn7 = dx.pivot(index='ident', columns='name', values='value')
dn7

我要提取的数据是:

ident|engagement|impressions|reach|saved
987654321|65|2142|1943|2

我使用的代码需要改进什么 Python 3?

for dane3 in df 的每次迭代中,您将根据当前 json 响应 DataFrame 重新分配 dx。这意味着您只保留与最后处理的 post 相关的信息。

相反,您可以保留规范化 JSON DataFrame 的列表,并在处理完所有 post 后 concatenate 它们。

您还在 for 循环的每次迭代中使用相同的 post ID,通过 df['id']linki[0],这意味着您只会获得第一个 post 的数据。相反,您的循环应该遍历 DataFrame'id' 列的值,即 for post_id in df['id'].

post_data = []
with o.urlopen(url) as jfile:
    data1 = json.load(jfile)
    df = json_normalize(data1["data"])
    for post_id in df['id']:
        linki = link1 + post_id + link2
        with o.urlopen(linki) as file2:
            data2 = json.load(file2)
            dx = json_normalize(data2["data"],
                                record_path ='values',
                                meta =['id', 'name', 'title'])
            dx['ident'] = dx['id'][0].split("/")[0]
            post_data.append(dx)
dn7 = pd.concat(post_data).pivot(index='ident', columns='name', values='value')