python-2.7 pandas geolocation tweepy twython

python 2.7 - Raspe la ubicación del usuario de Twitter



python-2.7 pandas (1)

Estoy tratando de raspar la latitud y la longitud del usuario de Twitter con respecto a los nombres de usuario. La lista de nombres de usuario es un archivo csv con más de 50 nombres en un archivo de entrada. Los siguientes son dos ensayos que he hecho con diferencia. Ninguno de ellos parece estar funcionando. Se aceptan correcciones en cualquiera de los programas o en un enfoque completamente nuevo.

Tengo una lista de User_names y estoy tratando de buscar el perfil del usuario y sacar la geolocation del perfil o línea de tiempo. No pude encontrar muchas muestras en ningún lugar a través de Internet.

Estoy buscando un mejor enfoque para obtener geolocalizaciones de usuarios de Twitter. Ni siquiera pude encontrar un solo ejemplo que muestre la recolección de la ubicación del usuario con referencia a User_name o user_id. ¿Es posible en primer lugar?

Entrada: los archivos de entrada tienen más de 50k filas

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

Código:

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

Error:

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}]

Entiendo que cada usuario no comparte la geolocalización, pero aquellos que mantengan el perfil abierto públicamente desde la geolocalización si pueden obtenerlo serán geniales.

Ubicaciones de usuario como nombre y / o latón es lo que estoy buscando.

Si este enfoque no es correcto, también estoy abierto a alternativas.

Actualización uno: después de una búsqueda profunda encontré este sitio web que proporciona una solución muy cercana, pero recibo un error al intentar leer el nombre de userName del archivo de entrada.

Esto dice que solo se puede capturar la información de 100 usuarios. ¿Cuál es la mejor manera de eliminar esa limitación?

Código:

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

Error:

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


Suponiendo que solo desea obtener la ubicación del usuario que se coloca en su página de perfil, puede simplemente usar el API.get_user de Tweepy. A continuación está el código de trabajo.

#!/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: Esta es una implementación cruda. Escriba una función de durmiente adecuada para obedecer los límites de acceso a la API de Twitter.