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.