Форум программистов, компьютерный форум, киберфорум
Python: Web
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.74/76: Рейтинг темы: голосов - 76, средняя оценка - 4.74
 Аватар для IRIP
514 / 146 / 28
Регистрация: 18.04.2015
Сообщений: 1,904
Записей в блоге: 16

Анализ информации из социальных сетей

21.07.2018, 11:33. Показов 18030. Ответов 187
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
нужно собирать и анализировать информацию из социальных сетей

на python делать?
с чего нужно начинать?
1
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.07.2018, 11:33
Ответы с готовыми решениями:

Как сделать телеграм бота пересылающий посты и новости из RSS лент и социальных сетей (агрегатор)
Я пытался как всегда разбить план на мелкие составляющие, я начал думать что конкретно и как бот должен будет уметь делать, но даже во...

Блокировка социальных сетей
Возможно подобная тема уже есть, но как-то не нашел.... И всё же дело вот в чем, блокировать соцсети это понятно как, антивирус там,...

Кнопки социальных сетей
Скачал бесплатный шаблон в Вордпресс,в демо версии установлены кнопки социальных сетей в шапке сайта(фото№1).В админпанели есть социальные...

187
 Аватар для IRIP
514 / 146 / 28
Регистрация: 18.04.2015
Сообщений: 1,904
Записей в блоге: 16
27.10.2018, 10:45  [ТС]
Студворк — интернет-сервис помощи студентам
vrm2,

так у меня ничего и не получилось
0
431 / 302 / 90
Регистрация: 03.12.2015
Сообщений: 741
28.10.2018, 19:19
Цитата Сообщение от IRIP Посмотреть сообщение
так у меня ничего и не получилось
Это из-за того, что Вы пытаетесь решить сразу много задач одновременно - скачивать посты, сохранять их в базу, отслеживать изменившиеся и т.п.

Думаю, надо идти по чуть-чуть:
1. научиться скачивать несколько постов из ВК
2. понимать как устроен ответ ВК, какая в нем хранится информация, научиться достать нужную информацию из полученного ответа (текст сообщения, сложения, картинки и т.п.)
3. определить, что же из полученного Вы хотите сохранить. И самое главное как эти сохраненные данные будут обрабатываться (от этого зависит структура базы данных, а также выбор БД - sqlite, mysql, mongo и т.п.)
4. научиться работать с БД - создавать структуру БД (create), добавлять новые данные в БД (insert), извлекать данные из БД (select)
5. сделать сохранение нужные данных в БД
6. научиться запрашивать только обновлененные данных из ВК
7. сделать сохранение обновленных данных в БД

Какой из этих пунктов не получается?

У меня складывается впечатление, что Вы пытаетесь все это сделать по аналогии, копируя чужой код, не совсем понимая, что происходит (копировать чужой - это нормально, но обязательно надо понимать что он делает). Если делать все последовательно, то думаю все получится.

P.S. Если затык по всем пунктам по-немногу, то можно пройтись по пунктам вместе. Например, попробуйте выполнить первый пункт - запросите из любой группы ВК три поста с помощью tools.get_all('wall.get', ...). Выложите сюда результат - это объект python, который вернет ВК, в нем, скорее всего, содержатся все нужные Вам данные.
1
 Аватар для IRIP
514 / 146 / 28
Регистрация: 18.04.2015
Сообщений: 1,904
Записей в блоге: 16
29.10.2018, 18:39  [ТС]
vrm2, вроде по мануалам переписал все с нуля

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Mon Oct 29 09:11:31 2018
 
@author: irip
"""
import requests
import json
from time import sleep
import csv
 
def write_json(data):
    with open('posts.json', 'w') as file:
        json.dump(data, file, indent = 2, ensure_ascii = False)
   
 
def to_json(post_dict):
    try:
        data = json.load(open('posts_data.json'))
    except:
        data = []
    
    data.append(post_dict)
    
    with open('posts_data.json', 'w') as file:
        json.dumo(data, file, indent = 2, ensure_ascii = False)
 
 
def write_csv(data):
    with open('posts_data.csv', 'a') as file:
        writer = csv.writer(file)
        
        writer.writerow((
            data['id'], 
            data['date'], 
            data['attachments'],
            data['text']
        ))
   
   
def get_data(post):
    try:
        post_id = post['id']
    except:
        post_id = 'null'
    
    try:
        post_date = post['date']
    except:
        post_date = 'null'
    
    try:
        post_text = post['text']
    except:
        post_text = 'Блог Олеси'
        
    try:
        post_attachments = post['attachments']
    except:
        post_attachments = '* * *'
    
    data = {
        'id': post_id,
        'date': post_date,
        'attachments': post_attachments,
        'text': post_text
    }
    
    return data
 
def main():
    # https://api.vk.com/method/wall.get?user_id=210700286&v=5.52
    
    group_id = '-108964054'
    
    token = ' '
    offset = 0
    date_start = 1456978229
    all_posts = []
    
    while True:
        sleep(1)
        r = requests.get(
            'https://api.vk.com/method/wall.get', 
            params = {
                'owner_id': group_id,
                'count': 100,
                'offset': offset,
                'access_token':token,
                'version':5.58
            }
        )
        posts = r.json()['response']
        all_posts.extend(posts)
        offset += 100
        print(offset)
        
        start_post = posts[-1]['date']
        
        if start_post < date_x:
            break
        
        
    data_posts = []
    
    for post in all_posts:
        post_data = get_data(post)
        print(post_data)
        write_csv(post_data)
        
        
 
if __name__ == '__main__':
    main()

как отдельно только src_xxbig фото сохранить (ссылку)
как получить код видео?

в идеале - пока это все сохраняю в csv, для наглядности.

на выходе - аттачи нужно получить в формате <img src="https://pp.userapi.com/111/vавыафыва_tE.jpg" style="width: 449px; height: 950px; margin-top: 0px;">


а видео


<iframe src="https://vk.com/video_ext.php?oid=111&id=222&hash=bавафы 45ee2551bd" width="640" height="360" frameborder="0" allowfullscreen></iframe>

чтобы потом можно было это просто вставлять в страницу

Добавлено через 5 минут
мне как-то более понятно в таком формате
чем с api

Добавлено через 1 час 10 минут
* * *

получается, фото - нужно загружать на диск, а видео прикреплять
0
 Аватар для IRIP
514 / 146 / 28
Регистрация: 18.04.2015
Сообщений: 1,904
Записей в блоге: 16
29.10.2018, 19:08  [ТС]
Скачивать фото, нужно как-то так =)
Миниатюры
Анализ информации из социальных сетей  
0
Эксперт Python
5439 / 3860 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
29.10.2018, 19:54
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
>>> def get_data(post):
    
    return  {
        'id': post.get('post_id','null') ,
        'date': post.get('post_date','null'),
        'attachments':post.get('post_attachments','null'),
        'text':post.get('post_text','null')
        }  if isinstance(post,dict) else {}
 
>>> get_data(1)
{}
>>> get_data(None)
{}
>>> get_data({'post_id':100500})
{'id': 100500, 'date': 'null', 'attachments': 'null', 'text': 'null'}
>>> get_data({'post_id':100500,'post_date':'2018-10-29','всяко_разно':"123"})
{'id': 100500, 'date': '2018-10-29', 'attachments': 'null', 'text': 'null'}
0
 Аватар для IRIP
514 / 146 / 28
Регистрация: 18.04.2015
Сообщений: 1,904
Записей в блоге: 16
29.10.2018, 20:51  [ТС]
на гитхабе нашел кусок кода, который должен парсить любой аттач (видео, фото, файл)

Кликните здесь для просмотра всего текста

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
def parse_attachment(a, msg_id, wall_id):
    if a["type"] == "audio":
        att = Attachment(
            type_id=1,
            name=a['audio']['artist'] + a['audio']['title'],
            message_id=msg_id,
            wall_id=wall_id
        )
        session.add(att)
    elif a["type"] == "photo":
        if a["photo"]["id"] != 0:
            save_photo('%s_%s_%s' % (a["photo"]["owner_id"], a["photo"]["id"], a["photo"]["access_key"]))
            att = Attachment(
                type_id=2,
                name=a["photo"]["id"],
                link="img/%s.jpg" % a["photo"]["id"],
                message_id=msg_id, wall_id=wall_id
            )
            session.add(att)
    elif a["type"] == "video":
        link = get_video_link('%s_%s_%s' % (a["video"]["owner_id"], a["video"]["id"], a["video"]["access_key"]))
        att = Attachment(
            type_id=3,
            name=a["video"]["title"],
            link=link,
            message_id=msg_id,
            wall_id=wall_id
        )
        session.add(att)
    elif a["type"] == "doc":
        save_doc('%s_%s_%s' % (a["doc"]["owner_id"], a["doc"]["id"], a["doc"]["access_key"]))
        att = Attachment(
            type_id=4,
            name=a['doc']['title'],
            message_id=msg_id,
            wall_id=wall_id
        )
        session.add(att)
    elif a["type"] == "link":
        att = Attachment(
            type_id=5,
            name=a["link"]["url"],
            link=a["link"]["url"],
            message_id=msg_id,
            wall_id=wall_id
        )
        session.add(att)
    session.commit()


Добавлено через 1 минуту
Вот от сюда

https://github.com/nnnika/vk_p... /parser.py

как его встроить в написанное мной? По идее, Это то, что нужно (чтобы руками не описывать каждый аттач)
0
431 / 302 / 90
Регистрация: 03.12.2015
Сообщений: 741
30.10.2018, 15:25
Цитата Сообщение от IRIP Посмотреть сообщение
получается, фото - нужно загружать на диск, а видео прикреплять
В функции get_data(post) Вы вытаскиваете из одно поста нужные данные, возвращаете словарь (имя поля -> значение). Позже этот словарь записывается в csv с помощью функции write_csv(). Получается что одна строка в csv представляет данные из одного поста.

Пост может содержать вложения. Вложений может быть несколько. Куда Вы хотите их сохранять?

По аналогии с представленным Вам кодом сохранять вложения можно в отдельный CSV-файл со столбцами "тип вложения", "название", "ссылка", "id сообщения", "id стены".

Python
1
2
3
4
5
6
7
for post in all_posts:
    post_data = get_data(post)
    print(post_data)
    write_csv(post_data)
    for attachment in post_data['post_attachments']:
        att = get_attachment_data(attachment)
        write_csv_attachment(post_data)
Функцию get_attachment_data пишете по аналогии с get_data и parse_attachment. Функция будет принимать на вход описание одного вложения (также как parse_attachment), вытаскивать из описания нужные данные в зависимости от типа сообщения (также как parse_attachment) и возвращаться словарь с нужным данными (как get_data).

Напрямую, найденную Вами функцию parse_attachment использовать нельзя. Она предполагает наличие класса Attachment (нужно его описывать), а также сохраняет данные в базу данных (а не в CSV).

Функцию write_csv_attachment пишете на основе write_csv, только сохраняться будет в другой файлы и другие столбцы
0
 Аватар для IRIP
514 / 146 / 28
Регистрация: 18.04.2015
Сообщений: 1,904
Записей в блоге: 16
30.10.2018, 16:35  [ТС]
Цитата Сообщение от vrm2 Посмотреть сообщение
В функции get_data(post) Вы вытаскиваете из одно поста нужные данные, возвращаете словарь (имя поля -> значение).
да

Цитата Сообщение от vrm2 Посмотреть сообщение
озже этот словарь записывается в csv с помощью функции write_csv(). Получается что одна строка в csv представляет данные из одного поста.
да

Цитата Сообщение от vrm2 Посмотреть сообщение
Пост может содержать вложения. Вложений может быть несколько. Куда Вы хотите их сохранять?
Да! Я сейчас в строку csv просто сохраняю пачку ссылок-вложений
но, нужно чтобы из всех их, бралось только то, что нужно и прибавлялось к text

а сами файлы (фото, документы) скачивались в текущую папку (не суть)

Вот этот кусок кода

Кликните здесь для просмотра всего текста
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
def parse_attachment(post, msg_id, wall_id):
    """
        Парсим аттачи
        Возвращаем массивы прикрепленных урлов att
    """
    if post["type"] == "audio":
        att = Attachment(
            type_id = 1,
            name = post['audio']['artist'] + post['audio']['title'],
            message_id = msg_id,
            wall_id = wall_id
        )
        session.add(att)
    elif post["type"] == "photo":
        if post["photo"]["id"] != 0:
            save_photo('%s_%s_%s' % (
                post["photo"]["owner_id"], 
                post["photo"]["id"], 
                post["photo"]["access_key"]
            ))
            att = Attachment(
                type_id = 2,
                name = post["photo"]["id"],
                link = "img/%s.jpg" % a["photo"]["id"],
                message_id = msg_id,
                wall_id = wall_id
            )
            session.add(att)
    elif post["type"] == "video":
        link = get_video_link('%s_%s_%s' % (
            post["video"]["owner_id"], 
            post["video"]["id"], 
            post["video"]["access_key"]
        ))
        att = Attachment(
            type_id = 3,
            name = post["video"]["title"],
            link = link,
            message_id = msg_id,
            wall_id = wall_id
        )
        session.add(att)
    elif post["type"] == "doc":
        save_doc('%s_%s_%s' % (
            post["doc"]["owner_id"], 
            post["doc"]["id"], 
            post["doc"]["access_key"]
        ))
        att = Attachment(
            type_id = 4,
            name = post['doc']['title'],
            message_id = msg_id,
            wall_id = wall_id
        )
        session.add(att)
    elif post["type"] == "link":
        att = Attachment(
            type_id = 5,
            name = post["link"]["url"],
            link = post["link"]["url"],
            message_id = msg_id,
            wall_id = wall_id
        )
        session.add(att)
    
    return att


Как раз и преобразовывает ссылки (на видео) в нужный мне формат (не совсем конечно), нужно будет доработать
но все же

по идее, на выходе я должен иметь колонку со ссылками на фото, видео, документы и ссылки - и физические файлы на диске в текущей папке, где лежит файл


Цитата Сообщение от vrm2 Посмотреть сообщение
По аналогии с представленным Вам кодом
по аналогии, хорошо, но оно не скачивает фото - кроме обработки ссылки - фото нужно скачать - для этого доработать функцию attachments
правильно?

Добавлено через 1 минуту
* * *

это может показаться странным, но я "на пальцах" не понимаю, как работает api а вот с запросом по url, как-то более понятно
я вижу, как формируется запрос 0_о
0
431 / 302 / 90
Регистрация: 03.12.2015
Сообщений: 741
30.10.2018, 22:14
Цитата Сообщение от IRIP Посмотреть сообщение
но, нужно чтобы из всех их, бралось только то, что нужно и прибавлялось к text
- пробегаетесь по каждому вложения из поста (цикл for)
- для каждого вложения определяете его тип (по полю "type")
- в зависимости от типа вложения вытаскиваете нужную информацию о вложении (как правило это url и название)
- на основе url и названия формируете текст, который надо прибавить к text, добавляете его

Цитата Сообщение от IRIP Посмотреть сообщение
Как раз и преобразовывает ссылки (на видео) в нужный мне формат (не совсем конечно), нужно будет доработать
но все же
Нет. Этот код вытаскивает ссылки и названия вложений в зависимости от их типа (post["link"]["url"], post['doc']['title'] и т.д). И затем помещает их в класс Attachment. А Вам надо на основе этих значений создать новый текст, который Вы хотите добавлять.

Цитата Сообщение от IRIP Посмотреть сообщение
по идее, на выходе я должен иметь колонку со ссылками на фото, видео, документы и ссылки - и физические файлы на диске в текущей папке, где лежит файл
Во-первых невозможно иметь колонку в posts_data.csv, которая будет содержать ссылку на фото, видео и т.п., т.к. в одном посте может быть несколько вложений. Для каждого вложения нужна отдельная строка.

Во-вторых, ссылки на фото, видео, документы у Вас уже есть, они находятся в ответе, который прислал ВК. Осталось только скачать по указанным ссылка соответсвующие файлы (фото, видео, документы) и сохранить их на диск.

Цитата Сообщение от IRIP Посмотреть сообщение
по аналогии, хорошо, но оно не скачивает фото - кроме обработки ссылки - фото нужно скачать - для этого доработать функцию attachments
правильно
Надо вытащить url вложения из ответа, полученного от ВК. Затем сделать запрос по этому url и получить хранящийся там файл (фото, видео, документ).

Цитата Сообщение от IRIP Посмотреть сообщение
это может показаться странным, но я "на пальцах" не понимаю, как работает api а вот с запросом по url, как-то более понятно
я вижу, как формируется запрос 0_о
Не понимаю о чем идет речь.
Вы делаете запрос к ВК, он возвращает ответ (структура, состоящая из вложенных словарей и списков). Из полученного ответа Вы можете получить все, что нужно (название поста, текст, список вложений, описание каждого вложения, ссылки для скачивания вложения и т.п.)
0
 Аватар для IRIP
514 / 146 / 28
Регистрация: 18.04.2015
Сообщений: 1,904
Записей в блоге: 16
31.10.2018, 10:02  [ТС]
Цитата Сообщение от vrm2 Посмотреть сообщение
невозможно иметь колонку в posts_data.csv, которая будет содержать ссылку на фото, видео и т.п., т.к. в одном посте может быть несколько вложений.
Совершенно верно.
Но думаю, главное - фото и


vrm2,
Цитата Сообщение от vrm2 Посмотреть сообщение
Не понимаю о чем идет речь.
Вы делаете запрос к ВК, он возвращает ответ (структура, состоящая из вложенных словарей и списков).
Ну так-то, оно понятно. Что тут сложного - делаешь какой-то запрос и ...
но на практике...

для обучения

мне понятнее - когда я вижу запрос, вижу что, и куда подставляю =)


а еще - оказывается я не прошел до конца начальный курс https://stepik.org/course/67/syllabus и как раз третий раздел - по тепе списков, словарей и тп..
0
431 / 302 / 90
Регистрация: 03.12.2015
Сообщений: 741
31.10.2018, 11:18
Цитата Сообщение от IRIP Посмотреть сообщение
Совершенно верно.
Но думаю, главное - фото и
В посте может быть несколько фото. Все равно их не запихнуть в одну строку.

Цитата Сообщение от IRIP Посмотреть сообщение
а еще - оказывается я не прошел до конца начальный курс https://stepik.org/course/67/syllabus и как раз третий раздел - по тепе списков, словарей и тп.
Думаю, лучше дойти курс, а потом продолжать решать практическую задачу. Дело в том, что в программировании очень много завязано на структуры данных, надо понимать как с ними работать (создавать, изменять, обходить, доставать из них значения). Списки и словари - основные структуры данных в питон, без них точно никуда.

После этого легко разберетесь, что возвращает Вам ВК, и как оттуда вытащить то, что нужно.
0
 Аватар для IRIP
514 / 146 / 28
Регистрация: 18.04.2015
Сообщений: 1,904
Записей в блоге: 16
31.10.2018, 18:39  [ТС]
Цитата Сообщение от vrm2 Посмотреть сообщение
Думаю, лучше дойти курс, а потом продолжать решать практическую задачу. Дело в том, что в программировании очень много завязано на структуры данных, надо понимать как с ними работать (создавать, изменять, обходить, доставать из них значения). Списки и словари - основные структуры данных в питон, без них точно никуда.
да пока дойдешь курс - все, что было в начале - забывается =)
приходится закреплять =)
0
 Аватар для IRIP
514 / 146 / 28
Регистрация: 18.04.2015
Сообщений: 1,904
Записей в блоге: 16
01.11.2018, 14:58  [ТС]
vrm2,

Код для встраивания выглядит так:

Видео:

HTML5
1
[video]<iframe src="https://vk.com/video_ext.php?oid=[B]USER_ID[/B]&id=[B]POST_ID[/B]&hash=[B]ОТКУДА_БЕРЕТСЯ_ХЕШЬ?[/B]" width="640" height="360" frameborder="0" allowfullscreen></iframe>[/video]
Фото:

HTML5
1
[IMG]/upload/vk/file_name.png[/IMG]

сам код уже такой:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Mon Oct 29 09:11:31 2018
 
@author: irip
"""
import requests
import json
from time import sleep
import csv
from conf import id as source_id
from conf import token as token
 
api_v = 5.58
 
params = {
    'v': api_v,
    'access_token': token,
    'user_id': source_id,
    'count': 200,
    'offset': 0,
    'rev': 1
}
 
def main():
    # https://api.vk.com/method/wall.get?user_id=210700286&v=5.52
    
    offset = 0
    date_x = 1456978229
    all_posts = []
    
    while True:
        sleep(1)
        r = requests.get(
            'https://api.vk.com/method/wall.get', 
            params = {
                'owner_id': source_id,
                'count': 100,
                'offset': offset,
                'access_token':token,
                'version': api_v
            }
        )
        posts = r.json()['response']
        all_posts.extend(posts)
        offset += 100
        print(offset)
        
        start_post = posts[-1]['date']
        
        if start_post < date_x:
            break
        
        
    data_posts = []
    #print(all_posts)
    for post in all_posts:
        print(post)
        post_data = get_data(post)
        # print(post_data)
        save_csv(post_data)
        print('done!')
        #for attachment in post_data['attachments']:
                #att = get_attachment_data(attachment)
                #write_csv_attachment(post_data)        
 
 
 
   
def get_data(post):
    try:
        post_id = post['id']
    except:
        post_id = 'null'
    
    try:
        post_date = post['date']
    except:
        post_date = 'null'
   
    try:
        post_attachments = post['attachments']
    except:
        post_attachments = '* * *'
        
    try:
        post_text = post['text']
    except:
        post_text = '* * *'
        
 
    data = {
        'id': post_id,
        'date': post_date,
        'attachments': post_attachments,
        'text': post_text
    }
    
    return data
 
 
def get_attachment_data(post):
    """
        Парсим аттачи
        Возвращаем массивы прикрепленных урлов att
        wall_id = USER_ID
        message_id = POST_ID
    """
    if post["type"] == "photo":
        if post["photo"]["id"] != 0:
            save_photo('%s_%s_%s' % (
                post["photo"]["owner_id"], 
                post["photo"]["id"], 
                post["photo"]["access_key"]
            ))
            att = Attachment(
                type_id = 2,
                name = post["photo"]["id"],
                link = "img/%s.jpg" % a["photo"]["id"],
                message_id = msg_id,
                wall_id = wall_id
            )
            session.add(att)
    elif post["type"] == "video":
        link = get_video_link('%s_%s_%s' % (
            post["video"]["owner_id"], 
            post["video"]["id"], 
            post["video"]["access_key"]
        ))
        att = Attachment(
            type_id = 3,
            name = post["video"]["title"],
            link = link,
            message_id = msg_id,
            wall_id = wall_id
        )
        session.add(att)
    elif post["type"] == "audio":
        att = Attachment(
            type_id = 1,
            name = post['audio']['artist'] + post['audio']['title'],
            message_id = msg_id,
            wall_id = wall_id
        )
        session.add(att)
    elif post["type"] == "doc":
        save_doc('%s_%s_%s' % (
            post["doc"]["owner_id"], 
            post["doc"]["id"], 
            post["doc"]["access_key"]
        ))
        att = Attachment(
            type_id = 4,
            name = post['doc']['title'],
            message_id = msg_id,
            wall_id = wall_id
        )
        session.add(att)
    elif post["type"] == "link":
        att = Attachment(
            type_id = 5,
            name = post["link"]["url"],
            link = post["link"]["url"],
            message_id = msg_id,
            wall_id = wall_id
        )
        session.add(att)
    
    return att
 
def save_photo(photo_id):
    params = {
        'v': API_VERSION,
        'access_token': ACCESS_TOKEN,
        'photos': photo_id,
        'photo_sizes': 1
    }
    photo = requests.get(
        'https://api.vk.com/method/photos.getById',
        params = params
    )
    r = requests.get(photo.json()['response'][0]["sizes"][-1]['src'], proxies=proxies)
    with open('img/%s.jpg' % photo.json()['response'][0]["id"], 'wb') as f:
        f.write(r.content)
 
 
def get_video_link(video_id):
    params = {
        'v': API_VERSION,
        'access_token': ACCESS_TOKEN,
        'videos': video_id
    }
    video = requests.get(
        'https://api.vk.com/method/video.get',
        proxies=proxies,
        params=params
    )
    return video.json()['response']["items"][0]['player']
 
 
def save_doc(doc_id):
    params = {
        'v': API_VERSION,
        'access_token': ACCESS_TOKEN,
        'docs': doc_id
    }
    doc = requests.get(
        'https://api.vk.com/method/docs.getById',
        proxies=proxies,
        params=params
    )
    r = requests.get(doc.json()['response'][0]["url"], proxies=proxies)
    with open('docs/%s.%s' % (doc.json()['response'][0]["title"], doc.json()['response'][0]["ext"]), 'wb') as f:
        f.write(r.content)
 
 
def save_json(data):
    with open('posts.json', 'w') as file:
        json.dump(data, file, indent = 2, ensure_ascii = False)
 
 
def save_csv(data):
    with open('posts_data.csv', 'a') as file:
        writer = csv.writer(file)
        writer.writerow((
            data['id'], 
            data['date'], 
            data['attachments'],
            data['text']
        ))
   
 
def to_json(post_dict):
    try:
        data = json.load(open('posts_data.json'))
    except:
        data = []
    
    data.append(post_dict)
    
    with open('posts_data.json', 'w') as file:
        json.dumo(data, file, indent = 2, ensure_ascii = False)
 
        
 
if __name__ == '__main__':
    main()
0
 Аватар для IRIP
514 / 146 / 28
Регистрация: 18.04.2015
Сообщений: 1,904
Записей в блоге: 16
02.11.2018, 11:09  [ТС]
Интересная получилась тема - информативная...

Читаю свои посты первых дней, вызывает улыбку =)

Кликните здесь для просмотра всего текста

Цитата Сообщение от IRIP Посмотреть сообщение
Значит нужно использовать API
Далее, если таких групп от ххх и до ххх
нужно делать функцию?

Цитата Сообщение от IRIP Посмотреть сообщение
не могу понять, где его запустить?



сейчас, конечно, не далеко ушел... но все таки =)
0
 Аватар для IRIP
514 / 146 / 28
Регистрация: 18.04.2015
Сообщений: 1,904
Записей в блоге: 16
03.11.2018, 23:03  [ТС]
ТабуретY,

Ура! Я почти уже самостоятельно, наверно в 3 раз перечитав этот форум (эту ветку) написал следующее:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
import vk_api
import json
import csv
import config as cnf
 
vk_session = vk_api.VkApi(cnf.login, cnf.password)
vk_session.auth()
vk = vk_session.get_api()
tools = vk_api.VkTools(vk_session)
 
def id_by_name(name):
    return vk.groups.getById(group_id = name)[0]['id']
 
 
def main():
    vk_session = vk_api.VkApi(cnf.login, cnf.password)
 
    try:
        vk_session.auth(token_only=True)
    except vk_api.AuthError as error_msg:
        print(error_msg)
        return
 
    tools = vk_api.VkTools(vk_session)
    wall = tools.get_all(
        'wall.get', 100, {'owner_id': cnf.owner_id}
    )
    print('Всего постов: ', wall['count'])
    items = wall['items']
    for post in items:
        print(post)
        get_data_post = get_data(post)
        save_csv(get_data_post)
        print('PPC')
 
def get_data(post):
    try:
        post_id = post['id']
    except:
        post_id = 'null'
 
    try:
        post_date = post['date']
    except:
        post_date = 'null'
 
    try:
        post_attachments = post['attachments']
    except:
        post_attachments = '* * *'
 
    try:
        post_text = post['text']
    except:
        post_text = '* * *'
 
    try:
        #many_photos = post['attachments'][0]['photos']
        # вот сюда нужно добавить
        # many_photos = и получить все фото размером:
        #original: x
        #big: r
        #normal: q
        #small: p
        #micro: s
    except:
        continue
 
    data = {
        'id': post_id,
        'date': post_date,
        'attachments': post_attachments,
        'text': post_text
    }
 
    return data
 
 
 
def save_csv(data):
    with open('posts_data.csv', 'a') as cfile:
        writer = csv.writer(cfile)
        writer.writerow((
            data['id'],
            data['date'],
            data['attachments'],
            data['text']
        ))
 
 
 
def save_json(data):
    with open('wall.json', 'w') as jfile:
        json.dump(data, jfile, indent=2, ensure_ascii=False)
 
 
 
if __name__ == '__main__':
    main()

хоть тресни, уже переписал снова - на api запрос
КАК МНЕ ВЫДРАТЬ Все ссылки на КАЖДОЕ из изображений поста (определенного размера?

мне в базе нужны только

#many_photos = post['attachments'][0]['photos']
# вот сюда нужно добавить
# many_photos = и получить все фото размером:
#original: x
#big: r
#normal: q
#small: p
#micro: s
0
431 / 302 / 90
Регистрация: 03.12.2015
Сообщений: 741
03.11.2018, 23:17
Выложите сюда пример информации о вложениях, полученной из ВК.

В функцию get_data добавьте строку:
Code
1
2
3
def get_data(post):
    print(post['attachments'])
    ...
1
 Аватар для IRIP
514 / 146 / 28
Регистрация: 18.04.2015
Сообщений: 1,904
Записей в блоге: 16
04.11.2018, 10:59  [ТС]
Цитата Сообщение от vrm2 Посмотреть сообщение
сюда пример информации о вложениях
JSON
1
2
3
4
5
6
7
26,1498774651,"[{'type': 'photo', 'photo': {'id': 456239019, 'album_id': -7, 'owner_id': -108964054, 'user_id': 100, 'sizes': [{'type': 'm', 'url': 'https://pp.userapi.com/c837424/v837424161/bdaa1/tlcoU7PmHiI.jpg', 'width': 130, 'height': 90}, {'type': 'o', 'url': 'https://pp.userapi.com/c837424/v837424161/bdaa3/-wSy1pOqGVA.jpg', 'width': 130, 'height': 90}, {'type': 'p', 'url': 'https://pp.userapi.com/c837424/v837424161/bdaa4/9l09BPPZYXI.jpg', 'width': 200, 'height': 138}, {'type': 'q', 'url': 'https://pp.userapi.com/c837424/v837424161/bdaa5/psf8ioFUFzg.jpg', 'width': 320, 'height': 221}, {'type': 'r', 'url': 'https://pp.userapi.com/c837424/v837424161/bdaa6/uab2gLN0IDA.jpg', 'width': 510, 'height': 353}, {'type': 's', 'url': 'https://pp.userapi.com/c837424/v837424161/bdaa0/YthJBzqvXHI.jpg', 'width': 75, 'height': 52}, {'type': 'x', 'url': 'https://pp.userapi.com/c837424/v837424161/bdaa2/aabdwDVPtOg.jpg', 'width': 600, 'height': 415}], 'text': '', 'date': 1498774651, 'access_key': '18880407b36708dfc9'}}, {'type': 'photo', 'photo': {'id': 456239020, 'album_id': -7, 'owner_id': -108964054, 'user_id': 100, 'sizes': [{'type': 'm', 'url': 'https://pp.userapi.com/c837424/v837424161/bdaa8/eqLJOab753E.jpg', 'width': 130, 'height': 86}, {'type': 'o', 'url': 'https://pp.userapi.com/c837424/v837424161/bdaaa/ZWSbapSJzuo.jpg', 'width': 130, 'height': 87}, {'type': 'p', 'url': 'https://pp.userapi.com/c837424/v837424161/bdaab/ZU81k4VpQ-g.jpg', 'width': 200, 'height': 133}, {'type': 'q', 'url': 'https://pp.userapi.com/c837424/v837424161/bdaac/GlmnPp5kyv0.jpg', 'width': 320, 'height': 213}, {'type': 'r', 'url': 'https://pp.userapi.com/c837424/v837424161/bdaad/E2awiuJrrHA.jpg', 'width': 510, 'height': 340}, {'type': 's', 'url': 'https://pp.userapi.com/c837424/v837424161/bdaa7/M-8oZPbKOxA.jpg', 'width': 75, 'height': 50}, {'type': 'x', 'url': 'https://pp.userapi.com/c837424/v837424161/bdaa9/r_7_MM1F33Q.jpg', 'width': 600, 'height': 395}], 'text': '', 'date': 1498774651, 'access_key': 'ddcf8fdb54f89e20cb'}}, {'type': 'photo', 'photo': {'id': 456239021, 'album_id': -7, 'owner_id': -108964054, 'user_id': 100, 'sizes': [{'type': 'm', 'url': 'https://pp.userapi.com/c837424/v837424161/bdab9/LzHnInaXZhA.jpg', 'width': 130, 'height': 77}, {'type': 'o', 'url': 'https://pp.userapi.com/c837424/v837424161/bdabb/hV95fCuE2xI.jpg', 'width': 130, 'height': 87}, {'type': 'p', 'url': 'https://pp.userapi.com/c837424/v837424161/bdabc/R92_7smHGgc.jpg', 'width': 200, 'height': 133}, {'type': 'q', 'url': 'https://pp.userapi.com/c837424/v837424161/bdabd/szcCJTioarM.jpg', 'width': 320, 'height': 213}, {'type': 'r', 'url': 'https://pp.userapi.com/c837424/v837424161/bdabe/5y5ME7k6H3g.jpg', 'width': 510, 'height': 340}, {'type': 's', 'url': 'https://pp.userapi.com/c837424/v837424161/bdab8/9xp-bbtnvkI.jpg', 'width': 75, 'height': 44}, {'type': 'x', 'url': 'https://pp.userapi.com/c837424/v837424161/bdaba/IKKf_LYjjT0.jpg', 'width': 600, 'height': 354}], 'text': '', 'date': 1498774651, 'access_key': 'f55869435064239b2e'}}, {'type': 'photo', 'photo': {'id': 456239022, 'album_id': -7, 'owner_id': -108964054, 'user_id': 100, 'sizes': [{'type': 'm', 'url': 'https://pp.userapi.com/c837424/v837424161/bdac0/5jIX22Jbc_w.jpg', 'width': 130, 'height': 88}, {'type': 'o', 'url': 'https://pp.userapi.com/c837424/v837424161/bdac2/mevKXcdY2HQ.jpg', 'width': 130, 'height': 88}, {'type': 'p', 'url': 'https://pp.userapi.com/c837424/v837424161/bdac3/ZWJS9-HgG4k.jpg', 'width': 200, 'height': 135}, {'type': 'q', 'url': 'https://pp.userapi.com/c837424/v837424161/bdac4/YHnJ_C8RSC0.jpg', 'width': 320, 'height': 216}, {'type': 'r', 'url': 'https://pp.userapi.com/c837424/v837424161/bdac5/CtFc5Sb6EmU.jpg', 'width': 510, 'height': 344}, {'type': 's', 'url': 'https://pp.userapi.com/c837424/v837424161/bdabf/yE1zMLIz7EI.jpg', 'width': 75, 'height': 51}, {'type': 'x', 'url': 'https://pp.userapi.com/c837424/v837424161/bdac1/2x1AZI2tEkU.jpg', 'width': 600, 'height': 405}], 'text': '', 'date': 1498774651, 'access_key': '414928a3639bab092f'}}]","Гибкий телефон Samsung Galaxy Skin
 
Иногда, от услышанного уши сворачиваются трубочкой. Бывает, в трубочку можно свернуть ноутбук. А дизайнер Хейон Ю (Heyon You) создал концепт мобильного телефона Samsung Galaxy Skin, который также можно будет свернуть в трубочку, да и вообще гнуть его по-всякому, как душе угодно! 
Обычно дизайнеры-одиночки, создавая концепт нового мобильного телефона, просто вешают на него для красоты логотип какого-нибудь крупного производителя мобильной техники. А вот в случае с Хейоном Ю и его телефоном Samsung Galaxy Skin все произошло совсем по-другому! Компания Samsung сама заказала ему дизайн потенциального мобильного телефона Samsung Galaxy, если бы он был гибким. И Ю справился с поставленной перед ним задачей на твердую пятерку! Теперь посмотрим, как справится с его идеями Samsung. 
По задумке Хейона Ю, реализованной им в концепте мобильного телефона Samsung Galaxy Skin, гибкость не даст аппарату никаких особенных новых технических функциональных возможностей. Зато она сделает его куда более удобным и практичным. 
Если раньше у всякого телефона был свой форм-фактор (моноблок, слайдер, раскладушка, ротатор, браслет и т.д.), то Samsung Galaxy Skin, благодаря своей гибкости, сможет иметь практический любой из этих типов корпуса. Более того, с каждым из них будет ассоциироваться та или иная функция этого мобильного телефона. 
К примеру, если просто сложить Samsung Galaxy Skin вдовое, то это будет обычный мобильный телефон, если сложить его вдвое и чуть раздвинуть кончики, то так будет очень хорошо проводить видеосвязь. Повернув аппарат набок и чуть согнув его бока, вы получите аудио-видеосистему, повернув набок и чуть согнув посередине – настольный будильник. Выставив один из кончиков телефона на высоте параллельно основанию, вы сделаете мультимедийный проектор."
это был полный


а это, если вывести только attachments

JSON
1
[{'type': 'photo', 'photo': {'id': 456239019, 'album_id': -7, 'owner_id': -108964054, 'user_id': 100, 'sizes': [{'type': 'm', 'url': 'https://pp.userapi.com/c837424/v837424161/bdaa1/tlcoU7PmHiI.jpg', 'width': 130, 'height': 90}, {'type': 'o', 'url': 'https://pp.userapi.com/c837424/v837424161/bdaa3/-wSy1pOqGVA.jpg', 'width': 130, 'height': 90}, {'type': 'p', 'url': 'https://pp.userapi.com/c837424/v837424161/bdaa4/9l09BPPZYXI.jpg', 'width': 200, 'height': 138}, {'type': 'q', 'url': 'https://pp.userapi.com/c837424/v837424161/bdaa5/psf8ioFUFzg.jpg', 'width': 320, 'height': 221}, {'type': 'r', 'url': 'https://pp.userapi.com/c837424/v837424161/bdaa6/uab2gLN0IDA.jpg', 'width': 510, 'height': 353}, {'type': 's', 'url': 'https://pp.userapi.com/c837424/v837424161/bdaa0/YthJBzqvXHI.jpg', 'width': 75, 'height': 52}, {'type': 'x', 'url': 'https://pp.userapi.com/c837424/v837424161/bdaa2/aabdwDVPtOg.jpg', 'width': 600, 'height': 415}], 'text': '', 'date': 1498774651, 'access_key': '18880407b36708dfc9'}}, {'type': 'photo', 'photo': {'id': 456239020, 'album_id': -7, 'owner_id': -108964054, 'user_id': 100, 'sizes': [{'type': 'm', 'url': 'https://pp.userapi.com/c837424/v837424161/bdaa8/eqLJOab753E.jpg', 'width': 130, 'height': 86}, {'type': 'o', 'url': 'https://pp.userapi.com/c837424/v837424161/bdaaa/ZWSbapSJzuo.jpg', 'width': 130, 'height': 87}, {'type': 'p', 'url': 'https://pp.userapi.com/c837424/v837424161/bdaab/ZU81k4VpQ-g.jpg', 'width': 200, 'height': 133}, {'type': 'q', 'url': 'https://pp.userapi.com/c837424/v837424161/bdaac/GlmnPp5kyv0.jpg', 'width': 320, 'height': 213}, {'type': 'r', 'url': 'https://pp.userapi.com/c837424/v837424161/bdaad/E2awiuJrrHA.jpg', 'width': 510, 'height': 340}, {'type': 's', 'url': 'https://pp.userapi.com/c837424/v837424161/bdaa7/M-8oZPbKOxA.jpg', 'width': 75, 'height': 50}, {'type': 'x', 'url': 'https://pp.userapi.com/c837424/v837424161/bdaa9/r_7_MM1F33Q.jpg', 'width': 600, 'height': 395}], 'text': '', 'date': 1498774651, 'access_key': 'ddcf8fdb54f89e20cb'}}, {'type': 'photo', 'photo': {'id': 456239021, 'album_id': -7, 'owner_id': -108964054, 'user_id': 100, 'sizes': [{'type': 'm', 'url': 'https://pp.userapi.com/c837424/v837424161/bdab9/LzHnInaXZhA.jpg', 'width': 130, 'height': 77}, {'type': 'o', 'url': 'https://pp.userapi.com/c837424/v837424161/bdabb/hV95fCuE2xI.jpg', 'width': 130, 'height': 87}, {'type': 'p', 'url': 'https://pp.userapi.com/c837424/v837424161/bdabc/R92_7smHGgc.jpg', 'width': 200, 'height': 133}, {'type': 'q', 'url': 'https://pp.userapi.com/c837424/v837424161/bdabd/szcCJTioarM.jpg', 'width': 320, 'height': 213}, {'type': 'r', 'url': 'https://pp.userapi.com/c837424/v837424161/bdabe/5y5ME7k6H3g.jpg', 'width': 510, 'height': 340}, {'type': 's', 'url': 'https://pp.userapi.com/c837424/v837424161/bdab8/9xp-bbtnvkI.jpg', 'width': 75, 'height': 44}, {'type': 'x', 'url': 'https://pp.userapi.com/c837424/v837424161/bdaba/IKKf_LYjjT0.jpg', 'width': 600, 'height': 354}], 'text': '', 'date': 1498774651, 'access_key': 'f55869435064239b2e'}}, {'type': 'photo', 'photo': {'id': 456239022, 'album_id': -7, 'owner_id': -108964054, 'user_id': 100, 'sizes': [{'type': 'm', 'url': 'https://pp.userapi.com/c837424/v837424161/bdac0/5jIX22Jbc_w.jpg', 'width': 130, 'height': 88}, {'type': 'o', 'url': 'https://pp.userapi.com/c837424/v837424161/bdac2/mevKXcdY2HQ.jpg', 'width': 130, 'height': 88}, {'type': 'p', 'url': 'https://pp.userapi.com/c837424/v837424161/bdac3/ZWJS9-HgG4k.jpg', 'width': 200, 'height': 135}, {'type': 'q', 'url': 'https://pp.userapi.com/c837424/v837424161/bdac4/YHnJ_C8RSC0.jpg', 'width': 320, 'height': 216}, {'type': 'r', 'url': 'https://pp.userapi.com/c837424/v837424161/bdac5/CtFc5Sb6EmU.jpg', 'width': 510, 'height': 344}, {'type': 's', 'url': 'https://pp.userapi.com/c837424/v837424161/bdabf/yE1zMLIz7EI.jpg', 'width': 75, 'height': 51}, {'type': 'x', 'url': 'https://pp.userapi.com/c837424/v837424161/bdac1/2x1AZI2tEkU.jpg', 'width': 600, 'height': 405}], 'text': '', 'date': 1498774651, 'access_key': '414928a3639bab092f'}}]
Добавлено через 10 часов 56 минут
* * *

Если я правильно понимаю, то этим кодом, я сохраняю весь запрос... всю страницу

а ПОТОМ - мне нужно

брать сохраненные данные и работать с ними. Правильно?!

по сути - я все последние 5 страниц, пытался сделать непонятно что... если у меня уже была вся информация и надо было работать (обрабатывать) уже ее
0
431 / 302 / 90
Регистрация: 03.12.2015
Сообщений: 741
04.11.2018, 13:01
Цитата Сообщение от IRIP Посмотреть сообщение
а это, если вывести только attachments
1. ВК возвращает результат в виде JSON. В JSON два вида объектов:

а) Список. Обрамляется квадратными скобками. Элементы списка перечисляются через запятую. Каждый элемент может быть стройкой, числом, либо другим списком или словарем.

Вытащить элемент из списка можно по номеру элемента (нумерация начинается с нуля), например mylist[0] или mylist[i] (i содержит номер нужного элемента в списке).

Часто также для работы со списком используется цикл:

Code
1
2
3
4
# пройтись по списку и выполнить что-нибудь для каждого элемента
for element in mylist:
    # работаем с элементом списка
    print(element)
б) Словарь. Обрамляется фигурной скобкой. Элементы словаря перечисляются через запятую. Каждый элемент имеет имя (ключ) и значение. Элемент записывается в формате ключ:значение. Ключ является текстовой строкой. Значение может быть стройкой, числом, либо другим списком или словарем.

Вытащить элемент из словаря можно по его имени, например, mydict['key']

2. Попробуйте разобраться что Вам вернул ВК.

Откройте результат из attachments в каком-нибудь просмотрщике JSON. Просмотрщики просто в удобном виде показывают JSON.

Внимание: если в просмотрщик просто скопировать текст, то он будет ругаться на строки. Дело в том, что JSON ожидает, что строки будут обрамляться двойными кавычками, а у Вас везде одинарные. Поэтому, прежде чем отправлять текст в просмотрщик надо заменить одинарные кавычки на двойные в любом текстово редакторе (они все имеют функцию "замена"). После того, как у Вас будет правильный JSON его можно открыть в просмотрщике.

Откройте ссылку https://codebeautify.org/jsonviewer/cbdbadc6
Там уже загружен результат из attachments
Кнопка Tree Viewer позволяет смотреть в виде дерева
Кнопка Beautify позволяет смотреть в виде отформатированного текста

Видно, что:
- attachments это список, состоит из 4 элементов

Code
1
2
3
4
5
6
[
  {...},
  {...},
  {...},
  {...}
]
Пробежать по ним можем с помощью цикла:

Code
1
2
  for attachment in post['attachments']:
    ..
Каждый элемент attachment выглядит так - словарь с двумя элементами - type и photo:
Code
1
2
3
4
{
    "type": "photo",
    "photo": {...}
}
Наверное могут быть и другие типы вложений (type не photo), поэтому:

Code
1
2
3
  for attachment in post['attachments']:
    if attachment['type'] == 'photo':
       photo_value = attachment['photo']
photo_value - это словарь, выглядит так:

Code
1
2
3
4
5
6
7
8
9
10
{
      "id": 456239019,
      "album_id": -7,
      "owner_id": -108964054,
      "user_id": 100,
      "sizes": [...],
      "text": "",
      "date": 1498774651,
      "access_key": "18880407b36708dfc9"
    }
Из этого описания фото нам нужен только sizes.

Code
1
2
3
4
  for attachment in post['attachments']:
    if attachment['type'] == 'photo':
       photo_value = attachment['photo']
       sizes = photo_value['sizes']
sizes - это список.
Каждый элемент списка sizes выглядит так (словарь):
Code
1
2
3
4
5
6
{
  "type": "m",
  "url": "https://pp.userapi.com/c837424/v837424161/bdaa1/tlcoU7PmHiI.jpg", 
  "width": 130,
  "height": 90
}
Пробегаем по всем sizes и достаем нужную информацию:

Итого:

Code
1
2
3
4
5
6
  for attachment in post['attachments']:
    if attachment['type'] == 'photo':
       photo_value = attachment['photo']
       sizes = photo_value['sizes']
       for size in sizes:
          print(size['type'], size['url'], size['width'], size['height'])
Можно чуть сократить:

Code
1
2
3
4
  for attachment in post['attachments']:
    if attachment['type'] == 'photo':
       for size in attachment['photo']['sizes']:
          print(size['type'], size['url'], size['width'], size['height'])
Добавлено через 1 час 40 минут
Цитата Сообщение от IRIP Посмотреть сообщение
по сути - я все последние 5 страниц, пытался сделать непонятно что... если у меня уже была вся информация и надо было работать (обрабатывать) уже ее
Да, Вы сделали один запрос к ВК. Он выдал ответ. В этом ответе содержится вся нужная (на данный момент) информация - список постов, тексты постов, список и типы вложений, ссылки, по которым можно скачать вложения и т.п.
1
 Аватар для IRIP
514 / 146 / 28
Регистрация: 18.04.2015
Сообщений: 1,904
Записей в блоге: 16
04.11.2018, 21:04  [ТС]
vrm2, благодарю, за развернутый ответ.
В моем коде, я не знаю, где вставить расширение для запроса "по шаблону"

В функции def get_data или def main

в def main, честно говоря, не представляю себе

судя по всему, запрос фото, видео, аудио, файлов - должно выноситься КАЖДЫЙ в отдельный
или - пойти более "простым" путем - засунуть всё получаемое в sqlite / mongoDB
и потом ЗАПРОСОМ получать от туда нужные данные

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
import vk_api
import json
import csv
import config as cnf
 
vk_session = vk_api.VkApi(cnf.login, cnf.password)
vk_session.auth()
vk = vk_session.get_api()
tools = vk_api.VkTools(vk_session)
 
def id_by_name(name):
    return vk.groups.getById(group_id = name)[0]['id']
 
 
def main():
    vk_session = vk_api.VkApi(cnf.login, cnf.password)
 
    try:
        vk_session.auth(token_only=True)
    except vk_api.AuthError as error_msg:
        print(error_msg)
        return
 
    tools = vk_api.VkTools(vk_session)
    wall = tools.get_all(
        'wall.get', 1, {'owner_id': cnf.owner_id, 'offset': 1}
    )
    print('Всего постов: ', wall['count'])
    items = wall['items']
    for post in items:  #print(post)
        get_data_post = get_data(post)  #print(get_data_post)
        save_csv(get_data_post)  #print('PPC')
 
def get_data(post):
    print(post['attachments'])
    try:
        post_id = post['id']
    except:
        post_id = 'null'
 
    try:
        post_date = post['date']
    except:
        post_date = 'null'
 
    try:
        post_attachments = post['attachments']
        for attachment in post_attachments:
            if attachment['type'] == 'photo':
                photo_value = attachment['photo']
                sizes = photo_value['sizes']
                for size in sizes:
                    print(size['type'], size['url'], size['width'], size['height'])
 
    except:
        post_attachments = '* * *'
 
    try:
        post_text = post['text']
    except:
        post_text = '* * *'
 
    ##try:
        ###many_photos = post['attachments'][0]['photos']
        ### вот сюда нужно добавить
        ### many_photos = и получить все фото размером:
        ###original: x
        ###big: r
        ###normal: q
        ###small: p
        ###micro: s
    ##except:
        ##continue
 
    data = {
        'id': post_id,
        'date': post_date,
        'attachments': post_attachments,
        'text': post_text
    }
 
    return data
 
 
 
def save_csv(data):
    with open('posts_data.csv', 'a') as cfile:
        writer = csv.writer(cfile, delimiter=",")
        writer.writerow((
            data['id'],
            data['date'],
            data['attachments'],
            data['text']
        ))
 
 
 
def save_json(data):
    with open('wall.json', 'w') as jfile:
        json.dump(data, jfile, indent=2, ensure_ascii=False)
 
 
 
if __name__ == '__main__':
    main()
0
964 / 719 / 276
Регистрация: 10.12.2016
Сообщений: 1,764
04.11.2018, 21:57
Цитата Сообщение от IRIP Посмотреть сообщение
пойти более "простым" путем - засунуть всё получаемое в sqlite / mongoDB
и потом ЗАПРОСОМ получать от туда нужные данные
есть функция для парсинга всех json ключей
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
def flattenjson(d):
    out = []
    def flat(obj,keys='[',delim=']['):
        if type(obj) is dict:
            for k in obj:
                flat(obj[k], keys + repr(k) + delim)
        elif type(obj) is list:
            for i,x in enumerate(obj):
                flat(x, keys + repr(i) + delim)
        else:
            out.append(keys[:-1])
    flat(d)
    return out
получаете линейный список и можете через eval доставать то что надо
Python
1
2
3
4
5
6
7
with open('data.json') as f: 
    d = json.load(f)
l = flattenjson(d)
 
for i in l:
    if "photo" in i:
        print(i,eval('d'+i))
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.11.2018, 21:57

Виджеты социальных сетей
Доброе время, суток! Прошу помощи в следующем вопросе. Захотелось мне изменить виджеты своих групп в социальных сетях, а именно...

Кнопки социальных сетей
Здравствуйте! Подскажите пожалуйста, где можно почитать о том как создать динамические кнопки социальных сетей, в стиле картинки...

Иконки социальных сетей
Подскажите, как поменять иконки социальных сетей в компоненте авторизации битрикса? я нашел файл где прописывает bg-image, для каждой...

Шаринг социальных сетей
Здравствуйте. Помогите пожалуйста с шарингом соц сетей (ВК, FaceBook, Twitter). Киньте ссылки на примеры, или на самые алгоритмы...

Плагин социальных сетей
Всем привет! Расписывать не стану, вообщем скажите, есть что то подобное? Знаю что есть vk api но это не то.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
160
Ответ Создать тему
Новые блоги и статьи
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru