Python - проблема с извлечением данных из json - PullRequest
1 голос
/ 16 марта 2020

Чтобы извлечь данные из записей 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?

1 Ответ

0 голосов
/ 16 марта 2020

На каждой итерации for dane3 in df вы переопределяете dx в соответствии с текущим json ответом DataFrame. Это означает, что вы сохраняете только информацию, относящуюся к последнему обработанному сообщению.

Вместо этого вы можете хранить список нормализованных JSON DataFrame s и concat enate. после обработки всех сообщений.

Вы также используете один и тот же идентификатор сообщения на каждой итерации for l oop, через df['id'] и linki[0], что означает, что вы получит только данные для первого поста. Вместо этого ваш l oop должен перебирать значения столбца 'id' вашего DataFrame, то есть 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')
...