2017-01-21 4 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) 

Das Python-Programm anhängen versuchen, Kontoinformationen erhalten, wollen facebook kann, wie meine Freunde, mag, Futtermittel ... aber läuft wirft er einen Fehler:Memory wenn

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 

Er verweist auf :

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

als die Aussage des MemoryError verursacht. Bitte sagen Sie mir, warum und wie Sie es korrigieren können.

+1

Klingt, dass das Skript nicht mehr genügend Arbeitsspeicher hat. Es gibt jedoch nicht genug Informationen in Ihrer Frage, um zu sagen, warum. [_Wie kleine Programme debuggen_] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/) könnte Ihnen helfen, den Grund herauszufinden. – martineau

+0

Verwenden Sie eine 32-Bit-Python-Installation? Oder mit einem 32-Bit-Computer? Dieser Fehler bedeutet, dass Sie nicht genügend Speicher haben. –

Antwort

1

Sieht aus wie eine Endlosschleife haben:

while(user_info["data"]): 

Da neue Zuordnungen zu user_info:

user_info = requests.get(... 

sind alle in if Aussagen, die wahr müssen nicht unbedingt sein.

Zugleich halten Sie in dieser Schleife auf eine Liste anhängen:

user_info_data.append(user_info_item) 

Vergewissern Sie sich, dass user_info["data"] wirklich zu einem bestimmten Zeitpunkt falsch wird.

Das ist das Problem Code:

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() 

Sie zu user_info_data anhängen. Aber wenn if "https://graph.facebook.com" in user_info["paging"]["cursors"]["after"] wenn falsch, werden Sie ohne Aktualisierung user_info Schleife. Die nächste Schleife wird genau gleich sein. So bleiben Sie in der Schleife und fügen das gleiche zu user_info_data hinzu, bis Sie den gesamten verfügbaren Speicher verbrauchen.

+0

Hilft diese Antwort? –

0

Diese elif-Anweisung

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

wie viele Artikel regelt auf die säumige Liste angehängt werden. Die Elif-Bedingung wird jedoch IMMER als wahrer Wert ausgewertet und dazu führen, dass unerwünschte Daten an die Liste angehängt werden.

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

Hinweis: dieses Problem, dass in der Antwort @ Mike beschriebenen zusätzlichen ist ... müssen beide Probleme behoben werden.