2016-06-26 15 views
7

Sto provando a grattare latitudine e longitudine dell'utente da Twitter rispetto ai nomi utente. L'elenco dei nomi utente è un file csv con più di 50 nomi in un file di input. Di seguito sono due prove che ho fatto di gran lunga. Nessuno di loro sembra funzionare. Le correzioni in qualsiasi programma o un approccio completamente nuovo sono le benvenute.Raschia la posizione dell'utente da Twitter

Ho una lista di User_names e sto provando a cercare il profilo utente e tirare il geolocation dal profilo o dalla timeline. Non sono riuscito a trovare molti campioni ovunque su Internet.

Sto cercando un approccio migliore per ottenere geolocalizzazioni di utenti da Twitter. Non riuscivo nemmeno a trovare un singolo esempio che mostra la raccolta della posizione dell'utente con riferimento a User_name o user_id. È possibile anche al primo posto?

ingresso: I file di input hanno più di 50k righe

AfsarTamannaah,6.80E+17,12/24/2015,#chennaifloods 
DEEPU_S_GIRI,6.80E+17,12/24/2015,#chennaifloods 
DEEPU_S_GIRI,6.80E+17,12/24/2015,#weneverletyoudownstr 
ndtv,6.80E+17,12/24/2015,#chennaifloods 
1andonlyharsha,6.79E+17,12/21/2015,#chennaifloods 
Shashkya,6.79E+17,12/21/2015,#moneyonmobile 
Shashkya,6.79E+17,12/21/2015,#chennaifloods 
timesofindia,6.79E+17,12/20/2015,#chennaifloods 
ANI_news,6.78E+17,12/20/2015,#chennaifloods 
DrAnbumaniPMK,6.78E+17,12/19/2015,#chennaifloods 
timesofindia,6.78E+17,12/18/2015,#chennaifloods 
SRKCHENNAIFC,6.78E+17,12/18/2015,#dilwalefdfs 
SRKCHENNAIFC,6.78E+17,12/18/2015,#chennaifloods 
AmeriCares,6.77E+17,12/16/2015,#india 
AmeriCares,6.77E+17,12/16/2015,#chennaifloods 
ChennaiRainsH,6.77E+17,12/15/2015,#chennairainshelp 
ChennaiRainsH,6.77E+17,12/15/2015,#chennaifloods 
AkkiPritam,6.77E+17,12/15/2015,#chennaifloods 

Codice:

import tweepy 
from tweepy import Stream 
from tweepy.streaming import StreamListener 
from tweepy import OAuthHandler 
import pandas as pd 
import json 
import csv 
import sys 
import time 

CONSUMER_KEY = 'XYZ' 
CONSUMER_SECRET = 'XYZ' 
ACCESS_KEY = 'XYZ' 
ACCESS_SECRET = 'XYZ' 

auth = OAuthHandler(CONSUMER_KEY,CONSUMER_SECRET) 
api = tweepy.API(auth) 
auth.set_access_token(ACCESS_KEY, ACCESS_SECRET) 

data = pd.read_csv('user_keyword.csv') 

df = ['user_name', 'user_id', 'date', 'keyword'] 

test = api.lookup_users(user_ids=['user_name']) 

for user in test: 
    print user.user_name 
    print user.user_id 
    print user.date 
    print user.keyword 
    print user.geolocation 

Errore:

Traceback (most recent call last): 
    File "user_profile_location.py", line 24, in <module> 
    test = api.lookup_users(user_ids=['user_name']) 
    File "/usr/lib/python2.7/dist-packages/tweepy/api.py", line 150, in lookup_users 
    return self._lookup_users(list_to_csv(user_ids), list_to_csv(screen_names)) 
    File "/usr/lib/python2.7/dist-packages/tweepy/binder.py", line 197, in _call 
    return method.execute() 
    File "/usr/lib/python2.7/dist-packages/tweepy/binder.py", line 173, in execute 
    raise TweepError(error_msg, resp) 
tweepy.error.TweepError: [{'message': 'No user matches for specified terms.', 'code': 17}] 

Capisco che ogni utente non condivide la geolocalizzazione, ma quelli che mantengono il profilo pubblicamente aperto dal se posso ottenere la geolocalizzazione devono essere grandi.

Le posizioni degli utenti come nome e/o lat lon sono ciò che sto cercando.

Se questo approccio non è corretto, sono aperto anche a alternative.

Aggiornamento One: Dopo un po 'profonda ricerca ho trovato questo website che fornisce una soluzione molto vicino, ma io sono sempre errore durante il tentativo di leggere il userName dal file di input.

Questo dice che solo 100 informazioni dell'utente possono essere afferrate qual è il modo migliore per sollevare tale limite?

Codice:

import sys 
import string 
import simplejson 
from twython import Twython 
import csv 
import pandas as pd 

#WE WILL USE THE VARIABLES DAY, MONTH, AND YEAR FOR OUR OUTPUT FILE NAME 
import datetime 
now = datetime.datetime.now() 
day=int(now.day) 
month=int(now.month) 
year=int(now.year) 


#FOR OAUTH AUTHENTICATION -- NEEDED TO ACCESS THE TWITTER API 
t = Twython(app_key='ABC', 
    app_secret='ABC', 
    oauth_token='ABC', 
    oauth_token_secret='ABC') 

#INPUT HAS NO HEADER NO INDEX 
ids = pd.read_csv('user_keyword.csv', header=['userName', 'userID', 'Date', 'Keyword'], usecols=['userName']) 

#ACCESS THE LOOKUP_USER METHOD OF THE TWITTER API -- GRAB INFO ON UP TO 100 IDS WITH EACH API CALL 

users = t.lookup_user(user_id = ids) 

#NAME OUR OUTPUT FILE - %i WILL BE REPLACED BY CURRENT MONTH, DAY, AND YEAR 
outfn = "twitter_user_data_%i.%i.%i.csv" % (now.month, now.day, now.year) 

#NAMES FOR HEADER ROW IN OUTPUT FILE 
fields = "id, screen_name, name, created_at, url, followers_count, friends_count, statuses_count, \ 
    favourites_count, listed_count, \ 
    contributors_enabled, description, protected, location, lang, expanded_url".split() 

#INITIALIZE OUTPUT FILE AND WRITE HEADER ROW 
outfp = open(outfn, "w") 
outfp.write(string.join(fields, "\t") + "\n") # header 

#THE VARIABLE 'USERS' CONTAINS INFORMATION OF THE 32 TWITTER USER IDS LISTED ABOVE 
#THIS BLOCK WILL LOOP OVER EACH OF THESE IDS, CREATE VARIABLES, AND OUTPUT TO FILE 
for entry in users: 
    #CREATE EMPTY DICTIONARY 
    r = {} 
    for f in fields: 
     r[f] = "" 
    #ASSIGN VALUE OF 'ID' FIELD IN JSON TO 'ID' FIELD IN OUR DICTIONARY 
    r['id'] = entry['id'] 
    #SAME WITH 'SCREEN_NAME' HERE, AND FOR REST OF THE VARIABLES 
    r['screen_name'] = entry['screen_name'] 
    r['name'] = entry['name'] 
    r['created_at'] = entry['created_at'] 
    r['url'] = entry['url'] 
    r['followers_count'] = entry['followers_count'] 
    r['friends_count'] = entry['friends_count'] 
    r['statuses_count'] = entry['statuses_count'] 
    r['favourites_count'] = entry['favourites_count'] 
    r['listed_count'] = entry['listed_count'] 
    r['contributors_enabled'] = entry['contributors_enabled'] 
    r['description'] = entry['description'] 
    r['protected'] = entry['protected'] 
    r['location'] = entry['location'] 
    r['lang'] = entry['lang'] 
    #NOT EVERY ID WILL HAVE A 'URL' KEY, SO CHECK FOR ITS EXISTENCE WITH IF CLAUSE 
    if 'url' in entry['entities']: 
     r['expanded_url'] = entry['entities']['url']['urls'][0]['expanded_url'] 
    else: 
     r['expanded_url'] = '' 
    print r 
    #CREATE EMPTY LIST 
    lst = [] 
    #ADD DATA FOR EACH VARIABLE 
    for f in fields: 
     lst.append(unicode(r[f]).replace("\/", "/")) 
    #WRITE ROW WITH DATA IN LIST 
    outfp.write(string.join(lst, "\t").encode("utf-8") + "\n") 

outfp.close()  

Errore:

File "user_profile_location.py", line 35, in <module> 
    ids = pd.read_csv('user_keyword.csv', header=['userName', 'userID', 'Date', 'Keyword'], usecols=['userName']) 
    File "/usr/local/lib/python2.7/dist-packages/pandas/io/parsers.py", line 562, in parser_f 
    return _read(filepath_or_buffer, kwds) 
    File "/usr/local/lib/python2.7/dist-packages/pandas/io/parsers.py", line 315, in _read 
    parser = TextFileReader(filepath_or_buffer, **kwds) 
    File "/usr/local/lib/python2.7/dist-packages/pandas/io/parsers.py", line 645, in __init__ 
    self._make_engine(self.engine) 
    File "/usr/local/lib/python2.7/dist-packages/pandas/io/parsers.py", line 799, in _make_engine 
    self._engine = CParserWrapper(self.f, **self.options) 
    File "/usr/local/lib/python2.7/dist-packages/pandas/io/parsers.py", line 1202, in __init__ 
    ParserBase.__init__(self, kwds) 
    File "/usr/local/lib/python2.7/dist-packages/pandas/io/parsers.py", line 918, in __init__ 
    raise ValueError("cannot specify usecols when " 
ValueError: cannot specify usecols when specifying a multi-index header 
+1

Cosa stai chiedendo? Non capisci l'errore che stai ricevendo da 'Tweepy'? Non sai come [gestire gli errori] (https://docs.python.org/2/tutorial/errors.html#handling-exceptions)? – jonrsharpe

+1

Leggete il vostro codice, state chiedendo 'user_ids = ['user_name']', che molto probabilmente fallisce dato che non esiste un utente twitter chiamato 'user_name'. – oystein

+0

@oystein apprezzerebbe seriamente qualche aiuto con il codice per ottenere le posizioni con nome utente. –

risposta

5

Supponendo che si desidera ottenere la posizione dell'utente che è messo nella sua sua pagina/profilo, si può semplicemente utilizzare il API.get_user di Tweepy. Di seguito è riportato il codice di lavoro.

#!/usr/bin/env python 
from __future__ import print_function 

#Import the necessary methods from tweepy library 
import tweepy 
from tweepy import OAuthHandler 


#user credentials to access Twitter API 
access_token = "your access token here" 
access_token_secret = "your access token secret key here" 
consumer_key = "your consumer key here" 
consumer_secret = "your consumer secret key here" 


def get_user_details(username): 
     userobj = api.get_user(username) 
     return userobj 


if __name__ == '__main__': 
    #authenticating the app (https://apps.twitter.com/) 
    auth = tweepy.auth.OAuthHandler(consumer_key, consumer_secret) 
    auth.set_access_token(access_token, access_token_secret) 
    api = tweepy.API(auth) 

    #for list of usernames, put them in iterable and call the function 
    username = 'thinkgeek' 
    userOBJ = get_user_details(username) 
    print(userOBJ.location) 

Nota: Questa è un'implementazione greggio. Scrivi una funzione sleeper corretta per obbedire ai limiti di accesso alle API di Twitter.

+0

Esattamente lo stesso output insieme a tutte le colonne di input. Permettetemi di controllare con i dati completi. L'elenco dei nomi utente è più di 50k in un input. Spero che funzioni per quello. Risponderò non appena avrò controllato .. –

+0

Il problema con i due programmi sopra riportati che ho scritto riguarda la lettura degli utenti dal file che ha circa 50K nomi utente. Posso per favore chiedervi di aiutarmi con quella parte. –

Problemi correlati