import requests import networkx import time import collections def get_friends_ids(user_id): friends_url = 'https://api.vk.com/method/friends.get?user_id={}' # access_token , OAuth 2.0 json_response = requests.get(friends_url.format(user_id)).json() if json_response.get('error'): print json_response.get('error') return list() return json_response[u'response'] graph = {} friend_ids = get_friends_ids(1405906) # user id, . for friend_id in friend_ids: print 'Processing id: ', friend_id graph[friend_id] = get_friends_ids(friend_id) g = networkx.Graph(directed=False) for i in graph: g.add_node(i) for j in graph[i]: if i != j and i in friend_ids and j in friend_ids: g.add_edge(i, j) pos=networkx.graphviz_layout(g,prog="neato") networkx.draw(g, pos, node_size=30, with_labels=False, width=0.2)
In addition to restrictions on the frequency of calls, there are also quantitative restrictions on calling methods of the same type. For obvious reasons, we do not provide information on exact limits.
deq = collections.deque(maxlen=4) def trottling_request(url): deq.appendleft(time.time()) if len(deq) == 4: # 3 , - time.sleep(max(1+deq[3]-deq[0], 0))
networkx.write_graphml(g, 'graph.graphml')
%matplotlib inline import networkx import requests import json def getVKMembers(group_id, count=1000, offset=0): # http://vk.com/dev/groups.getMembers host = 'http://api.vk.com/method' if count > 1000: raise Exception('Bad params: max of count = 1000') response = requests.get('{host}/groups.getMembers?group_id={group_id}&count={count}&offset={offset}' .format(host=host, group_id=group_id, count=count, offset=offset)) if not response.ok: raise Exception('Bad response code') return response.json() def allCountOffset(func, func_id): set_members_id = set() count_members = -1 offset = 0 while count_members != len(set_members_id): # posible endless loop for real vk api response = func(func_id, offset=offset)['response'] if count_members != response['count']: count_members = response['count'] new_members_id = response['users'] offset += len(new_members_id) if set_members_id | set(new_members_id) == set_members_id != set(): # without new members print 'WARNING: break loop', count_members, len(set_members_id) break set_members_id = set_members_id.union(new_members_id) return set_members_id groups = ['http://vk.com/meduzaproject', 'http://vk.com/tj', 'http://vk.com/smmrussia', 'http://vk.com/vedomosti', 'http://vk.com/kommersant_ru', 'http://vk.com/kfm', 'http://vk.com/oldlentach', 'http://vk.com/lentaru', 'http://vk.com/lentasport', 'http://vk.com/fastslon', 'http://vk.com/tvrain', 'http://vk.com/sport.tvrain', 'http://vk.com/silverrain', 'http://vk.com/afishagorod', 'http://vk.com/afishavozduh', 'http://vk.com/afishavolna', 'http://vk.com/1tv', 'http://vk.com/russiatv', 'http://vk.com/vesti', 'http://vk.com/ntv', 'http://vk.com/lifenews_ru'] members = {} for g in groups: name = g.split('http://vk.com/')[1] print name members[name] = allCountOffset(getVKMembers, name) matrix = {} for i in members: for j in members: if i != j: matrix[i+j] = len(members[i] & members[j]) * 1.0/ min(len(members[i]), len(members[j])) max_matrix = max(matrix.values()) min_matrix = min(matrix.values()) for i in matrix: matrix[i] = (matrix[i] - min_matrix) / (max_matrix - min_matrix) g = networkx.Graph(directed=False) for i in members: for j in members: if i != j: g.add_edge(i, j, weight=matrix[i+j]) members_count = {x:len(members[x]) for x in members} max_value = max(members_count.values()) * 1.0 size = [] max_size = 900 min_size = 100 for node in g.nodes(): size.append(((members_count[node]/max_value)*max_size + min_size)*10) import matplotlib.pyplot as plt pos=networkx.spring_layout(g) plt.figure(figsize=(20,20)) networkx.draw_networkx(g, pos, node_size=size, width=0.5, font_size=8) plt.axis('off') plt.show()
Source: https://habr.com/ru/post/263313/
All Articles