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, чтобы не угандошить качество.

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

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

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

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

забыл сказать открывал по апи)

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

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


import datetime


print('Hello world!')

print(datetime.datetime.now())


Наручные часы - прошлый век, смартфоны - пожирают мозг. Будь умнее! Используй скрипт!


Ну, убедил?

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

супер) питон можно даже в хроме установить как расширение. А точное время всегда нужно)

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

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

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

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

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

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

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

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

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

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

показать ответы
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... или заколхозить пофайловый обход всей шары, но я посчитал это нерациональным и в качестве временного решения выдал доступ к яндексдиску специальному человеку и возложил на него обязанности сохранения требуемых публичных ссылок:)
раскрыть ветку (1)
0
Автор поста оценил этот комментарий

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

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

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

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

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

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

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

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

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

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

охуенная "автоматизация"

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

какая есть, как по твоему это можно автоматизировать?

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

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

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

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

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

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

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

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

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

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

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

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


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

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


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

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

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

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

Странный магазин однако. Я в одной сети магазинов работал где 40к позиций, и они уже начали строить свой портал для поставщиков куда те сами всё закидывают, потому что задолбались корреспонденции по почте с экселями (да, они вставляют картинку в ячейку экселя). На 100к артеклей портал для поставщиков это просто маст хэв.

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

у нас интеграции настроены, есть некоторые поставщики у которых "прошлый век")

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

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

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

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

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

Норм вариант, правда есть уже готовые библиотеки например: https://yadisk.readthedocs.io/ru/latest/docs.html#yadisk.YaD...

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

оу, крутая библиотека может и загружать и выгружать) Спасибо большое, полезно!

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

Работа по апи != парсинг

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

учту)

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

100к позиций, в интернет магазине, а интеграции нету?

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

прикол, да) Честно говоря, много проблем с этим магазином.

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

С учетом того что КПД кода плавает возле нуля, то и нести не надо.

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

может покажешь свой код?) кинь ссылку на гитхаб

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

response = requests.get(final_url)

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

Так верстают только мудаки!

Где проверка на response.status_code == 200? Яндекс тебе пятисотнет в ответ и все, привет передавать скрипту?

А что, если json не передал яндекс? Где проверка на None, а лучше на dict?

Почему в словаре обращение не через get('href')?

Почему в try не завернуто?


Короче код-ревью не пройден, переделывай и принеси нормально!

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

я ещё только учусь)

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

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

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

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

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

да да, всё это так и работает... до тех пор, пока я.диск не запросит капчу

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

больше 100 ссылок норм открывал) капчу не просил)

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

Ну да, на гитхабе увидел нормальный код и успокоился). Просто в посте все летит к чертям, в гитхабе нормально.

ИМХО, лучше выложить код картинкой с нормальным форматированием, а если кто-то хочет скопировать, то есть ссылка на гитхаб.

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

тут отрывки кода так как нет нормального редактора. Скрины как вариант)

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

Вот именно "сбор и структурирование"! Например если твой скрипт будет ходить по страницами яндекс маркета и собирать инфу о товарах из  HTML и записывать например в файл или в бд. Помимо этого, не все горят желанием делиться данными с кем либо (даже открытые) и вставляют палки в колеса в виде капчи, блокировки частых запросов и т.д..

А тебе эти данные на блюдечке предоставляет тебе апишка в готовом виде, стоит лишь только авторизироваться. Чуешь разницу?

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

согласен, апи совсем другой уровень.

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

Раздели задачи между скриптами, ООП в помощь. Самый простой пример:
- Crawler : класс который только грузит страницы и отдает содержимое.
- интерфейс Parser: получает код страницы, собирает инфу, новые ссылки и делиться ими c App.

- App: класс-обертка, хранит два предыдущих объекта и списки новых ссылок и спарсеных ссылок (чтобы не бегать по одинаковым ссылкам несколько раз).


Далее пишешь 100500 реализаций интерфейса Parser, кидаешь по одному в App и запускаешь. При этом один из них может искать с помощью супа (beautiful soup), другой с помощью xpath, третий хоть регулярками.

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

пока не селён в ООП. хочу научиться, не подскажешь где лучше?

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

Угу, разве request не может сам резать ссылки?

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

хм, хороший вопрос. Надо глянуть)

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

Функции не объявлены, а я завис в начале из-за этого...

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

Можно поподробнее? Не совсем понял ... Код лучше на гитхабе смотреть.

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

конечно судить не берусь, но складывается ощущение, что проще было скормить список ссылок от клиента wget...

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

не проще.

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

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

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

так точно)

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

страшно спросить, а сколько сотен  ссылок вам приходит в день? и я не совсем понял, как вы ссылку в програмку вставляете? руками чтоль?

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

ссылки на яндекс диск нужно вставить в csv файл и указать путь к файлу)

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

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

не всё )


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

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

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

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

А чё там за девятка? Папку для скачки лучше сделать вторым позиционным аргументом, а её автоматическое создание по ключу или если не указана

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

здесь? filename = url[start_filename:end_name][9:] # это я так обрезал название для файла. Бородатый код получился. Согласен!

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

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


Я написал несколько десятков парсеров для разных сайтов, тоже на python, может кому интересно будет, вот пример парсера https://github.com/Nikovit/parser_site

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

если есть возможность спарсить - лучше спарсить. Тоже написал больше 10-ка парсеров. Все они очень похожи. Хотел сделать один универсальный - не вышло, видно знаний не хватает.

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

РЕКЛАМА ПИТОНА... а нахера? везде вижу про питон

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

Лёгок в изучении. Прост в использовании. Просто добавь мозги)

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

а в чем счастье скачать себе, дальше то куда все это?

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

да куда угодно, хоть на сервер)

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

А можно просто скачать прогу Яндекс.Диск

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

слишком просто)

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

Автор, а ты вообще знаешь, что такое "парсинг"? То что у тебя в посте называется "парсингом" оным не является

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

может быть и не парсинг)

Иллюстрация к комментарию
показать ответы

Темы

Политика

Теги

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

Сообщества

18+

Теги

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

Сообщества

Игры

Теги

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

Сообщества

Юмор

Теги

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

Сообщества

Отношения

Теги

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

Сообщества

Здоровье

Теги

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

Сообщества

Путешествия

Теги

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

Сообщества

Спорт

Теги

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

Сообщества

Хобби

Теги

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

Сообщества

Сервис

Теги

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

Сообщества

Природа

Теги

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

Сообщества

Бизнес

Теги

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

Сообщества

Транспорт

Теги

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

Сообщества

Общение

Теги

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

Сообщества

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

Теги

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

Сообщества

Наука

Теги

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

Сообщества

IT

Теги

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

Сообщества

Животные

Теги

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

Сообщества

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

Теги

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

Сообщества

Экономика

Теги

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

Сообщества

Кулинария

Теги

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

Сообщества

История

Теги

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

Сообщества

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

Теги

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

Сообщества