A Atsisiuntimų tvarkyklė iš esmės yra kompiuterinė programa, skirta atsisiųsti atskirus failus iš interneto. Čia mes sukursime paprastą atsisiuntimų tvarkyklę naudodami Python gijas. Naudojant kelių gijų failą vienu metu galima atsisiųsti gabalais iš skirtingų gijų. Norėdami tai įgyvendinti, sukursime paprastą komandinės eilutės įrankį, kuris priima failo URL ir tada jį atsisiunčia.
Būtinos sąlygos: Windows mašina su įdiegta Python.
Sąranka
Atsisiųskite toliau nurodytus paketus iš komandinės eilutės.
1. „Click“ paketas: „Click“ yra „Python“ paketas, skirtas sukurti gražias komandų eilutės sąsajas su kuo mažiau kodo. Tai komandų eilutės sąsajos kūrimo rinkinys.
pip diegimo paspaudimas
2. Užklausų paketas: naudodami šį įrankį atsisiųsime failą pagal URL (HTTP adresus). Užklausos yra HTTP biblioteka, parašyta Python, leidžianti siųsti HTTP užklausas. Galite pridėti antraštes į kelių dalių duomenų failus ir parametrus naudodami paprastus Python žodynus ir pasiekti atsakymų duomenis tokiu pačiu būdu.
pip diegimo užklausos
3. Sriegimo paketas: Norėdami dirbti su siūlais, mums reikia sriegimo paketo.
pip install sriegimas
Įgyvendinimas
modifikuoti failą linux
Pastaba:
Programa buvo padalinta į dalis, kad būtų lengviau ją suprasti. Įsitikinkite, kad vykdydami programą nepraleidžiate jokios kodo dalies.
1 veiksmas: importuokite reikiamus paketus
Šiuose paketuose yra būtinų įrankių, kad žiniatinklio užklausos tvarkytų komandų eilutės įvestis ir sukurtų gijas.
Pythonimport click import requests import threading
2 veiksmas: sukurkite tvarkyklės funkciją
Kiekviena gija vykdys šią funkciją, kad atsisiųstų tam tikrą failo dalį. Ši funkcija yra atsakinga už tik tam tikro baitų diapazono užklausą ir jų įrašymą į teisingą failo vietą.
Pythondef Handler(start end url filename): headers = {'Range': f'bytes={start}-{end}'} r = requests.get(url headers=headers stream=True) with open(filename 'r+b') as fp: fp.seek(start) fp.write(r.content)
3 veiksmas: spustelėdami nustatykite pagrindinę funkciją
Paverčia funkciją komandinės eilutės įrankiu. Tai apibrėžia, kaip vartotojai sąveikauja su scenarijumi iš komandinės eilutės.
Python#Note: This code will not work on online IDE @click.command(help='Downloads the specified file with given name using multi-threading') @click.option('--number_of_threads' default=4 help='Number of threads to use') @click.option('--name' type=click.Path() help='Name to save the file as (with extension)') @click.argument('url_of_file' type=str) def download_file(url_of_file name number_of_threads):
4 veiksmas: nustatykite failo pavadinimą ir nustatykite failo dydį
Mums reikia failo dydžio, kad galėtume padalyti atsisiuntimą tarp gijų ir užtikrinti, kad serveris palaikytų įvairius atsisiuntimus.
Python r = requests.head(url_of_file) file_name = name if name else url_of_file.split('/')[-1] try: file_size = int(r.headers['Content-Length']) except: print('Invalid URL or missing Content-Length header.') return
5 veiksmas: iš anksto paskirkite failo erdvę
Išankstinis paskirstymas užtikrina, kad failas yra tinkamo dydžio prieš įrašant gabalus į konkrečius baitų diapazonus.
Python part = file_size // number_of_threads with open(file_name 'wb') as fp: fp.write(b'