2017-01-21 5 views
1
def get_user_info(user_id,info_type,u_access_token = None): 

    if info_type == "user_friends": 
     params = r"friends" 
    elif info_type == "user_likes": 
     params = r"likes" 
    elif info_type == "user_feed": 
     params = r"feed? 
    fields=permalink_url,from,story,type,message,link,created_time,updated_time,likes.limit(0).summary(total_count),comments.limit(0).summary(total_count)" 

    # To get the access token 
    if u_access_token: 
     FB_access_token = u_access_token 
    else: 
     FB_access_token = get_access_token.get_fb_token(glovar.APP_ID, glovar.APP_SECRET) 

    graph = facebook.GraphAPI(FB_access_token) 

    user_info = graph.get_connections(user_id, params) 

    if "Error" in user_info: 
     print("Error", user_info["Error"]["message"]) 
     return [] 

    user_info_data = [] 
    while(user_info["data"]): 
     if "Error" in user_info: 
      print("Error", user_info["Error"]["message"]) 
      return [] 
     if "data" in user_info: 
      try: 
       for user_info_item in user_info["data"]: 
        if info_type == "user_feed": 
         # Convenience:Add empty field for message/link if not existent 
         user_info_item["message"] = user_info_item["message"] if "message" in user_info_item else "" 
         user_info_item["link"] = user_info_item["link"] if "link" in user_info_item else "" 
         user_info_data.append(user_info_item) 
         user_info = requests.get(user_info["paging"]["next"]).json() 
        elif info_type == "user_friends" or "user_likes": 
         user_info_data.append(user_info_item) 
         #if only one page or in the last page, ["paging"]["cursors"]["after"] is unrecognized code 
         if "https://graph.facebook.com" in user_info["paging"]["cursors"]["after"]: 
          user_info = requests.get(user_info["paging"]["cursors"]["after"]).json() 

      except KeyError: 
       break 

    print(user_info_data) 

Питон программа хочет получить информацию могут facebook счета, например, моих друзей, любит, кормить ... но работает он выдает ошибку:MemoryError при попытке добавить

Traceback (most recent call last): 
File "C:/Python/PyCharmProject/FaceBookCrawl/FBCrawl.py", line 254, in <module> 
user_info_download.get_user_info(user_id,user_info_type,u_access_token) 
File "C:\Python\PyCharmProject\FaceBookCrawl\user_info_download.py", line 51, in get_user_info 
user_info_data.append(user_info_item) 
MemoryError 

Process finished with exit code 1 

Это указывает на :

elif info_type == "user_friends" or "user_likes": 
    user_info_data.append(user_info_item) 

как утверждение вызывает MemoryError. Пожалуйста, скажите мне, почему и как его исправить.

+1

Похоже, что у скрипта заканчивается память. Однако в вашем вопросе недостаточно информации, чтобы сказать, почему. [_Как отлаживать небольшие программы_] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/) может помочь вам разобраться в причине. – martineau

+0

Вы используете 32-битную установку python? Или с помощью 32-битного компьютера? Эта ошибка означает, что вы потеряли память. –

ответ

1

Похоже, у вас есть бесконечный цикл:

while(user_info["data"]): 

С новыми назначениями в user_info:

user_info = requests.get(... 

являются все внутри if заявления, которые не обязательно должны быть правдой.

В то же время, вы держите добавить в список в этом цикле:

user_info_data.append(user_info_item) 

Убедитесь, что user_info["data"] действительно становится ложным в какой-то момент времени.

Это код проблема:

elif info_type == "user_friends" or "user_likes": 
    user_info_data.append(user_info_item) 
    if "https://graph.facebook.com" in user_info["paging"]["cursors"]["after"]: 
     user_info = requests.get(user_info["paging"]["cursors"]["after"]).json() 

Вы добавить к user_info_data. Но если if "https://graph.facebook.com" in user_info["paging"]["cursors"]["after"], если false, вы будете петлять без обновления user_info. Следующий цикл будет точно таким же. Таким образом, вы продолжаете цикл и добавляете то же самое к user_info_data, пока не будете использовать всю доступную память.

+0

Помогает ли этот ответ? –

0

Это Элиф заявление

elif info_type == "user_friends" or "user_likes":

определяет, сколько элементов добавляются к списку обижая. Однако условие elif ВСЕГДА оценивает как истинное значение и приводит к добавлению нежелательных данных в список.

Правильный код: elif info_type == "user_friends" or info_type == "user_likes":

Примечание: эта проблема является дополнительным к тому, что описано в ответе по ... @ Mike обе проблемы должны быть исправлены.

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