VK API на Python: часть 1, выгружаем все фото из альбома
Этой статьей мы открываем небольшую серию материалов по VK API. Все что вам понадобится для работы – базовые знания Python.
Настройка
Для работы мы будем использовать Python третьей версии и модуль VK для работы c api вконтакте. Установить модуль можно через pip:
# Windows pip3 install vk # Debian-based linux sudo pip3 install vk
На *nix системах могут возникнуть проблемы с установкой через pip, поэтому вот еще один способ установки. Скачайте исходники, положите их в удобный каталог и исполните в терминале:
python3 setup.py build sudo python3 setup.py install
Чтобы не нагружать код сторонними библиотеками, для загрузки фото будем использовать базовую urllib.
Для начала залогинимся.
# Импортируем нужные модули 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)
Учтите, что для работы с VK API одного только модуля для питона недостаточно, нужно создать еще и приложение на самом сайте.
Код
Для удобства, входными данными будут ссылки на альбомы. Только целиком url не подойдет, нам понадобится id хозяина альбома (группы или человека) и id самого альбома, которые и можно достать из ссылки. К примеру, в https://vk.com/album-54530371_212428070 id владельца (в данном случае сообщества) это -54530371, а id альбома – 212428070. Обратите внимание, если загружать из альбома сообщества, то "-" (дефис) перед id владельца обязателен.
url = input("Введите url альбома: ") # Разбираем ссылку album_id = url.split('/')[-1].split('_')[1] owner_id = url.split('/')[-1].split('_')[0].replace('album', '')
Как вы поняли, мы получаем на вход ссылку на альбом, затем разбираем ее и раскладываем по переменным album_id и owner_id соответствующие id.
Теперь нужно получить количество фото, а также инициализировать переменные для статитстики.
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() # время старта
Проблема при загрузке большого количества фото в том, что за один запрос нельзя забрать больше 1000 фото, в то время как в альбоме их может быть десяток тысяч.
Процесс загрузки:
# Создадим каталоги if not os.path.exists('saved'): os.mkdir('saved') photo_folder = 'saved/album{0}_{1}'.format(owner_id, album_id) if not os.path.exists(photo_folder): os.mkdir(photo_folder) for j in range(math.ceil(photos_count / 1000)): # Подсчитаем сколько раз нужно получать список фото, так как число получится не целое - округляем в большую сторону photos = vkapi.photos.get(owner_id=owner_id, album_id=album_id, count=1000, offset=j*1000) # Получаем список фото for photo in photos: counter += 1 url = photo[‘src_big’] # Получаем адрес изображения print('Загружаю фото № {} из {}. Прогресс: {} %'.format(counter, photos_count, prog)) prog = round(100/photos_count*counter,2) try: urlretrieve(url, photo_folder + "/" + os.path.split(url)[1]) # Загружаем и сохраняем файл except Exception: print('Произошла ошибка, файл пропущен.') breaked += 1 continue
И немного статитстики:
time_for_dw = time.time() - time_now print("\nВ очереди было {} файлов. Из них удачно загружено {} файлов, {} не удалось загрузить. Затрачено времени: {} сек.". format(photos_count, photos_count-breaked, breaked, round(time_for_dw,1)))
На этом все! В следующем туториале напишем небольшой скрипт для слежки за пользователем.