Якось під час чергового наближення економічної кризи захотілось проаналізувати ціну нерухомості в Львові. А ще, в той же час я наткнувся на документацію API Вконтакті. А так як своє житло я шукав в тому числі і в тій соціальній мережі, то вирішив проаналізувати наприклад спільноту vk.com/nomakler.
Ну, проаналізувати це легко сказати – важче зробити. Як витягти з повідомлення ціну, і як відрізнити попит від пропозиції? Га?
Але є половинний результат – ФСБ мусило поділитись частиною своєї бази даних розміром в 40450 оголошень. Тут можна її завантажити як tsv, xls чи інший зручний для вас формат. Може комусь, хто захоче збільшити конкуренцію серед львівськи маклерів/ріелторів знадобиться.
А якщо кому потрібна інформація з інших груп – ось скрипт. Викликаєте функцію save2tsv
з назвою групи і назвою файлу в який писати – і чекаєте поки завантажиться.
import requests import json from pprint import pprint from itertools import islice from datetime import datetime from butils.csv_wrapper import UnicodeWriter class APIError(Exception): pass def vk(method, **kwargs): ''' https://vk.com/dev/methods ''' r = requests.get( 'https://api.vk.com/method/%s' % method, params=kwargs ) js = json.loads(r.text) if js.get('error'): raise APIError(js['error']['error_msg']) return js['response'] def get_users(ids, known_users={}): request_ids = [i for i in ids if i not in known_users] if request_ids: user_ids=','.join(str(i) for i in request_ids if i > 0) if user_ids: users = vk('users.get', user_ids=user_ids) else: users = [] group_ids=','.join(str(-i) for i in request_ids if i < 0) if group_ids: groups = vk('groups.getById', group_ids=group_ids) else: groups = [] for user in users: known_users[int(user['uid'])] = dict( first_name = user['first_name'], last_name = user['last_name'], ) for group in groups: known_users[-int(group['gid'])] = dict( first_name = group['name'], last_name = group['gid'] ) return known_users def get_wall(domain): count = 50 offset = 0 def get_with_offset(offset): nonlocal count print('get_with_offset(%s)' % offset) total = vk('wall.get', domain=domain, count=1, )[0] off = total - offset - count if off < 0: count = count + off off = 0 return vk('wall.get', domain=domain, count=count, offset=off, )[1:][::-1] # remove first and reverse while True: posts = get_with_offset(offset) offset += count users = get_users(p['from_id'] for p in posts) for p in posts: yield p, users[p['from_id']] if count < 50: return def save2tsv(domain, dst): with UnicodeWriter(dst, encoding='utf-8', delimiter='t') as writer: writer.writerow(( 'ID', 'Datetime', 'First name', 'Last name', 'Text', 'Type', 'Comments', 'Reposts', 'Likes', )) for p, user in get_wall(domain): writer.writerow(list(map(str, ( p['id'], # ID datetime.fromtimestamp(p['date']), # Datetime user['first_name'], # First name user['last_name'], # Last name p['text'], # Text p['post_type'], # Type p['comments']['count'], # Comments p['reposts']['count'], # Reposts p['likes']['count'], # Likes )))) # save2tsv('nomakler', 'nomakler.tsv')
Filed under: Кодерство, Павутина Tagged: Python
