Пишем программу для скачивания файлов на Python с использованием requests

в 16:18, , рубрики: Песочница, метки: , , , , , , , , ,

Недавно захотел написать программу для изучения библиотеки для Python — requests. Мой выбор пал на написание программы для скачивания файлов.

Поскольку мы будем использовать библиотеку requests, импортируем её (+shutil):

import requests, shutil

Код «меню» (это заключено в while True для возможности выхода break'ом и работы программы много раз без перезапуска):

menu = input("Ready.n")
if menu == "get": #режим загрузки
     #...
if menu == "about": #о программе
     #...
if menu == "exit": #выход
     #...

В get'е спрашиваем путь к файлу: (причём отдельно директорию и имя файла, зачем это нужно — скажу позже):

dirfile = input("Enter path to the directory with file(no "www." !):")
file = input("Enter the name of the file:")

А для requests ведь нужен полный путь! Не беда, склеим dirfile и file:

fullpath = dirfile + file

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

reqauthstr = input("Do you need authentification?[y/n]:")
        while True:
            if reqauthstr == "y" or reqauthstr == "Y":
                reqauth = True
                break
            elif reqauthstr == "n" or reqauthstr == "N":
                reqauth = False
                break
            else:
                print("Incorrect command.")

Если нужно входить, тогда напишем запрос с аутентификацией. Спрашиваем логин и пароль:

if reqauth == True:
            user = input("Login:")
            passw = input("Password:")

Создаём сам get-запрос:

filereq = requests.get(fullpath,stream = True,auth=(user,passw))

И копируем файл (как раз, разделение пригодилось в open`e):

with open(file,"wb") as receive:
                shutil.copyfileobj(filereq.raw,receive)
            del filereq

Без аутентификации — практически тоже самое:

elif reqauth == False:
            filereq = requests.get(fullpath,stream = True)
            with open(file,"wb") as receive:
                shutil.copyfileobj(filereq.raw,receive)
            del filereq

Ну вот, закачку реализовали.

Остальные пункты меню:

if menu == "exit":
        break
    if menu == "about":
        print("""
nxfetch - v0.1.0
Library: requests - v2.6.0
Author: Fedor Sturovn
""")
    else:
        print("Incorrect command.n")

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js