Добридень, пані та панове! Сьогодні я хочу розказати скільки всього цікавого можна зробити, якщо з'єднати VK та Python. В першому уроці цієї серії ми будемо завантажувати всі фото з альбому. Все, що вам для цього потрібно - це базові знання пітону.
Зміст
-
Частина 1: завантажуємо всі фото з альбому
Для роботи ми будемо використовувати 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.
Ще немає коментарів