393

Парсим яндекс диск при помощи Python

В данный момент я работаю контент-менеджером в "крупном" интернет - магазине. В моём случае, это больше 100 000 позиций.

Иногда приходится сталкиваться с такой проблемой: поставщик присылает фотографии со ссылками на яндекс диск. Это крайне неудобно, потому что приходится ходить по каждой ссылке и скачивать изображение к себе, а затем уже загружать на сервер и т.д.

Готового решения я не нашел и решил написать свою реализацию работы с яндекс диском. Хорошо, что я знаю python.

У меня было 2 версии программы:

  1. когда по ссылке находится папка с картинками, python скачивает эту папку как зип файл, затем распаковывает. Все манипуляции записываются в csv файл, путь до файла с картинками

  2. когда по ссылке идёт только одна картинка, в данном случаи все немного проще, не нужны лишние действия с распаковкой картинок

p.s. ещё были 2 побочные небольшие программки: 1-я для уменьшения размера картинки, 2-я для переименования картинок (менялся пробел на дефис)

Приступим к реализации

  1. скачать и установить python c официального сайта https://www.python.org/downloads

  2. открыть любимый редактор кода (я использую vscode) https://code.visualstudio.com

  3. подключить следующие стандартные библиотеки: urllib.parse, csv, os, zipfile. Установить библиотеку requests https://pypi.org/project/requests/ (для отправки запроса на сервер)

  4. для полного фен-шуя можно использовать виртуальное окружение, дабы не засорять систему ненужными пакетами. Подробнее о virtualenv можно ознакомится по ссылке https://docs.python.org/3/tutorial/venv.html или же использовать poetry.

Ссылки на яндекс диск имеют вид: https://disk.yandex.ru/d/xNBn7lE1_Y5knQ. Чтобы их можно было скачать, они должны быть публичными.

Обратимся к API яндекс. После ключа public_key="вставляем_ссылку_на_файл"

https://cloud-api.yandex.net/v1/disk/public/resources/downlo...https://disk.yandex.ru/d/xNBn7lE1_Y5knQ

В ответе мы получаем json, из которого нам нужно получить значение по ключу href. Полученное значение и будет нашей прямой ссылкой к файлу.

Пожалуй, на этом хватит теории, теперь, постараюсь внятно объяснить, как всё это можно применить в контексте python.

# создаем новый файл и подключаем нужные нам библиотеки

import requests

from urllib.parse import urlencode

import csv

import os

import zipfile

Для начало создадим функцию, которая будет возвращать нам ссылку для скачивания:

final_url = base_url + urlencode(dict(public_key=public_link))

response = requests.get(final_url)

parse_href = response.json()['href']

return parse_href

Файлы могут быть в разных форматах: ссылки могут быть на одну или несколько картинок. В первом случае можно напрямую скачивать картинку по ссылке. Во втором, если по ссылке несколько картинок, то при скачивании мы получаем архив, который требует дополнительных действий (распаковку).

resources = "https://cloud-api.yandex.net/v1/disk/public/resources?"

requests_url = resources + urlencode(dict(public_key=public_link))

r =  requests.get(requests_url)

type_file = r.json()['type']

return type_file

Далее, мы скачиваем файлы и в зависимости от его типа выполняем действия: просто записываем в результирующий файл или же переходим к его распаковке с последующей записью.

В итоге, мы получаем файл result_data.csv со ссылками на фотографии на нашем жестком диске:

В добавок, у нас на жёстком диске появляется папка со скаченными картинками в папке download_files.

Полностью посмотреть код можно в репозитории на гитхаб.

p.s. Официальная документация по API Яндекс. Диска

Братишка с пикабу подсказал готовую библиотеку на питоне. Спасибо b4ro тык.

p.s.s. Немного поразмышляв, я подумал, что неплохо было бы написать, тесты. Пройтись линтером по коду. Добавить функцию переименования файлов. Может быть что-нибудь ещё?)

Спасибо за прочтение! Комментарии, лайки, дизлайки, предложения, пожелания крайне приветствуются.

Вы смотрите срез комментариев. Показать все
0
Автор поста оценил этот комментарий

Сохранил, может понадобиться. Автор, нет ли готового решения, как наоборот закачать на Яндекс диск с помощью питона?

раскрыть ветку (10)
1
Автор поста оценил этот комментарий

Посмотри на Ютубе канал Python today(не реклама!). Там много всего про парсинг и автоматизацию.

раскрыть ветку (4)
0
Автор поста оценил этот комментарий

Подписан. Там такого нет. Но спасибо за ответ.

раскрыть ветку (2)
0
Автор поста оценил этот комментарий

Посмотри внимательнее,там есть видос где про автоматизацию действий на веб странице, не помню уже точно название. Он там в общих чертах объясняет как что работает. Если в питоне шаришь,то я думаю сможешь код дополнить и модернизировать,чтобы он файлы загружал.) 

Я сам прост ботов пишу и парсингом не занимаюсь, поэтому и не запоминал что там и где,а так бы в закладки утащил. Но есть у него там примерное объяснение куда копать.

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Да, благодарю.

0
Автор поста оценил этот комментарий

сам на него подписан. Смотрю его видосы) крутой чел)

0
DELETED
Автор поста оценил этот комментарий

У яндекс диск есть API #comment_274726825

Вообще у всего ищи, есть ли API.

Я вот сацт один парсю, ибо него нету API плюс ещё приходится подменять user-agent и ставить случайное время задержки между запросами, что бы сайт (сервер) не начинал меня блочить

0
Автор поста оценил этот комментарий

есть, сейчас как раз разбираюсь с этим, там немного сложнее, но такая возможность есть) Если всё получится, то покажу и расскажу как это сделать.

раскрыть ветку (3)
0
Автор поста оценил этот комментарий

Спасибо! Буду ждать.

Кстати, а если просто закачивать файлы в виртуальную расшаренную папку Яндекса, это будет работать? Первое, что приходит в голову.. Но так вероятно нельзя сделать на Линуксе, а мне именно это надо.

раскрыть ветку (2)
0
Автор поста оценил этот комментарий

Для линукса можно сделать по другому. Как я это вижу. Например, создать папку в линуксе написать обработку для этой папки. Чтобы каждый час сканировал эту папку на наличие файлов и если они есть, отправлять их на яндекс диск. По окончанию загрузки файлы из папки удаляем. Профит!

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Погуглил - для Линуса есть даже консольный клиент. Так что все возможно )

Вы смотрите срез комментариев. Чтобы написать комментарий, перейдите к общему списку

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества

Недвижимость и ремонт

Теги

Популярные авторы

Сообщества