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)))

На этом все! В следующем туториале напишем небольшой скрипт для слежки за пользователем.

Комментарии

ВАКАНСИИ

Добавить вакансию
Разработчик C++
Москва, по итогам собеседования

ЛУЧШИЕ СТАТЬИ ПО ТЕМЕ