Updated code for downloading photos.

master
Vladimir Protsenko 3 years ago
parent 1c96b46e7e
commit 00eacf0e82

@ -6,103 +6,73 @@
## 1. Скачивание фотографий из социальной сети ## 1. Скачивание фотографий из социальной сети
При выполнении данной лабораторной работы следует использовать пакет VK (не VK_api). При выполнении данной лабораторной работы будем использовать `vk_api` для выполнения запросов https://vk.com/dev/photos к социальной сети вконтакте.
Установим данный пакет с помощью следующей команды.
```bash
$ pip install vk
```
Необходимо создать приложение VK для того, чтобы получить доступ к данным. Для этого перейдем на страницу разработчиков VK и в разделе «Мои приложения» создадим новое приложение. Для дальнейшей работы нам потребуется ID приложения и Защищённый ключ.
Войдем в VK.
```python
from urllib.request import urlretrieve
import vk, os, time, math
# Авторизация
login = ''
password = ''
vk_id = 'ID_ВАШЕГОРИЛОЖЕНИЯ'
session = vk.AuthSession(app_id=vk_id,
user_login=login, user_password=password)
vkapi = vk.API(session)
```
Для удобства, входными данными можно указать ссылки на альбомы. Только целиком url не подойдёт, понадобится id хозяина альбома (группы или человека) и id самого альбома, которые и можно достать из ссылки. К примеру, в https://vk.com/album-54530371_212428070 id владельца (в данном случае сообщества) это -54530371, а id альбома 212428070. Следует обратить внимание, если загружать из альбома сообщества, то «-» (дефис) перед id владельца обязателен.
Получаем на вход ссылку на альбом, затем разбираем её и раскладываем по переменным `album_id` и `owner_id` соответствующие `id`.
Далее нужно получить количество фото, а также инициализировать переменные для статистики. Код загрузки фотографий приведён ниже.
```python
#url = input("Введите url альбома: ")
url = "https://vk.com/album223007487_199949846"
# Разбираем ссылку
album_id = url.split('/')[-1].split('_')[1]
owner_id = url.split('/')[-1].split('_')[0].replace('album', '')
photos_count = vkapi.photos.getAlbums(
owner_id=owner_id,
album_ids=album_id)[0][size]
counter = 0 # текущий счетчик
prog = 0 # процент загруженных
breaked = 0 # не загружено из-за ошибки
time_now = time.time() # время старта
``` ```
import os
Проблема при загрузке большого количества фотографий в том, что за один запрос нельзя забрать больше 1000 штук, в то время как в альбоме их может быть десяток тысяч. import sys
import vk_api
Процесс загрузки описывается следующим образом. import urllib
```python LOGIN = ''
#Создадим каталоги PASSWORD = ''
if not os.path.exists('saved'):
os.mkdir('saved') target_ids = [123124, -1212412]
# идентификаторы сообщества имеют отрицательные значения.
photo_folder = 'saved/album{0}_{1}'.format(owner_id, album_id)
def auth_handler():
if not os.path.exists(photo_folder): """ При двухфакторной аутентификации вызывается эта функция.
os.mkdir(photo_folder) """
# Код двухфакторной аутентификации
# Подсчитаем, сколько раз нужно получать список фото, так как число получится не целое - округляем в большую сторону key = input("Enter authentication code: ")
for j in range(math.ceil(photos_count / 1000)): # Если: True - сохранить, False - не сохранять.
photos = vkapi.photos.get( remember_device = True
owner_id=owner_id, return key, remember_device
album_id=album_id,
count=1000, def main():
offset=j*1000, # ======= Открываем сессию с VK =======
v=5.95)['items'] vk_session = vk_api.VkApi(LOGIN, PASSWORD,
auth_handler=auth_handler # функция для обработки двухфакторной аутентификации
# Получаем список фото )
for photo in photos: try:
counter += 1 vk_session.auth()
sizes = photo['sizes'] except vk_api.AuthError as error_msg:
s = photo['sizes'][0] print(error_msg)
value_x = 0 #return
value_y = 0
# выбираем самый большой размер vk = vk_session.get_api()
for size in sizes: tools = vk_api.VkTools(vk_session)
if value_x < size['width']:
value_x = size['width'] # ======= начинаем перебирать каждого пользователя =======
s = size for target_id in target_ids:
if value_y < size['height']: # создаем директорию с именем пользователя, если нет
value_y = size['height'] newpath = os.path.join(sys.path[0], id_user)
s = size if not os.path.exists(newpath):
os.makedirs(newpath)
print(s['url'])
# Получаем адрес изображения # посылаем запрос к VK API, count свой, но не более 200
url_ = s['url']
print('Загружаю фото № {} из {}. Прогресс: {}'.format(counter, photos_count, prog)) if target_id >= 0:
prog = round(100/photos_count*counter, 2) # Вариант 1 - скачать все фотографии пользователя
try: response = vk.photos.getAll(owner_id=int(target_id), count=3)
# Загружаем и сохраняем файл else:
urlretrieve(url_, photo_folder + "/" + os.path.split(url_)[1]) # Вариант 2 - скачать все фотографии сообщества
except Exception: response = tools.get_all("photos.getAll", 100, {'owner_id': target_id})
print('Произошла ошибка, файл пропущен.')
breaked += 1 # работаем с каждой полученной фотографией
continue for i in range(len(response["items"])):
time_for_dw = time.time() - time_now # берём ссылку на максимальный размер фотографии
print("\nВ очереди было {} файлов. Из них удачно загружено {} файлов, {} не удалось загрузить.") photo_url = str(response["items"][i]["sizes"][len(response["items"][i]["sizes"]) - 1]["url"])
# скачиваем фото в папку с ID пользователя
urllib.urlretrieve(photo_url, newpath + '/' + str(response["items"][i]['id']) + '.jpg')
if __name__ == "__main__":
main()
``` ```
## 2. Кластеризация цветов на изображении ## 2. Кластеризация цветов на изображении

Loading…
Cancel
Save