Граємося з VK API та Python, частина 1: завантажуємо всі фото з альбому

4 хв. читання

Добридень, пані та панове! Сьогодні я хочу розказати скільки всього цікавого можна зробити, якщо з'єднати VK та Python. В першому уроці цієї серії ми будемо завантажувати всі фото з альбому. Все, що вам для цього потрібно - це базові знання пітону.

Зміст

Для роботи ми будемо використовувати Python 3, а для викликів методів VK API — модуль vk. Встановити його можна через pip:


# Windows

pip3 install vk

# Debian-based linux

sudo pip3 install vk 

Та в мене вийшла проблема з інсталяцією через pip на лінуксі, тому я ще покажу як встановити з сирців. Завантажуємо його код, кидаємо в зручну для вас папку й виконуємо в терміналі


python3 setup.py build

sudo python3 setup.py install

Щось я забалакався, давайте вже писати код. Але перед тім одне уточнення: щоб не навантажувати статтю сторонніми бібліотеками, для завантаження фото ми будемо використовувати стандартну urllib.

Для початку треба залогінитись


# Імпортуємо потрібні модулі

from urllib.request import urlretrieve

import vk, os, time, math



# Ваш логін, пароль

login = ''

password = ''



# Авторизація

vkapi = vk.API('4567667', login, password)

Для роботи з VK API самого модуля для пітона недостатньо, потрібно створити додаток на самому сайті. Ви можете створити свій, або користуватися моїм. 4567667 це id мого додатка, якщо ви хочете використовувати свій — замініть це число. І не забудьте ввести ваш логін і пароль.

Для зручності використання на вхід будемо брати url альбому. Але для запитів url це не підійде. Нам потрібен id групи або людини, власника цього альбому та id самого альбому. Дістати їх можна з url. Наприклад, в vk.com/album-74257906_203873866 id власника (в даному випадку спільноти) це -74257906, а id альбому — 203873866. Зауважте, що якщо завантажувати з альбому спільноти, то - (мінус) перед id власника обов'язковий.


url = input("Введіть url альбому: ")

# Магія

album_id = url.split('/')[-1].split('_')[1]

owner_id = url.split('/')[-1].split('_')[0].replace('album', '')

Не зрозуміли, що сталося? Нічого, зараз я все розповім. Спочатку ми отримуємо url від користувача, потім витягуємо те, що нас цікавить. url.split('/')[-1] відділяє від адреси останню частину, тобто album-xxx_yyy, потім ми розділяємо цей рядок на дві частини — album-xxx та yyy. id альбому вже має потрібний вигляд, а от id власника — ні. Позбуваємося "album" за допомогою .replace('album', '').

Тепер потрібно отримати кількість фото. Також, ініціалізуємо змінні для статистики.


photos_count = vkapi.photos.getAlbums(owner_id=owner_id, album_ids=album_id)['items'][0]['size']



counter = 0 # поточний лічильник

prog = 0 # відсоток завантажених

breaked = 0 # не завантажено через помилку

time_now = time.time() # час старту

Справа в тому, що максимальна кількість фото, які можна отримати за один виклик — 1000, а в альбомі можу бути до 10 000 фото, тому завантажувати будемо за декілька разів. А тепер, власне, завантаження:


# Створимо необхідні папки

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['items']:

        counter += 1

        url = photo['photo_604'] # Отримуємо адресу зображення

        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("\
В черзі було {} файлів. З них вдало завантажено {} файлів, {} не вдалося завантажити. Затрачено часу: {} сек.". format(photos_count, photos_count-breaked, breaked, round(time_for_dw,1)))

На цьому у мене все. Подивитися повний код можна тут. В наступній статті ми трохи побудемо в ролі детектива і напишемо скрипт для стеження за користувачем vk.

Помітили помилку? Повідомте автору, для цього достатньо виділити текст з помилкою та натиснути Ctrl+Enter
Codeguida 5.6K
Приєднався: 8 місяців тому
Коментарі (0)

    Ще немає коментарів

Щоб залишити коментар необхідно авторизуватися.

Вхід / Реєстрація