2014-12-06 2 views
-1

Я использую Public API, в котором перечислены все проклятия из coursera. Json составляет около 8 МБ. Теперь, мой вопрос заключается в том, как эффективно анализировать json и сохранять содержимое внутри моей БД.Разбор большого JSON - Python

Вот мой код: -

import requests 
r = requests.get('https://www.coursera.org/maestro/api/topic/list2') # Is getting all the information at once, the standard way of doing it or should I get in chunks? 
print r.json() 

# Now to save the details, should I use a NoSQL DB. 
# I've little experience of using a NoSQL DB, hence for building an app that list all coursera courses, 
# saving data inside a Mongo will be a good choice or not. 

Благодаря

+0

Слишком широкий вопрос. Вы уже разобрали его, и есть тысячи способов его сохранить. – tdelaney

+0

Проведите некоторое исследование: узнайте о различных типах баз данных NoSQL, сравните их возможности с тем, что нужно вашему приложению, выберите его и узнайте, как его использовать с Python. – Jesper

ответ

2

Я не хочу, чтобы попасть в дискуссии SQL против NoSQL. Кроме того, я не чувствую себя достаточно информированным о вашем проекте, чтобы дать вам совет. Но, похоже, что у вас есть некоторый опыт работы с SQL, и что вы хотите:

  • исследовать JSON, чтобы увидеть, что вы можете использовать в вашем приложении
  • Выяснить соответствующую схему базы данных
  • синтаксического анализа json и вставить их в базу данных, которую вы только что создали.

Я не искал, но, возможно, есть документация coursera по информации, предоставленной этим HTTP-запросом. Вы можете использовать это, чтобы вести разработку вашей модели.

Если нет, или если вы склонны вскакивать в данные и находить модель эмпирически, то хорошей новостью является то, что request.json() автоматически расшифровывает содержимое json в словаре.

Для изучения этого Dict, вы можете использовать dict.keys() метод

>>> r.json().keys() # returns the following line: 
dict_keys(['unis', 'insts', 'cats', 'topics', 'courses']) 

ли рекурсивно, чтобы получить ощущение, что под каждым узлом. Если вы нажмете списки, просмотрите несколько этих списков. Списки, вероятно, перейдут в строки в мире sql. Если списки содержат dicts, то это даст вам представление о том, какие имена полей будут. Если дальше, то dicts внутри этого списка вложенных dicts, что может указывать на отношения

Например,

>>> r.json()['unis'].keys() # gives me the following error 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: 'list' object has no attribute 'keys' 

Итак, я попробовал,

>>> pp.pprint(r.json()['unis'][0]) # which gave me the first record 
{'abbr_name': 'Stanford', 
'banner': 'https://coursera-university-assets.s3.amazonaws.com/73/a47990ea7c11e3b00589d092602f0d/Stanford-University-Banner-LRG.jpg', 
'class_logo': 'https://coursera-university-assets.s3.amazonaws.com/21/9a0294e2bf773901afbfcb5ef47d97/Stanford_Coursera-200x48_RedText_BG.png', 
'description': 'The Leland Stanford Junior University, commonly referred to ' 
       'as Stanford University or Stanford, is an American private ' 
       'research university located in Stanford, California on an ' 
       '8,180-acre (3,310 ha) campus near Palo Alto, California, ' 
       'United States.', 
'display': True, 
'favicon': 'https://coursera-university-assets.s3.amazonaws.com/dc/581cda352d067023dcdcc0d9efd36e/favicon-stanford.ico', 
'home_link': 'http://online.stanford.edu/', 
'id': 1, 
'landing_page_banner': 'https://coursera-university-assets.s3.amazonaws.com/6f/75dd30dd5911e38988193a0e8ad8fe/Stanford_Coursera-200x48_RedText_BG.jpg', 
'location': 'Palo Alto, CA, United States', 
'location_city': 'Palo Alto', 
'location_country': 'US', 
'location_lat': 37.4418834, 
'location_lng': -122.14301949999998, 
'location_state': 'CA', 
'logo': 'https://coursera-university-assets.s3.amazonaws.com/d8/4c69670e0826e42c6cd80b4a02b9a2/stanford.png', 
'name': 'Stanford University', 
'partner_type': 1, 
'primary_color': '#8C1515', 
'rectangular_logo_svg': 'https://coursera-university-assets.s3.amazonaws.com/d6/cb68d0d09b11e3a575e17d6a22968b/SUSig_StnfrdOnly.svg', 
'short_name': 'stanford', 
'square_logo': 'https://coursera-university-assets.s3.amazonaws.com/e3/cebbb0d0a311e39b31794df7e5d956/Coursera-SUSig_StnfrdUStack_SQ.png', 
'square_logo_source': 'https://coursera-university-assets.s3.amazonaws.com/e2/c49eb0d0a311e3ad37254033038522/Coursera-SUSig_StnfrdUStack_SQ.png', 
'square_logo_svg': 'https://coursera-university-assets.s3.amazonaws.com/e0/0dbc10d0a311e3ad37254033038522/Coursera-SUSig_StnfrdUStack_SQ.svg', 
'website': '', 
'website_facebook': '', 
'website_twitter': '', 
'website_youtube': ''} 

С этого момента, по наивности, я бы создайте таблицу coursera_unis со следующими полями, возвращаемыми этой строкой кода:

>>> r.json()['unis'][0].keys() 
dict_keys(['website_facebook', 'location', 'website_twitter', 'square_logo', 'favicon', 'id', 'website', 'location_lng', 'logo', 'location_lat', 'partner_type', 'short_name', 'website_youtube', 'square_logo_svg', 'banner', 'primary_color', 'location_country', 'rectangular_logo_svg', 'square_logo_source', 'name', 'landing_page_banner', 'display', 'home_link', 'description', 'abbr_name', 'location_city', 'location_state', 'class_logo']) 

Затем следующим шагом будет вставка данных. It's already answered in this SO thread for MySQL. Подобные варианты существуют и для других db-бэкендов, поэтому не должно быть слишком сложно.

+0

Спасибо, Haleemur за подробный отклик. Я думал об использовании базы данных NoSQL по двум причинам. 1) В одном объекте слишком много информации, которая может быть или не быть полезной, поэтому я думал об использовании базы данных NoSQL, поскольку она может хранить информацию с созданием строки и столбца. 2) У меня мало опыта работы в NoSQL, и я пойму то же самое. – PythonEnthusiast

+0

Хотелось бы услышать ваши взгляды на это. Мой endgoal должен сделать веб-приложение со списком и подробным представлением, используя общедоступный API coursera. Ссылка URL: - https: //www.coursera.org/courses – PythonEnthusiast

+0

Похоже на достаточно простое приложение, которое не потребует многого от его уровня сохранения. Это будет хорошо работать, если вы выберете подходящий магазин NoSQL или хранилище RDBMS. Возможно, будет немного больше работы по настройке вашей РСУБД, но вы все равно будете работать днем. Если вы хотите использовать это, чтобы узнать что-то, с чем вы менее знакомы, тогда идите! –

Смежные вопросы