Уведомления

Группа в Telegram: @pythonsu

#1 Май 7, 2016 18:23:15

platon
Зарегистрирован: 2016-05-07
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Можно ли преобразовать список в строку?/Какие есть альтернативные решения?

Всем привет,
Спасибо за внимание к моему посту, интересно услышать ваши мысли и предложения.

Brief:
Пишу алгоритм для извлечения информации через API ВКонтакте, самый базовый и банальный алгоритм извлечения данных о пользователях работает на ура:

 import requests

r=requests.get('https://api.vk.com/method/users.get',params={'user_ids':7979370,'fields':'bdate'})

print(r.json())
Как результат выводит имя, фамилию, ID и дату рождения пользователя.

Извлекать информацию 1го пользователя - не интересно, поэтому давайте пойдем дальше и попробуем сделать тоже самое с несколькими. Тут тоже проблем особо не возникло:

import requests
UserID = '3674735, 4196136, 5264403, 9690412'

r=requests.get('https://api.vk.com/method/users.get',params={'user_ids':UserID,'fields':'bdate'})
r.json()
Теперь мы получим информацию о всех пользователях, чье ID указанно в строке UserID, уже интересней, но для этого все ещё нужно найти где-то эти ID.

Допустим у нас есть целая группа ВК с пользователями о которых мы хотим узнать инфу, начинаем извлекать из группы ID пользователей:

import requests

r=requests.get('https://api.vk.com/method/groups.getMembers',params={'group_id':83388025,'sort':'id_asc'})

print(r.json())

Выводит ID участником группы и результатом получается вот такой вот словарь (или это массив?):
{'response': {'count': 1346, 'users': [255248, 630877, 751755, 903660,....,n]}}

Все бы ничего, но в группе же может быть много пользователей, который нам не интересны: в моем случае я отбирал по локации (г. Харьков) и мне надо было отсеять всех лишних. Вот тут то и начались проблемы.

Проблемы:

1) Информация об участниках в виде списка и при попытке массово извлечь нужную информацию получается печаль:

 
import requests

r=requests.get('https://api.vk.com/method/groups.getMembers',params={'group_id':26270996,'sort':'id_asc'}) #вытянули нужную инфу
response=r.json() #Сложили её в масив
amount=response['response']['count']
print('Всего подписчиков',amount) #Вывели общее кол-во подписчиков

UserID=response['response']['users'] #вытащили отдельно список пользователей

r=requests.get('https://api.vk.com/method/users.get',params={'user_ids':i,'fields':'city'})
print(r.json()) """получили звездюлей по весьма понятным причинам: нельзя переметре user_ids давать значение строки"""

Немного подумава, было решино обыграть:
import requests

r=requests.get('https://api.vk.com/method/groups.getMembers',params={'group_id':26270996,'sort':'id_asc'})
response=r.json()
amount=response['response']['count']
print('Всего подписчиков',amount)

UserID=response['response']['users']

for i in UserID: """вместо того что бы подставлять всю строку будем через цикл подставлять каждое значение"""
r=requests.get('https://api.vk.com/method/users.get',params={'user_ids':i,'fields':'city'})
print(r.json())
так уже лучше, но долго - просто охренеть + выводит каждое значение как отдельный словарь:
 {'response': [{'last_name': 'Секлер', 'first_name': 'Виолетта', 'hidden': 1, 'uid': 11355, 'city': 1}]} 
В Связи с чем возникает вопрос. Можно ли как-то данные из списка
[255248, 630877, 751755, 903660,....,n]
перевести в строку:
 '255248, 630877, 751755, 903660,....,n'
??
Это бы значительно ускорило процесс и облегчило следующую задачу - отфильтровать лишнее.

2) Не зависимо от того, можно ли перевести в строку или придется мучатся с циклом, хочется отфильтровать лишнее:
import requests

r=requests.get('https://api.vk.com/method/groups.getMembers',params={'group_id':26270996,'sort':'id_asc'})
response=r.json()
amount=response['response']['count']
print('Всего подписчиков',amount)

UserID=response['response']['users']

for i in UserID:
r=requests.get('https://api.vk.com/method/users.get',params={'user_ids':i,'fields':'city'})
city=r.json() #при каждом цикле заносим назначаем переменной city словарь
if city['response'][0]['city']==1: #проверяем на соответствие нужной локации
print(city) #выводим значение

и все было бы ничего, НО: ВКонтакте в группах есть удаленный пользователи и словарь с информацией об этих пользователях не содержит параметр ‘city’, так что когда мы доходим до удаленно пользователя, то получаем вот такую фот лажу:

{'response': [{'deactivated': 'banned', 'last_name': 'Филимонова', 'first_name': 'Маргарита', 'uid': 179050}]}
---------------------------------------------------------------------------
KeyError Traceback (most recent call last)
<ipython-input-246-79764f36f327> in <module>()
17 print(r.json())
18 city=r.json()
---> 19 if city['response'][0]['city']==1:
20 print(city)

KeyError: 'city'

в связи с чем вопрос: как можно пропустить ненужные значения? - Была идея поставить ещё одно условие, которое бы проверяло действующий ли аккаунт или нет, но пока не совсем понятно как это сделать, ведь если он не действующий, то его же надо пропускать, а как его пропустить?

Спасибо за внимание и буду рад слышать ваши мысли

Отредактировано platon (Май 7, 2016 18:25:11)

Офлайн

#2 Май 7, 2016 19:18:41

ayb
Зарегистрирован: 2014-04-01
Сообщения: 297
Репутация: +  24  -
Профиль   Отправить e-mail  

Можно ли преобразовать список в строку?/Какие есть альтернативные решения?

>>> ", ".join(["1", "2", "3"]) 
'1, 2, 3'

?

Офлайн

#3 Май 7, 2016 19:24:10

ajib6ept
От: От: От: От: От: От: От: От:
Зарегистрирован: 2013-08-04
Сообщения: 297
Репутация: +  26  -
Профиль   Отправить e-mail  

Можно ли преобразовать список в строку?/Какие есть альтернативные решения?

In [1]: lst = ['a', 'b', 'c']
In [2]: ' '.join(lst)
Out[2]: 'a b c'
In [3]: d = {'key': 'value'}
In [4]: d.get('key')
Out[4]: 'value'
In [5]: d.get('key1')



_________________________
Python golden rule: Do not PEP 8 unto others; only PEP 8 thy self.
Don't let PEP 8 make you insanely intolerant of other people's code.

Офлайн

#4 Май 8, 2016 03:26:23

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9992
Репутация: +  857  -
Профиль   Отправить e-mail  

Можно ли преобразовать список в строку?/Какие есть альтернативные решения?

platon
В Связи с чем возникает вопрос. Можно ли как-то данные из списка
[255248, 630877, 751755, 903660,....,n]
перевести в строку:
 '255248, 630877, 751755, 903660,....,n'
>>> lst = [255248, 630877, 751755, 903660]
>>> out = ', '.join(map(str, lst))
>>> out
'255248, 630877, 751755, 903660'
>>>



Отредактировано py.user.next (Май 8, 2016 03:27:01)

Офлайн

#5 Май 8, 2016 18:03:19

platon
Зарегистрирован: 2016-05-07
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Можно ли преобразовать список в строку?/Какие есть альтернативные решения?

привет, спасибо больщое за ответы!

ayb
ajib6ept
py.user.next

.join() - отлично решило мою проблему, спасибо.
Но вот .get() - проблему решить не помогает, объясню почему:

При вызове подписчиков:
 r=requests.get('https://api.vk.com/method/users.get',params={'user_ids':UserID,'fields':'c0ity'})
city=r.json()
print(city)
получаем это:
{'response': [{'deactivated': 'banned', 'last_name': 'Ульянова', 'first_name': 'Юлия', 'uid': 3674735},
{'last_name': 'Щербаков', 'first_name': 'Михаил', 'hidden': 1, 'uid': 4196136, 'city': 4316}]}

И у нас получается словарь с вложенным списком, в который вложен словарь.
Даже если мы вытащим от сюда список:
 m=city.get('response'); print(city)
выводит список:
[{'deactivated': 'banned', 'last_name': 'Ульянова', 'first_name': 'Юлия', 'uid': 3674735}, {'last_name': 'Щербаков', 'first_name': 'Михаил', 'hidden': 1, 'uid': 4196136, 'city': 4316}] 
а к списку нельзя применить функцию .get()

В связи с чем вытекающий вопрос, можно ли как-то вытащить словарь из этого списка, что бы потом применить в нему функию .get()?

Спасибо.

Отредактировано platon (Май 8, 2016 18:10:09)

Офлайн

#6 Май 8, 2016 20:14:02

ayb
Зарегистрирован: 2014-04-01
Сообщения: 297
Репутация: +  24  -
Профиль   Отправить e-mail  

Можно ли преобразовать список в строку?/Какие есть альтернативные решения?

>>> lst = [{'deactivated': 'banned', 'last_name': 'Ульянова', 'first_name': 'Юлия', 'uid': 3674735}, {'last_name': 'Щербаков', 'first_name': 'Михаил', 'hidden': 1, 'uid': 4196136, 'city': 4316}]
>>> filter(lambda u: u.get("deactivated") is None, lst)
[{'city': 4316, 'first_name': '\xd0\x9c\xd0\xb8\xd1\x85\xd0\xb0\xd0\xb8\xd0\xbb', 'last_name': '\xd0\xa9\xd0\xb5\xd1\x80\xd0\xb1\xd0\xb0\xd0\xba\xd0\xbe\xd0\xb2', 'hidden': 1, 'uid': 4196136}]
/code]

Офлайн

#7 Май 27, 2016 23:27:29

prawn-cake
Зарегистрирован: 2016-02-14
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Можно ли преобразовать список в строку?/Какие есть альтернативные решения?

Привет.
Может немного не по теме, увидел что интегрируете свой скрипт / сервис с vk
Хочу порекомендовать использовать https://github.com/prawn-cake/vk-requests библиотеку для работы с API vk. Это позволит очистить код от рутины и сосредоточиться на работе с данными.
Надеюсь кто-то найдет это полезным. Извиняюсь за внимание.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version