Herunterladen von Dateien mit Python

Blog

Außerdem erfahren Sie, wie Sie viele Herausforderungen meistern können, denen Sie begegnen können, z. B. das Herunterladen von Dateien mit Umleitung, das Herunterladen großer Dateien, Multithread-Downloads und andere Taktiken.



Anfragen verwenden

Sie können mit dem Request-Modul Dateien von einer URL herunterladen.






Betrachten Sie den folgenden Code:



import requests url = 'https://www.python.org/static/img/python-logo@2x.png'>



Not pretty? Don’t worry, we will show a progress bar for the downloading process later.






Download multiple files (Parallel/bulk download)

To download multiple files at a time, import the following modules:

import os import requests from time import time from multiprocessing.pool import ThreadPool 

Wir haben die Betriebssystem- und Zeitmodule importiert, um zu überprüfen, wie lange es dauert, Dateien herunterzuladen. Mit dem Modul ThreadPool können Sie mehrere Threads oder Prozesse ausführen, die den Pool verwenden.

Lassen Sie uns eine einfache Funktion erstellen, die die Antwort in Blöcken an eine Datei sendet:

def url_response(url): path, url = url r = requests.get(url, stream = True) with open(path, 'wb') as f: for ch in r: f.write(ch)

Die URLs ist ein zweidimensionales Array, das den Pfad und die URL einer Seite angibt, die Sie herunterladen möchten.

urls = [('Event1', 'https://www.python.org/events/python-events/805/'), ('Event2', 'https://www.python.org/events/python-events/801/'), ('Event3', 'https://www.python.org/events/python-events/790/'), ('Event4', 'https://www.python.org/events/python-events/798/'), ('Event5', 'https://www.python.org/events/python-events/807/'), ('Event6', 'https://www.python.org/events/python-events/807/'), ('Event7', 'https://www.python.org/events/python-events/757/'), ('Event8', 'https://www.python.org/events/python-user-group/816/')]

Übergeben Sie die URL an request.get, wie wir es im vorherigen Abschnitt getan haben. Öffnen Sie abschließend die Datei (Pfad in der URL angegeben) und schreiben Sie den Inhalt der Seite.

Jetzt können wir diese Funktion für jede URL separat aufrufen und wir können diese Funktion auch für alle URLs gleichzeitig aufrufen. Machen wir es für jede URL separat in einer for-Schleife und beachten Sie den Timer:

start = time() for x in urls: url_response (x) print(f'Time to download: {time() - start}')

Das Ergebnis wird so aussehen:

Ersetzen Sie nun die for-Schleife durch die folgende Codezeile:

ThreadPool(9).imap_unordered(url_response, urls)

Führen Sie das Skript aus:

Download mit Fortschrittsbalken

Der Fortschrittsbalken ist ein UI-Widget des Clint-Moduls. Geben Sie den folgenden Befehl ein, um das Clint-Modul zu installieren:

pip install clint

Betrachten Sie den folgenden Code:

import requests from clint.textui import progress url = 'http://do1.dr-chuck.com/pythonlearn/EN_us/pythonlearn.pdf' r = requests.get(url, stream=True) with open('LearnPython.pdf', 'wb') as Pypdf: total_length = int(r.headers.get('content-length')) for ch in progress.bar(r.iter_content(chunk_size = 2391975), expected_size=(total_length/1024) + 1): if ch: Pypdf.write(ch)

In diesem Code haben wir das Request-Modul importiert und dann aus clint.textui das Fortschritts-Widget importiert. Der einzige Unterschied liegt in der for-Schleife. Wir haben die Balkenmethode des Fortschrittsmoduls verwendet, während wir den Inhalt in die Datei geschrieben haben. Die Ausgabe sieht wie folgt aus:

Laden Sie eine Webseite mit urllib herunter

In diesem Abschnitt werden wir eine Webseite mit der URL herunterladen.

Die urllib-Bibliothek ist eine Standardbibliothek von Python, sodass Sie sie nicht installieren müssen.

Mit der folgenden Codezeile kann eine Webseite einfach heruntergeladen werden:

urllib.request.urlretrieve('url', 'path')

Geben Sie hier die URL an, unter der Sie speichern möchten und wo Sie sie speichern möchten:

urllib.request.urlretrieve('https://www.python.org/','c:/users/LikeGeeks/documents/PythonOrganization.html')

In diesem Code haben wir die Methode urlretrieve verwendet und die URL einer Datei zusammen mit dem Pfad übergeben, in dem wir die Datei speichern. Die Dateierweiterung wird .html sein.

Über Proxy herunterladen

Wenn Sie zum Herunterladen Ihrer Dateien einen Proxy verwenden müssen, können Sie den ProxyHandler des URL-Moduls verwenden. Überprüfen Sie den folgenden Code:

import urllib.request >>> myProxy = urllib.request.ProxyHandler({'http': '127.0.0.2'}) >>> openProxy = urllib.request.build_opener(myProxy) >>> urllib.request.urlretrieve('https://www.python.org/')

In diesem Code haben wir das Proxy-Objekt erstellt und den Proxy geöffnet, indem wir die build_opener-Methode von urllib aufgerufen und das Proxy-Objekt übergeben haben. Dann haben wir die Anfrage gestellt, die Seite abzurufen.

Wie man Krypto-Kunst kauft

Sie können auch das Anforderungsmodul verwenden, wie in der offiziellen Dokumentation dokumentiert:

import requests myProxy = { 'http': 'http://127.0.0.2:3001' } requests.get('https://www.python.org/', proxies=myProxy)

Importieren Sie einfach das Request-Modul und erstellen Sie Ihr Proxy-Objekt. Dann können Sie die Datei abrufen.

Verwenden von urllib3

Die urllib3 ist eine verbesserte Version des urllib-Moduls. Sie können es mit pip herunterladen und installieren:

pip install urllib3

Wir holen eine Webseite und speichern sie in einer Textdatei mit urllib3.

Importieren Sie die folgenden Module:

import urllib3, shutil

Das Shutil-Modul wird beim Arbeiten mit Dateien verwendet.

Initialisieren Sie nun die URL-String-Variable wie folgt:

url = 'https://www.python.org/'

Dann verwenden wir den PoolManager von urllib3, der die notwendigen Verbindungspools verfolgt.

c = urllib3.PoolManager()

Erstellen Sie eine Datei:

filename = 'test.txt'

Schließlich senden wir eine GET-Anfrage, um die URL abzurufen, eine Datei zu öffnen und die Antwort in diese Datei zu schreiben:

with c.request('GET', url, preload_content=False) as res, open(filename, 'wb') as out_file: shutil.copyfileobj(res, out_file)

Von Google-Laufwerk herunterladen

Sie können googledrivedownloader verwenden, um jede Datei von Google Drive herunterzuladen. Um es zu installieren, verwenden Sie den folgenden Befehl:

pip install googledrivedownloader

Sehen Sie sich den folgenden Code an:

from google_drive_downloader import GoogleDriveDownloader as gd gd.download_file_from_google_drive(file_id='0B7XV2PwnZyfNalJ6cFd6dXBrckE', dest_path='./data/2ndHalfJava.zip', unzip=True)

Hier haben wir die Datei-ID der Google Drive-Datei zusammen mit dem Zielpfad übergeben, in dem wir die Datei speichern. Dann haben wir den unzip-Parameter. Bei True wird die heruntergeladene Datei in denselben Zielordner entpackt.

In diesem Beispiel laden wir den Zip-Ordner herunter, dann wird der Ordner entpackt.

Datei von S3 mit boto3 herunterladen

Um Dateien von Amazon S3 herunterzuladen, können Sie das Python-Boto3-Modul verwenden.

Bevor Sie beginnen, müssen Sie das awscli-Modul mit pip installieren:

pip install awscli

Führen Sie für die AWS-Konfiguration den folgenden Befehl aus:

aws configure

Geben Sie nun Ihre Daten ein als:

AWS Access Key ID [None]: (The access key) AWS Secret Access Key [None]: (Secret access key) Default region name [None]: (Region) Default output format [None]: (Json)

Um eine Datei von Amazon S3 herunterzuladen, importieren Sie boto3 und botocore. Boto3 ist ein Amazon SDK für Python für den Zugriff auf Amazon-Webdienste wie S3. Botocore stellt die Befehlszeilendienste für die Interaktion mit Amazon-Webdiensten bereit.

Botocore wird mit awscli geliefert. Um boto3 zu installieren, führen Sie Folgendes aus:

pip install boto3

Importieren Sie nun diese beiden Module:

import boto3, botocore

Beim Herunterladen von Dateien von Amazon benötigen wir drei Parameter:

  1. Der Name von Bucket
  2. Der Name der Datei, die Sie herunterladen müssen
  3. Der Name der Datei nach dem Download

Initialisieren Sie die Variablen:

wo kann man nlc2 kaufen
bucket = 'bucketName' file_name = 'filename' downloaded_file = 'downloadedfilename'

Initialisieren Sie nun eine Variable, um die Ressource einer Sitzung zu verwenden. Dazu rufen wir die Methode resource() von boto3 auf und übergeben den Dienst s3:

service = boto3.resource(‘s3’)

Laden Sie schließlich die Datei mit der Methode download_file herunter und übergeben Sie die Variablen:

service.Bucket(bucket).download_file(file_name, downloaded_file)

Videos von Youtube herunterladen

Um Videos von YouTube herunterzuladen, können Sie das Pytube-Modul verwenden.

Installieren Sie zuerst das Pytube-Modul mit pip als:

pip install pytube

Importieren Sie nun pytube:

import pytube

Übergeben Sie dann die Video-URL, die Sie herunterladen müssen:

yt = pytube.YouTube('https://www.youtube.com/watch?v=himEMfYQJ1w')

In den obigen Codezeilen haben wir die URL übergeben. Dann gibt es Streams (Liste der Formate), die das Video hat. Zum Beispiel:

streams = yt.streams.all() for x in streams: print(x)

Dadurch werden alle Formate zusammen mit der Videoauflösung wie folgt gedruckt:

Die Methode first() greift das erste Format und die Methode download() lädt das Video herunter.

Wenn Sie Informationen zu einem Video abrufen möchten, beispielsweise den Titel, verwenden Sie .title wie folgt:

>>> video = YouTube('https://www.youtube.com/watch?v=himEMfYQJ1w') >>> video.title 'Linux Environment Variables'

Verwenden von asyncio

Das asyncio-Modul konzentriert sich auf die Behandlung von Systemereignissen. Es umgeht eine Ereignisschleife, die auf das Eintreten eines Ereignisses wartet und dann auf dieses Ereignis reagiert. Die Reaktion kann das Aufrufen einer anderen Funktion sein. Dieser Vorgang wird als gleichmäßiges Handling bezeichnet. Das asyncio-Modul verwendet Coroutinen für die Ereignisbehandlung.

Um die asyncio-Ereignisbehandlung und die Coroutine-Funktionalität zu verwenden, importieren wir das asyncio-Modul:

import asyncio

Außerdem müssen wir das aiohttp-Modul installieren.

pip install aiohttp

Wir werden das Modul async_timeout importieren, um Zeitüberschreitungen zu behandeln.

import async_timeout

Das Schlüsselwort async gibt an, dass dies eine native asyncio-Coroutine ist. Im Rumpf der Coroutine befindet sich das Schlüsselwort await, das einen bestimmten Wert zurückgibt. Das Schlüsselwort return kann ebenfalls verwendet werden.

Lassen Sie uns nun einen Code mit einer Coroutine erstellen, um Dateien aus dem Web herunterzuladen:

import asyncio import uuid import aiohttp import async_timeout async def get_url(url, session): file_name = str(uuid.uuid4()) async with async_timeout.timeout(120): async with session.get(url) as response: with open(file_name, 'wb') as fd: async for data in response.content.iter_chunked(1024): fd.write(data) return 'Successfully downloaded ' + file_name async def main(urls): async with aiohttp.ClientSession() as session: tasks = [get_url(url, session) for url in urls] return await asyncio.gather(*tasks) urls = ['https://www.python.org/events/python-events/801/', 'https://www.python.org/events/python-events/790/', 'https://www.python.org/events/python-user-group/816/', 'https://www.python.org/events/python-events/757/'] loop = asyncio.get_event_loop() results = loop.run_until_complete(main(urls)) print(' '.join(results))

In diesem Code haben wir eine asynchrone Coroutine-Funktion erstellt, die unsere Dateien in Blöcken herunterlädt und sie unter einem zufälligen Dateinamen speichert und eine Nachricht zurückgibt.

Dann haben wir eine andere asynchrone Coroutine, die get_url aufruft und auf die URLs wartet und eine Warteschlange aller URLs erstellt.

Um nun die Coroutine zu starten, müssen wir die Coroutine mit der Methode get_event_loop() von asyncio in die Ereignisschleife einfügen und schließlich die Ereignisschleife mit der Methode run_until_complete() von asyncio ausführen.

Sammeln Sie Manager für Rost

Das Herunterladen von Dateien mit Python macht Spaß. Ich hoffe, Sie finden das Tutorial nützlich.

Literatur-Empfehlungen

☞ Extrahieren von Daten aus verschiedenen Blättern mit Python

☞ Anleitung zu R und Python in einem einzigen Jupyter-Notebook

☞ Erste Schritte mit RabbitMQ: Python

Richten Sie Datei-Uploads auf S3 über Django in 10 Minuten ein

☞ Nur-Positionsargumente in Python

Posten Sie mehrteilige Formulardaten in Python mit Anfragen: Beispiel für das Hochladen einer Flask-Datei

☞ Holen Sie sich modular mit Python-Funktionen

☞ Sechs Python-Tipps für Anfänger

#Python

likegeeks.com

Herunterladen von Dateien mit Python

In diesem Tutorial erfahren Sie, wie Sie mit verschiedenen Python-Modulen Dateien aus dem Web herunterladen. Sie werden reguläre Dateien, Webseiten, YouTube-Videos, Google Drive-Dateien, Amazon S3 und andere Quellen herunterladen