Парсим друзей Вконтакте на Python

Парсим друзей Вконтакте на Python

Данный скрипт без всяких ключей авторизации вытаскивает по укзанному id Вконтакте список всех друзей юзера. К тому же он помечает людей которые учились вместе и живут в одном городе. Показывает общих друзей. Не рекомендуется запускать скрипт на аккаунтах с числом друзей больше 350. Чтобы парсить такие акки скрипт нужно допилить, потому что в одном запросе число uid ограничено 1000 человек а по факту из за длины GET запроса 350-ю людьми.

import json
import requests
import sys
from datetime import datetime
import time
import webbrowser
from time import sleep

non_bmp_map = dict.fromkeys(range(0x10000, sys.maxunicode + 1), 0xfffd)

uid=input('Введите id пользователя Вконтакте: ')

print('Наберитесь терпения и ожидайте от 1 до 30 минут пока не откроется браузер с результатами')

s=requests.get('https://api.vk.com/method/getProfiles?uids=' + uid + '&fields=uid,%20first_name,%20last_name,%20sex,%20bdate,%20city,%20country,%20photo_200,%20online,%20lists,%20screen_name,%20contacts,%20education,%20universities,%20schools,%20activity,%20last_seen,%20relation,%20counters,%20nickname,%20relatives,%20interests,%20movies,%20tv,%20books,%20games,%20about,%20connections').text
p = json.loads(s)

user_city=''
user_university_name=''
user_faculty_name=''
user_school=''

w='''<html><head><title>Отчет о друзьях</title><meta charset="utf-8">
<style>
body {
background: gray;
}
.pic {
display: inline-block;
vertical-align: top;
width: 200px;
height: auto;
margin-bottom: 10px;
}
.text {
display: inline-block;
vertical-align: top;
width: calc(100% - 300px);
height: auto;
padding-left: 20px;
margin-bottom: 10px;
}
.all {
background: white;
padding: 30px;
margin: 30px;
border-radius: 5px;
}
.all2 {
background: silver;
}
.two {
font-weight: bold;
color: red;
}
</style>
</head><body>'''

for x in p['response']:
    print('Ищем друзей юзера '+str(x['uid']))
    w=w+'<a target="_blank" href="http://vk.com/id'+str(x['uid'])+'"><div class="all all2"><div class="pic">'
    if(('photo_200' in x) and (x['photo_200']!='')):
        w=w+'<img src="'+x['photo_200'].translate(non_bmp_map)+'">'
    w=w+'</div><div class="text">'
    if('first_name' in x):
        w=w+'<div class="one">'+('Имя: '+x['first_name'].translate(non_bmp_map))+'</div>'
    if('last_name' in x):
        user_last_name=x['last_name'].translate(non_bmp_map)
        w=w+'<div class="one">Фамилия: '+user_last_name+'</div>'
    if('sex' in x):
        if(x['sex']==2):
            w=w+'<div class="one">'+('Пол: мужской')+'</div>'
        if(x['sex']==1):
            w=w+'<div class="one">'+('Пол: женский')+'</div>'
    if(('nickname' in x) and (x['nickname']!='')):
        w=w+'<div class="one">'+('Ник: '+x['nickname'].translate(non_bmp_map))+'</div>'
    if(('screen_name' in x) and (x['screen_name']!='')):
        w=w+'<div class="one">'+('Ник2: '+x['screen_name'].translate(non_bmp_map))+'</div>'
    if('bdate' in x):
        user_date=str(x['bdate'])
        w=w+'<div class="one">'+('День рождения: '+str(x['bdate']))+'</div>'
    if(('city' in x) and (x['city']!=0)):
        ss=requests.get('https://api.vk.com/method/database.getCitiesById?city_ids='+str(x['city'])).text
        pp = json.loads(ss)
        user_city=pp['response'][0]['name']
        w=w+'<div class="one">Город: '+user_city+'</div>'
    if('last_seen' in x):
        w=w+'<div class="one">Последний раз был(а) - '+(time.ctime(x['last_seen']['time']))+'</div>'
    if(('university_name' in x) and (x['university_name']!='')):
        user_university_name=x['university_name'].translate(non_bmp_map)
        w=w+'<div class="one">Университет: '+user_university_name+'</div>'
    if(('faculty_name' in x) and (x['faculty_name']!='')):
        user_faculty_name=x['faculty_name'].translate(non_bmp_map)
        w=w+'<div class="one">Факультет: '+user_faculty_name+'</div>'
    if(('interests' in x) and (x['interests']!='')):
        w=w+'<div class="one">'+('Интересы: '+x['interests'].translate(non_bmp_map))+'</div>'
    if(('movies' in x) and (x['movies']!='')):
        w=w+'<div class="one">'+('Фильмы: '+x['movies'].translate(non_bmp_map))+'</div>'
    if(('tv' in x) and (x['tv']!='')):
        w=w+'<div class="one">'+('Шоу: '+x['tv'].translate(non_bmp_map))+'</div>'
    if(('books' in x) and (x['books']!='')):
        w=w+'<div class="one">'+('Книги: '+x['books'].translate(non_bmp_map))+'</div>'
    if(('games' in x) and (x['games']!='')):
         w=w+'<div class="one">'+('Игры: '+x['games'].translate(non_bmp_map))+'</div>'
    if(('schools' in x) and (len(x['schools'])>0)):
        for z in x['schools']:
            y='<div class="one">'
            y=y+('Школа: ')
            user_school=z['id']
            y=y+(z['name'])
            if('year_graduated' in z):
                y=y+(' '+str(z['year_graduated']))
            y=y+'</div>'
            w=w+y
    if(('about' in x) and (x['about']!='')):
        w=w+'<div class="one">'+('О себе: '+x['about'].translate(non_bmp_map))+'</div>'
    w=w+'</div></div></a>'

s=requests.get('https://api.vk.com/method/friends.get?user_id='+uid).text
p = json.loads(s)
friends=''
fr=[]
for x in p['response']:
    friends=friends+str(x)+','
    fr.append(str(x))
friends = friends[0:-1]

s=requests.get('https://api.vk.com/method/getProfiles?uids=' + friends + '&fields=uid,%20first_name,%20last_name,%20sex,%20bdate,%20city,%20country,%20photo_200,%20online,%20lists,%20screen_name,%20contacts,%20education,%20universities,%20schools,%20activity,%20last_seen,%20relation,%20counters,%20nickname,%20relatives,%20interests,%20movies,%20tv,%20books,%20games,%20about,%20connections').text
p = json.loads(s)

w=w+'<div class="friends">'

for x in p['response']:
    sleep(0.1)
    w=w+'<div class="all" id="id'+str(x['uid'])+'"><div class="pic">'
    if(('photo_200' in x) and (x['photo_200']!='')):
        w=w+'<img src="'+x['photo_200'].translate(non_bmp_map)+'">'
    w=w+'</div><div class="text"><div class="one"><a target="_blank" href="http://vk.com/id'+str(x['uid'])+'">http://vk.com/id'+str(x['uid'])+'</a></div>'
    if('first_name' in x):
        w=w+'<div class="one">'+('Имя: '+x['first_name'].translate(non_bmp_map))+'</div>'
    if('last_name' in x):
        w=w+'<div class="one">'+('Фамилия: '+x['last_name'].translate(non_bmp_map))+'</div>'
    if('sex' in x):
        if(x['sex']==2):
            w=w+'<div class="one">'+('Пол: мужской')+'</div>'
        if(x['sex']==1):
            w=w+'<div class="one">'+('Пол: женский')+'</div>'
    if(('nickname' in x) and (x['nickname']!='')):
        w=w+'<div class="one">'+('Ник: '+x['nickname'].translate(non_bmp_map))+'</div>'
    if(('screen_name' in x) and (x['screen_name']!='')):
        w=w+'<div class="one">'+('Ник2: '+x['screen_name'].translate(non_bmp_map))+'</div>'
    if(('bdate' in x) and (str(x['bdate'])!='')):
        w=w+'<div class="one">'+('День рождения: '+str(x['bdate']))+'</div>'
    if(('city' in x) and (x['city']!=0)):
        ss=requests.get('https://api.vk.com/method/database.getCitiesById?city_ids='+str(x['city'])).text
        pp = json.loads(ss)
        w=w+'<div class="one">Город: '+pp['response'][0]['name']+'</div>'
        if((user_city!='') and (user_city==pp['response'][0]['name'])):
            w=w+'<div class="one two">'+('Живет в одном городе с данной личностью')+'</div>'
    if('last_seen' in x):
        w=w+'<div class="one">Последний раз был(а) - '+(time.ctime(x['last_seen']['time']))+'</div>'
    if(('university_name' in x) and (x['university_name']!='')):
        w=w+'<div class="one">Университет: '+x['university_name'].translate(non_bmp_map)+'</div>'
        if(user_university_name==x['university_name'].translate(non_bmp_map)):
            w=w+'<div class="one two">'+('Учились в одном университете')+'</div>'
    if(('faculty_name' in x) and (x['faculty_name']!='')):
        w=w+'<div class="one">Факультет: '+x['faculty_name'].translate(non_bmp_map)+'</div>'
        if(user_faculty_name==x['faculty_name'].translate(non_bmp_map)):
            w=w+'<div class="one two">Факультет: '+('Учились на одном факультете')+'</div>'
    if(('interests' in x) and (x['interests']!='')):
        w=w+'<div class="one">'+('Интересы: '+x['interests'].translate(non_bmp_map))+'</div>'
    if(('movies' in x) and (x['movies']!='')):
        w=w+'<div class="one">'+('Фильмы: '+x['movies'].translate(non_bmp_map))+'</div>'
    if(('tv' in x) and (x['tv']!='')):
        w=w+'<div class="one">'+('Шоу: '+x['tv'].translate(non_bmp_map))+'</div>'
    if(('books' in x) and (x['books']!='')):
        w=w+'<div class="one">'+('Книги: '+x['books'].translate(non_bmp_map))+'</div>'
    if(('games' in x) and (x['games']!='')):
        w=w+'<div class="one">'+('Игры: '+x['games'].translate(non_bmp_map))+'</div>'
    if(('schools' in x) and (len(x['schools'])>0)):
        for z in x['schools']:
            if(z['id']==user_school):
                w=w+'<div class="one two">'+('Учились в одной школе')+'</div>'
            y='<div class="one">'
            y=y+('Школа: ')
            user_school=z['id']
            y=y+(z['name'])
            if('year_graduated' in z):
                y=y+(' '+str(z['year_graduated']))
            y=y+'</div>'
            w=w+y
    if(('about' in x) and (x['about']!='')):
        w=w+'<div class="one">'+('О себе: '+x['about'].translate(non_bmp_map))+'</div>'
    sss=requests.get('https://api.vk.com/method/friends.get?user_id='+str(x['uid'])).text
    ppp = json.loads(sss)
    r=''
    try:
        for xxx in ppp['response']:
            if(str(xxx) in fr):
                sleep(0.1)
                ssss=requests.get('https://api.vk.com/method/getProfiles?uids=' + str(xxx) + '&fields=first_name,%20last_name').text
                pppp = json.loads(ssss)
                mn=''
                for xxxx in pppp['response']:
                    if('first_name' in xxxx):
                        mn=mn+xxxx['first_name'].translate(non_bmp_map)+' '
                    if('last_name' in xxxx):
                        mn=mn+xxxx['last_name'].translate(non_bmp_map)
                r=r+'<a href="#id'+str(xxx)+'">'+mn+' (id'+str(xxx)+')</a>, '
    except: pass
    if(r!=''):
        w=w+'<div class="one">Общие друзья: '+r+'</div>'
    

    w=w+'</div></div>'
    
w=w+'</div>'

with open("out.html","w",encoding='utf-8') as out:
    print(w, file=out)
out.close()
if(w!=''):
    webbrowser.open('out.html')	
Отработав, довольно продолжительное время скрипт выдает красивый отчет с фотографиями и инфой о друзьях.

Парсим друзей Вконтакте на Python Лого Pythono.ru Парсим друзей Вконтакте на Python