Работа мечты в один клик 💼

💭Мечтаешь работать в Сбере, но не хочешь проходить десять кругов HR-собеседований? Теперь это проще, чем когда-либо!
💡AI-интервью за 15 минут – и ты уже на шаг ближе к своей новой работе.
Как получить оффер?
📌 Зарегистрируйся
📌 Пройди AI-интервью
📌 Получи обратную связь сразу же!
HR больше не тянут время – рекрутеры свяжутся с тобой в течение двух дней! 🚀
Реклама. ПАО СБЕРБАНК, ИНН 7707083893. Erid 2VtzquscAwp
Этой статьей мы открываем небольшую серию материалов по 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)))
На этом все! В следующем туториале напишем небольшой скрипт для слежки за пользователем.
Комментарии
не работает
Подскажите – что именно. Мы постараемся поправить.
Ничего не работает. Статью обновите!
В 5 листинге при в объявлении переменной photos_count и в 6 листинге в photo[‘src_big’] кавычки вызывают ошибку. Нужно заменить на '. Также убрали бы неразрывный пробел из комментариев.