O documento descreve como analisar redes sociais no Facebook usando as bibliotecas NetworkX e PyFacebook e hospedar a análise na plataforma Google App Engine. Ele explica como usar essas ferramentas para listar amigos no Facebook, visualizar as relações entre eles em um gráfico e armazenar os dados em caches e bancos de dados para contornar os limites do App Engine.
Análise de Redes Sociais usando NetworkX e Google App Engine
1. Análise de Redes Sociais usando
NetworkX e Google App Engine
(Shaving the yak with Python)
Érico Andrei
Pessoa Física
2. Érico Andrei
• Sócio/Diretor da Simples Consultoria
• Gerente de consultoria na Assessoria da
Presidência da Editora Abril
• Consultor de Marketing - Microsoft Brasil
• Diretor de Marketing da APyB
• Professor de Administração e Marketing
(UNIP, UNICSUL)
7. Shaving theYak
• Outro dia eu estava conversando com o
@osantana sobre o uso de Git vs
Mercurial vs PythonBrasil vs Futebol vs
Teatro...
8. On any given sunday...
• Como será que se comporta minha rede
de amigos no Facebook?
• E que tal se eu aproveitasse para aprender
este tal de Google App Engine?
• E se ....
9. On any given sunday...
• Listar meus amigos
• Relações entre estes amigos
• Fazer um gráfico destas relações
10. On any given sunday...
• Depois de 2 horas e um pouco de :
• NetworkX + App Engine + Nexus +
pyfacebook + Matplotlib
20. PyFacebook + FQL
Meus amigos
import facebook
...
query ="""SELECT uid, name, sex, birthday_date
FROM user
WHERE
uid in (SELECT uid2 FROM friend WHERE uid1=534881870)"""
friends = fb.fql.query(query)
friends = friends.get('fql_result_set',[])
21. PyFacebook + FQL
Meus amigos e relações entre eles
query ={"friends": """SELECT uid, name, birthday, relationship_status, pic_square,
FROM user
WHERE
uid in (SELECT uid2 FROM friend WHERE uid1=534881870)""",
"friendFriends": """SELECT uid1, uid2 FROM friend
WHERE uid1 IN (SELECT uid FROM #friends) AND uid2 in (SELECT
uid FROM #friends)
"""}
friends, friendsFriend = fb.fql.multiquery(query)
friends = friends.get('fql_result_set',[])
friendsFriend = friendsFriend.get('fql_result_set',[])
22. E entra OpenGraph
• Facebook disponibiliza SDK para Python
• Foco apenas em OpenGraph
http://github.com/facebook/python-sdk
27. E entra o App Engine
http://apps.facebook.com/manoexplorer/
• Manter alguns dados dos usuários
• Permitir relatórios complexos
• Pedir ajuda aos amigos
• Brincar (+) um pouco
31. Limites
• ReferenceProperty são coisas do mal
• Mantenha dados a serem exibidos no
mesmo “registro”
• Lembre-se de que temos tempo limite de
execução
32. Exemplo prático
• Um cabra tem 560 amigos no Facebook
• Ao entrar no Mano Explorer quero listar
os amigos
• Adicionar registros relativos a novos
usuários
33. Exemplo prático
• No máximo posso salvar 500 registros por
vez
• Isto consome muita CPU
35. Exemplo prático
Criando a fila
def friends(self):
''' Let's get the friends of this user
'''
user = self.current_user
if user:
taskqueue.add(url='/queue/getFriends', params={'user_id':user.id})
36. Exemplo prático
Armazenando amigos
if friends:
memcache.add(key="friends_%s" % str(user.id), value=friends, time=180)
if tmpFF:
memcache.add(key='queue_%s' % str(user.id),value=tmpFF,time=240)
ranges = [(r,((((r+limit)<nUsers) and (r+limit)) or nUsers)) for r in range
(0,nUsers,limit)]
memcache.delete(key='queues_%s' % str(user.id))
for s,e in ranges:
tmpQueues.append((s,e))
logging.debug('Adiciona tarefa na fila %d - %d' % (s,e))
taskqueue.add(queue_name='friendsUp' ,url='/queue/friend_fetch',
params={'user_id':user.id, 'start':s, 'end':e,})
memcache.add(key='queues_%s' % str(user.id),value=tmpQueues,time=180)