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

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

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

Говоришь поставщику: присылайте ссылку на папку. Открываешь ссылку ядиска, нажимаешь «скачать всё», содержимое папки скачивается как зип-архив. Распаковываешь. Всё.

Ресайз картинок при необходимости лучше делать скриптом в Фотошопе или в бесплатном FastStone Image viewer, чтобы не угандошить качество.

Переименования с заменой символов и прочими пирогами через Тотал коммандер.

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

Переименование умеет делать и fastStone.

Но если прям крутая прога то advancedRenamer.

А если кому нужен парсинг без знания языков, то content downloader оч мощная прога

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

+ content downloader это для промышленных маштабов) Правда немного платная.

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

Я имел в виду переименование с плясками - по маске там и прочие извраты, faststone в этом плане подеревяннее, хотя базовые функции переименования у него развиты неплохо

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

>скачивается как зип-архив. Распаковываешь. Всё.

не всё )


при попытке скачивания больших объёмов (или каких-то популярных файлов), может выдаться такая ошибка :)

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

Всё на самом деле проще - если ругается на "Превышен лимит..." - просто сохраняете на свой\жены\соседа яд и сливаете (о чём, собственно, и говорится на вашем скрине).

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

на таких больших файлах не пробывал) надо глянуть))

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

если вдруг придумаешь как автоматически сохранить в "загрузки" расшаренную папку маякни пожалуйста )

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

окей. есть пример такой папки?

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

я про яндексдисковскую папку)


дано: ссылка на яд https://disk.yandex.ru/d/xNBn7lE1_Y5knQ

задача: сделать замену кнопки "сохранить на яндекс диск"


т.е. скормил ссыль скрипту, а оно тебе в папке "Загрузки" на ЯндексДиске сохраняет содержимое по ссылке

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

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

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

угу. полный аналог кнопки "сохранить на яндекс диск" в браузерной версии )

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

такая возможность есть, но это сложнее в реализации. Попробую разобраться с этим.

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

я первым делом глянул в документации ( https://yandex.ru/dev/disk/api/reference/public.html ) на

https://cloud-api.yandex.net/v1/disk/resources/download , но оно по какой-то причине работает не так как заявлено (ну или не так, как я ожидал)


судя по мануалу, у запроса есть один обязательный параметр public_key и 2 необязательных — path и name, но при этом выдаётся ошибка об отсутствии обязательного параметра path(хотя он должен быть необязательным).


можно конечно скачать всё в zip с помощью

https://cloud-api.yandex.net/v1/disk/public/resources/downlo... или заколхозить пофайловый обход всей шары, но я посчитал это нерациональным и в качестве временного решения выдал доступ к яндексдиску специальному человеку и возложил на него обязанности сохранения требуемых публичных ссылок:)
раскрыть ветку (2)
0
Автор поста оценил этот комментарий

Не туда запрос отправляешь. Ты отравляешь запрос на тот диск у которого у тебя есть доступ. Для публичных файлов и папок нужно отправлять запрос на https://cloud-api.yandex.net/v1/disk/public/resources?public.... В таком случае мы получаем в ответе все нужные данные, в том числе вложенные в папку файлы и можно получить ссылку для скачивания к ним. В скрине приложил, пример ответа, который у тебя должен получится. Так что, можно разобраться) и освободить человека от рутины)

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

Не все поставщики такие отзывчивые) Зная python можно написать софт под себя и для себя)

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

Тогда еще проще: включаешь синхронизацию ядиска на компе и в облаке. На присланных ссылках нажимаешь «сохранить на яндекс-диск». Все летит на диск и на комп.

А «зная python» - так надо его знать. А когда напишешь под себя - это хреново передается другим. В общем, намеренно обхожусь без уникальных решений, чтобы их могли применять любые другие субподрядчики.

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

согласен) Век живи - век учись!

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

Я думаю за часик заставил бы чат гпт написать тебе скрипт на питоне)

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

Я тоже любитель автоматизации и любитель питона, но часто такое бывает что одноразовые скрипты под себя писать дольше, чем возиться ручками.

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

Я окупаемость проверяю просто:


Надо обработать до 50 объектов (картинок, pdf, csv etc) разово?

- да: ну ок, сделаю ручками, угроблю 1-2 часа

- нет, объектов больше или это теперь будет периодически прилетать: нихера, потрачу 2-4 часа один раз, чтобы потом в три клика всю эту кучу мусора переваривать за минуту.


Причем решение не привязано к определенному ЯП - что удобнее или уместнее, то и будет использовано.

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

он вообще не одноразовый, уже пользовался не раз)

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

Темы

Политика

Теги

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

Сообщества

18+

Теги

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

Сообщества

Игры

Теги

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

Сообщества

Юмор

Теги

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

Сообщества

Отношения

Теги

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

Сообщества

Здоровье

Теги

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

Сообщества

Путешествия

Теги

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

Сообщества

Спорт

Теги

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

Сообщества

Хобби

Теги

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

Сообщества

Сервис

Теги

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

Сообщества

Природа

Теги

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

Сообщества

Бизнес

Теги

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

Сообщества

Транспорт

Теги

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

Сообщества

Общение

Теги

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

Сообщества

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

Теги

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

Сообщества

Наука

Теги

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

Сообщества

IT

Теги

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

Сообщества

Животные

Теги

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

Сообщества

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

Теги

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

Сообщества

Экономика

Теги

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

Сообщества

Кулинария

Теги

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

Сообщества

История

Теги

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

Сообщества

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

Теги

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

Сообщества