Subversion Repositories Plazes

[/] [NetworkX/] [Plazes-NetworkX.py] - Rev 123

Compare with Previous | Blame | View Log

import sys, os
import urllib
import urllib2
import commands
import base64
import array
import networkx as NX
import pylab as P
 
from xml.dom.minidom import parseString
 
class Edge:
 
	def __init__(self,nodefrom,nodeto):
		self.nodefrom = nodefrom;
		self.nodeto = nodeto;
 
class PlazesRelations:
 
	def __init__(self,username):
		self.plazesurl = 'http://plazes.com/';
		self.plazes_username = username;
		self.edges = [];
		self.lookedup = {};
		self.hasneighbors = {};
		self.counted = {};
		self.counter = 0;
		self.usersperpage = 50;
 
		self.get_trustees(username,1)
 
	def get_trustees(self,fromuser,level):
		self.lookedup[fromuser] = True
		offset = 0
		done = False
 
		while (not done):
			address = self.plazesurl + 'users/' + fromuser + '/trustees.xml?offset=' + str(offset)
			print "Getting trustee data from " + address
			request = self.prepare_get_request(address)
			opener = urllib2.build_opener()
 
			try:
				trustees = opener.open(request).read()
				howmanyusers = self.parse_plaze_xml(trustees, fromuser, level)
			except IOError, e:
				if hasattr(e, 'code'):
					print 'Got Error code: ', e.code
					print e.read()
 
			print "Got " + str(howmanyusers) + " users"
			if (howmanyusers == self.usersperpage):
				offset = offset + self.usersperpage
			else:
				done = True
 
	def prepare_get_request(self, url):
		request = urllib2.Request(url)
		request.add_header('User-Agent', 'device: api')
		request.add_header('Content-Type', 'application/xml')
		return request
 
	def parse_plaze_xml(self, xml, fromuser, level):
		dom = parseString(xml)
		users = dom.getElementsByTagName('user')
 
		if (len(users) > 0):
			for user in users:
				name = str(user.getElementsByTagName('name')[0].firstChild.data)
				self.hasneighbors[fromuser] = True
				print "Adding edge: " + fromuser + " -> " + name
				e = Edge(fromuser, name)
				self.edges.append(e)
 
				if (name not in self.counted):
					self.counter = self.counter + 1
					self. counted[name] = True
 
				if ((level == 1)):
				   if (name not in self.lookedup):
					  self.get_trustees(name,2)
 
		return len(users)
 
 
	def make_graph(self):
		g=NX.Graph()
 
		for o in self.edges:
			if (o.nodeto in self.hasneighbors):
				print o.nodefrom + " -> " + o.nodeto
				g.add_edge(o.nodefrom,o.nodeto)
 
		print g.edges()
		NX.write_edgelist(g, self.plazes_username + ".edgelist")
 
		NX.draw(g,node_size=[g.degree(v)*20 for v in g],font_size=5,alpha=0.5,node_color='w')
		P.title(self.plazes_username + "'s Plazes Network")
		P.axis('off')
		P.savefig(self.plazes_username + ".pdf")
 
t = PlazesRelations('ruk')
 
t.make_graph()
 
 
 
 
 

Compare with Previous | Blame | View Log