Tweepy - Generar gráficos de relaciones de Twitter

Iniciado por remiotore, Noviembre 14, 2017, 03:31:32 PM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Noviembre 14, 2017, 03:31:32 PM Ultima modificación: Noviembre 14, 2017, 06:51:51 PM por remiotore
¡Buenas! Estoy creando un script en Python que genera un gráfico con el módulo NetworkX para ver cómo se relaciona un usuario con la gente que sigue y a su vez, cómo se relacionan esos mismos.
A mitad de este pequeño proyecto me encontré con el problema de que las peticiones que se realizan a Twitter están limitadas y se debe esperar 15 minutos para continuar trabajando. Este problema es el principal ya que retrasa incluso horas los resultados finales. Me gustaría saber si hay alguna forma de evitar esto.

Dejo el script por si alguien más desea utilizarlo o continuar/colaborar con su desarrollo.
Lamento que haya algo de desorden  :-[
Espero que los comentarios adjuntos sean de utilidad por si alguien tiene dudas sobre su funcionamiento :)

Para iniciarlo, debéis introducir el nombre de un usuario con perfil público para comenzar el escaneo.

El resultado es una imagen como la siguiente:


Código: python

# -*- coding: utf-8 -*-
import tweepy
import matplotlib.pyplot as plt
import networkx as nx
from termcolor import colored

print' ######                                           '
print' #     # #   # ######  ####  #    #   ##    ####  '
print' #     #  # #      #  #    # ##  ##  #  #  #      '
print' ######    #      #   #    # # ## # #    #  ####  '
print' #   #     #     #    #    # #    # ######      # '
print' #    #    #    #     #    # #    # #    # #    # '
print' #     #   #   ######  ####  #    # #    #  ####  '
print'                                                  '



print 'Automated tool to generate a TWITTER User\'s Relational Network Graph!'
print colored('*User must have public profile.','yellow')

# Twitter variables
CK = '' # Client Key
CS = '' # Client Secret
AT = '' # Access Token
AS = '' # Access Token Secret
auth = tweepy.OAuthHandler(CK,CS) # Getting Access
auth.set_access_token(AT,AS) # with Tokens
api = tweepy.API(auth, wait_on_rate_limit=True) # Main variable 'api'. Wait on rate limit = True is for the request number's limitation by twitter
alpha = raw_input("Insert an username: ") # Alpha, the first user from where we are looking for
ids = api.friends_ids(alpha) # IDentification number of the whole friends of the user

print "The user has " + str(len(ids)) + " ids located."

# NetworkX & Pyplot variables
g = nx.Graph() # Create the graph
color_map = [] # Void array of colors
g.add_node(alpha) # We add the first node by tagname

# We create the rest of nodes and join them with the first node by edges
for i in range(0 , len(ids), 1):
ids_name = api.get_user(ids[i]).screen_name
g.add_node(ids_name)
g.add_edge(alpha, ids_name)

# We are going to comprovate if the users listed in the array ids follows between themself
# usu = usu1, usu2, usu3
# usu = usu1, usu2, usu3
# usu1 to usu2, usu1 to usu3, usu2 to usu1, usu2 to usu3, usu3 to usu1 AND usu3 to usu2 basically
for id1 in ids:
id1_name = api.get_user(id1).screen_name # User name
print '\n'
print colored('#'*(len(id1_name)+2),'green')
print colored('#'+id1_name.upper()+'#','green')
print colored('#'*(len(id1_name)+2),'green')

for id2 in ids:
id2_name = api.get_user(id2).screen_name # User name
if (id1_name == id2_name): # If the user is equal to himself, pass
pass
else:
a = api.show_friendship(source_screen_name=id1_name, target_screen_name=id2_name) # Get the relationship between this two different users in a list
followed = str(a[1]).split(',')[2].split('=')[1] #Param of the list followed_by=False/True
following = str(a[1]).split(',')[4].split('=')[1] #Param of the list following=False/True
print "\tWith " + colored(id2_name,'cyan')
print colored("\tFollowed? ",'green') + colored(followed,'red') + colored("\tFollowing? ",'green') + colored(following,'red')

if (followed == "True") and (following == "True"): #If them follow and are followed
g.add_edge(id1_name, id2_name,  edge_color="red", style="doted") # Join them with a doted and style of edge
elif (followed == "True"):
g.add_edge(id2_name, id1_name,  edge_color="blue") # Join them with a blue edge
elif (following == "True"):
g.add_edge(id1_name, id2_name,  edge_color="green")
else:
pass

# Give color red to the main node (user we are looking for)
# If its not the main user, paint it white
for node in g:
if node == alpha:
color_map.append('red')
else:
color_map.append('white')

# Draw the graphic
nx.draw(g, node_color = color_map, with_labels=True)
nx.spring_layout(g,k=0.15,iterations=20)
plt.show()


En este mismo foro hay un tutorial muy bueno sobre cómo obtener las claves necesarias cuyo autor es No tienes permitido ver los links. Registrarse o Entrar a mi cuenta.
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Espero que les sea de alguna utilidad. Gracias por visitar mi primer post!  ;)

Muy bueno bro!!! Se lo ve excelente!!!
Gran aporte! no teniamos nada de esto en el foro

Saludos,
ANTRAX


Si estas limitado por el API, dudo mucho que puedas hacer algo.


Ahora, ¿intentaste simular un navegador, pedir la página y parsear la información?
Tenía a medias un proyecto así (justo pensando en esas posibles limitaciones) antes de entrar a la universidad y lo tuve que dejar tirado. Es lo único que se me ocurre.

Saludos!







No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Muy bueno bro!!! Se lo ve excelente!!!
Gran aporte! no teniamos nada de esto en el foro

Saludos,
ANTRAX
¡Muchas gracias! Hace tiempo que visito el foro pero no había posteado nunca nada. Espero seguir posteando de vez en cuando algún pequeño proyecto :)

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Si estas limitado por el API, dudo mucho que puedas hacer algo.


Ahora, ¿intentaste simular un navegador, pedir la página y parsear la información?
Tenía a medias un proyecto así (justo pensando en esas posibles limitaciones) antes de entrar a la universidad y lo tuve que dejar tirado. Es lo único que se me ocurre.

Saludos!
Verás, en un principio intenté hacerlo con Instagram pero no logré nada. Y vi que el mecanismo era similar en twitter. Me explico:
Cuando accedes a un perfil en instagram o en twitter, para obtener más resultados debes scrollear hacia abajo. Sé más o menos algo de urllib y requests pero con eso sólo descargo el código de la página para los primeros elementos.
No sé si hay alguna forma de ejecutar javascript mediante esos módulos o de activar ese OnScroll de Javascript.
Y por eso ando algo perdido y recurrí a un módulo específico para esto ;D Pero ya seguiré investigando a ver si hay alguna otra manera  ;)

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Verás, en un principio intenté hacerlo con Instagram pero no logré nada. Y vi que el mecanismo era similar en twitter. Me explico:
Cuando accedes a un perfil en instagram o en twitter, para obtener más resultados debes scrollear hacia abajo. Sé más o menos algo de urllib y requests pero con eso sólo descargo el código de la página para los primeros elementos.
No sé si hay alguna forma de ejecutar javascript mediante esos módulos o de activar ese OnScroll de Javascript.
Y por eso ando algo perdido y recurrí a un módulo específico para esto ;D Pero ya seguiré investigando a ver si hay alguna otra manera  ;)

Exacto, por eso mencioné que lo ideal seria intentar simular un navegador, aunque por más que se use javascript ese contenido nuevo tiene que venir del servidor, solo hay que encontrar como hacer esas peticiones y replicarlas. Porque dudo que por la API se puede hacer algo.

Si descubres como hacerlo, te gradecería si lo publicas puesto que me interesa y hasta diciembre no tengo tiempo .

Saludos!







No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Creo que estos tres enlaces pueden ser de utilidad:
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Por el momento tengo que investigar un poco más en el tema, pero parece interesante este módulo  :D