5 τρόποι λήψης αρχείων από διεύθυνση URL χρησιμοποιώντας Python

Θέλετε να κατεβάσετε αρχεία από μια διεύθυνση URL χρησιμοποιώντας Python; Ας μάθουμε τους διαφορετικούς τρόπους για να το κάνουμε.
Όταν εργάζεστε σε ένα έργο Python, μπορεί να χρειαστεί να κάνετε λήψη αρχείων από τον Ιστό—από μια συγκεκριμένη διεύθυνση URL.
Μπορείτε να τα κατεβάσετε χειροκίνητα στο περιβάλλον εργασίας σας. Ωστόσο, είναι πιο βολικό να κάνετε λήψη αρχείων από τις διευθύνσεις URL τους μέσω προγραμματισμού μέσα σε ένα σενάριο Python.
Σε αυτό το σεμινάριο, θα καλύψουμε τους διαφορετικούς τρόπους λήψης αρχείων από τον ιστό με την Python—χρησιμοποιώντας τόσο ενσωματωμένα πακέτα Python όσο και πακέτα τρίτων κατασκευαστών.
Πίνακας περιεχομένων
Πώς να χρησιμοποιήσετε την Python για τη λήψη αρχείων από τη διεύθυνση URL
Εάν είστε εξοικειωμένοι με την Python, θα είχατε συναντήσει αυτό το δημοφιλές κόμικ XKCD Python:
Python κόμικ | Πηγή: XKCD
Για παράδειγμα, θα προσπαθήσουμε να κατεβάσουμε αυτήν την εικόνα κόμικ XKCD (επέκταση .png) PNG στον κατάλογο εργασίας μας χρησιμοποιώντας διάφορες μεθόδους.
Καθ’ όλη τη διάρκεια του σεμιναρίου, θα εργαζόμαστε με πολλά πακέτα Python τρίτων. Εγκαταστήστε τα όλα σε ένα αποκλειστικό εικονικό περιβάλλον για το έργο σας.
Χρησιμοποιώντας το urllib.request
Μπορείτε να χρησιμοποιήσετε το ενσωματωμένο της Python urllib.αίτημα μονάδα για λήψη αρχείων από μια διεύθυνση URL. Αυτή η ενσωματωμένη μονάδα διαθέτει λειτουργικότητα για την υποβολή αιτημάτων HTTP και τη διαχείριση διευθύνσεων URL. Παρέχει έναν απλό τρόπο αλληλεπίδρασης με πόρους Ιστού, υποστηρίζοντας εργασίες όπως η ανάκτηση δεδομένων από ιστότοπους.
Ας κατεβάσουμε το κόμικ XKCD Python από τη διεύθυνση URL του χρησιμοποιώντας το urllib.request:
import urllib.request url="https://imgs.xkcd.com/comics/python.png" urllib.request.urlretrieve(url, 'xkcd_comic.png')
Εδώ κάνουμε τα εξής:
- Εισαγάγετε τη λειτουργική μονάδα urllib.request.
- Ορίστε τη διεύθυνση URL της εικόνας κόμικ XKCD Python.
- Χρησιμοποιήστε το urllib.request.urlretrieve για λήψη της εικόνας και αποθηκεύστε την ως ‘xkcd_comic.png’ στον τρέχοντα κατάλογο.
Εάν τώρα εκτελείτε την εντολή ls στο τερματικό για να προβάλετε τα περιεχόμενα του τρέχοντος καταλόγου, θα δείτε το αρχείο ‘xkcd_comic.png’:
Χρήση της βιβλιοθήκης αιτημάτων
ο Βιβλιοθήκη αιτημάτων είναι ένα δημοφιλές και ένα από τα πακέτα Python με τις περισσότερες λήψεις. Μπορείτε να στείλετε αιτήματα HTTP μέσω του ιστού και να ανακτήσετε περιεχόμενο.
Αρχικά, εγκαταστήστε τη βιβλιοθήκη αιτημάτων:
pip install requests
Εάν έχετε δημιουργήσει ένα νέο σενάριο Python στον ίδιο κατάλογο, διαγράψτε το ‘xkcd_comic.png’ πριν εκτελέσετε το τρέχον σενάριο.
import requests url="https://imgs.xkcd.com/comics/python.png" response = requests.get(url) with open('xkcd_comic.png', 'wb') as file: file.write(response.content)
Ας αναλύσουμε τι κάναμε σε αυτήν την προσέγγιση:
- Εισαγάγετε τη βιβλιοθήκη αιτημάτων.
- Ορίστε τη διεύθυνση URL της εικόνας κόμικ XKCD Python.
- Στείλτε ένα αίτημα GET στη διεύθυνση URL χρησιμοποιώντας το requests.get.
- Αποθηκεύστε το περιεχόμενο της απάντησης (τα δεδομένα εικόνας) ως ‘xkcd_comic.png’ σε λειτουργία δυαδικής εγγραφής.
Και θα πρέπει να δείτε την εικόνα που έχετε λάβει κατά την εκτύπωση των περιεχομένων του καταλόγου:
Χρησιμοποιώντας το urllib3
Είδαμε πώς να χρησιμοποιήσετε το ενσωματωμένο urllib.request. Αλλά μπορείτε επίσης να χρησιμοποιήσετε το πακέτο Python τρίτου κατασκευαστή urllib3.
Urllib3 είναι μια βιβλιοθήκη Python για την πραγματοποίηση αιτημάτων HTTP και τη διαχείριση των συνδέσεων με πιο αξιόπιστο και αποτελεσματικό τρόπο από την ενσωματωμένη μονάδα urllib. Παρέχει λειτουργίες όπως συγκέντρωση συνδέσεων, επαναλήψεις αιτημάτων και ασφάλεια νημάτων, καθιστώντας το μια ισχυρή επιλογή για το χειρισμό της επικοινωνίας HTTP σε εφαρμογές Python.
Εγκαταστήστε το urllib3 χρησιμοποιώντας pip:
pip install urllib3
Τώρα ας κατεβάσουμε το κόμικ XKCD Python χρησιμοποιώντας τη βιβλιοθήκη urllib:
import urllib3 # URL of the XKCD comic image url="https://imgs.xkcd.com/comics/python.png" # Create a PoolManager instance http = urllib3.PoolManager() # Send an HTTP GET request to the URL response = http.request('GET', url) # Retrieve the content (image data) image_data = response.data # Specify the file name to save the comic as file_name="xkcd_comic.png" # Save the image data with open(file_name, 'wb') as file: file.write(image_data)
Αυτή η προσέγγιση φαίνεται να εμπλέκεται περισσότερο από τις προηγούμενες προσεγγίσεις που χρησιμοποιούν το urllib.requests και τη βιβλιοθήκη αιτημάτων. Ας αναλύσουμε λοιπόν τα διάφορα βήματα:
- Ξεκινάμε εισάγοντας τη λειτουργική μονάδα urllib3, η οποία παρέχει λειτουργικότητα για την υποβολή αιτημάτων HTTP.
- Στη συνέχεια καθορίζουμε τη διεύθυνση URL της εικόνας κόμικ XKCD.
- Στη συνέχεια, δημιουργούμε μια παρουσία του urllib3.PoolManager(). Αυτό το αντικείμενο διαχειρίζεται το χώρο συγκέντρωσης συνδέσεων και μας επιτρέπει να κάνουμε αιτήματα HTTP.
- Στη συνέχεια χρησιμοποιούμε τη μέθοδο http.request(‘GET’, url) για να στείλουμε ένα αίτημα HTTP GET στην καθορισμένη διεύθυνση URL. Αυτό το αίτημα ανακτά το περιεχόμενο του κόμικ XKCD.
- Μόλις το αίτημα είναι επιτυχές, ανακτούμε το περιεχόμενο (δεδομένα εικόνας) από την απόκριση HTTP χρησιμοποιώντας το answer.data.
- Τέλος, γράφουμε τα δεδομένα εικόνας (που ανακτήθηκαν από την απάντηση) στο αρχείο.
Όταν εκτελείτε το σενάριο Python, θα πρέπει να λάβετε την ακόλουθη έξοδο:
Χρησιμοποιώντας το wget
ο wget βιβλιοθήκη Python απλοποιεί τις λήψεις αρχείων από διευθύνσεις URL. Μπορείτε να το χρησιμοποιήσετε για να ανακτήσετε πόρους Ιστού και είναι ιδιαίτερα βολικό για την αυτοματοποίηση των εργασιών λήψης.
Μπορείτε να εγκαταστήσετε τη βιβλιοθήκη wget χρησιμοποιώντας pip και στη συνέχεια να χρησιμοποιήσετε τις λειτουργίες της για λήψη αρχείων από διευθύνσεις URL:
pip install wget
Αυτό το απόσπασμα χρησιμοποιεί τη λειτουργική μονάδα wget για να κατεβάσει το κόμικ XKCD Python και να το αποθηκεύσει ως ‘xkcd_comic.png’ στον κατάλογο εργασίας:
import wget url="https://imgs.xkcd.com/comics/python.png" wget.download(url, 'xkcd_comic.png')
Εδώ:
- Εισάγουμε τη μονάδα wget.
- Ορίστε τη διεύθυνση URL της εικόνας κόμικ XKCD Python.
- Χρησιμοποιήστε το wget.download για λήψη της εικόνας και αποθηκεύστε την ως ‘xkcd_comic.png’ στον τρέχοντα κατάλογο.
Όταν κάνετε λήψη του κόμικ XKCD χρησιμοποιώντας το wget, θα πρέπει να δείτε μια παρόμοια έξοδο:
Χρησιμοποιώντας το PyCURL
Εάν έχετε χρησιμοποιήσει μηχανή Linux ή Mac, μπορεί να είστε εξοικειωμένοι με το εργαλείο γραμμής εντολών cURL για τη λήψη αρχείων από τον Ιστό.
PyCURL, μια διεπαφή Python για το libcurl, είναι ένα ισχυρό εργαλείο για την υποβολή αιτημάτων HTTP. Παρέχει λεπτομερή έλεγχο των αιτημάτων και μπορείτε να το χρησιμοποιήσετε για προηγμένες περιπτώσεις χρήσης κατά το χειρισμό πόρων ιστού.
Η εγκατάσταση του pycurl στο περιβάλλον εργασίας σας μπορεί να είναι περίπλοκη. Δοκιμάστε να εγκαταστήσετε χρησιμοποιώντας pip:
pip install pycurl
⚠️ Εάν λάβετε σφάλματα κατά τη διαδικασία, μπορείτε να ελέγξετε το Οδηγός εγκατάστασης PyCURL για συμβουλές αντιμετώπισης προβλημάτων.
Εναλλακτικά, εάν έχετε εγκαταστήσει το cURL, μπορείτε να εγκαταστήσετε τις δεσμεύσεις Python στο libcurl ως εξής:
sudo apt install python3-pycurl
Σημείωση: Προτού εγκαταστήσετε τη σύνδεση Python, πρέπει να έχετε εγκαταστήσει το cURL. Εάν δεν έχετε εγκατεστημένο το cURL στο μηχάνημά σας, μπορείτε να το κάνετε ως εξής: apt install curl.
Λήψη αρχείων με PyCURL
Ακολουθεί ο κώδικας για να κατεβάσετε το XKCD Comic χρησιμοποιώντας το PyCURL:
import pycurl from io import BytesIO # URL of the XKCD Python comic url="https://imgs.xkcd.com/comics/python.png" # Create a Curl object c = pycurl.Curl() # Set the URL c.setopt(pycurl.URL, url) # Create a BytesIO object to store the downloaded data buffer = BytesIO() c.setopt(pycurl.WRITEDATA, buffer) # Perform the request c.perform() # Check if the request was successful (HTTP status code 200) http_code = c.getinfo(pycurl.HTTP_CODE) if http_code == 200: # Save the downloaded data to a file with open('xkcd_comic.png', 'wb') as f: f.write(buffer.getvalue()) # Close the Curl object c.close()
Ας αναλύσουμε το μεγαλύτερο απόσπασμα σε μικρότερα αποσπάσματα κώδικα για κάθε βήμα:
Βήμα 1: Εισαγάγετε τις Απαιτούμενες Μονάδες
Αρχικά, εισάγουμε το pycurl ώστε να μπορούμε να το χρησιμοποιήσουμε για την υποβολή αιτημάτων HTTP. Στη συνέχεια εισάγουμε BytesIO από το μονάδα io για να δημιουργήσετε ένα buffer για την αποθήκευση των ληφθέντων δεδομένων:
import pycurl from io import BytesIO
Βήμα 2: Δημιουργήστε ένα αντικείμενο Curl και ορίστε τη διεύθυνση URL
Καθορίζουμε τη διεύθυνση URL του κόμικ XKCD Python που θέλουμε να κατεβάσουμε. Και δημιουργήστε ένα αντικείμενο curl, το οποίο αντιπροσωπεύει το αίτημα HTTP. Στη συνέχεια, ορίσαμε τη διεύθυνση URL για το αντικείμενο Curl χρησιμοποιώντας c.setopt(pycurl.URL, url):
# URL of the XKCD Python comic url="https://imgs.xkcd.com/comics/python.png" # Create a Curl object c = pycurl.Curl() # Set the URL c.setopt(pycurl.URL, url)
Βήμα 3: Δημιουργήστε ένα αντικείμενο BytesIO και ορίστε την επιλογή WRITEDATA
Δημιουργούμε ένα αντικείμενο BytesIO για την αποθήκευση των ληφθέντων δεδομένων και διαμορφώνουμε το αντικείμενο Curl ώστε να γράφει τα δεδομένα απόκρισης στο buffer μας χρησιμοποιώντας c.setopt(pycurl.WRITEDATA, buffer):
# Create a BytesIO object to store the downloaded data buffer = BytesIO() c.setopt(pycurl.WRITEDATA, buffer)
Βήμα 4: Εκτελέστε το αίτημα
Εκτελέστε το αίτημα HTTP χρησιμοποιώντας c.perform() και ανακτήστε τα δεδομένα της εικόνας κόμικ:
# Perform the request c.perform()
Βήμα 5: Ελέγξτε τον κωδικό κατάστασης HTTP και αποθηκεύστε τα δεδομένα λήψης
Λαμβάνουμε τον κωδικό κατάστασης HTTP χρησιμοποιώντας c.getinfo(pycurl.HTTP_CODE) για να διασφαλίσουμε ότι το αίτημα ήταν επιτυχές (κωδικός HTTP 200). Εάν ο κωδικός κατάστασης HTTP είναι 200, γράφουμε τα δεδομένα από το buffer στο αρχείο εικόνας:
# Check if the request was successful (HTTP status code 200) http_code = c.getinfo(pycurl.HTTP_CODE) if http_code == 200: # Save the downloaded data to a file with open('xkcd_comic.png', 'wb') as f: f.write(buffer.getvalue())
Βήμα 6: Κλείστε το αντικείμενο Curl
Τέλος, κλείνουμε το αντικείμενο curl χρησιμοποιώντας c.close() για να καθαρίσουμε τους πόρους:
# Close the Curl object c.close()
Πώς να κατεβάσετε μεγάλα αρχεία σε μικρότερα κομμάτια
Μέχρι στιγμής, έχουμε δει διαφορετικούς τρόπους λήψης του κόμικ XKCD Python—ένα μικρό αρχείο εικόνας—στον τρέχοντα κατάλογο.
Ωστόσο, μπορεί επίσης να θέλετε να κατεβάσετε πολύ μεγαλύτερα αρχεία, όπως προγράμματα εγκατάστασης για IDE και άλλα. Κατά τη λήψη τόσο μεγάλων αρχείων, είναι χρήσιμο να τα κατεβάζετε σε μικρότερα κομμάτια και επίσης να παρακολουθείτε την πρόοδο καθώς προχωρά η λήψη. Μπορούμε να χρησιμοποιήσουμε τη λειτουργικότητα της βιβλιοθήκης αιτημάτων για αυτό.
Ας χρησιμοποιήσουμε αιτήματα για λήψη του VS Code πρόγραμμα εγκατάστασης σε κομμάτια μεγέθους 1 MB:
import requests # URL of the Visual Studio Code installer EXE file url="https://code.visualstudio.com/sha/download?build=stable&os=win32-x64-user" # Chunk size for downloading chunk_size = 1024 * 1024 # 1 MB chunks response = requests.get(url, stream=True) # Determine the total file size from the Content-Length header total_size = int(response.headers.get('content-length', 0)) with open('vs_code_installer.exe', 'wb') as file: for chunk in response.iter_content(chunk_size): if chunk: file.write(chunk) file_size = file.tell() # Get the current file size print(f'Downloading... {file_size}/{total_size} bytes', end='\r') print('Download complete.')
Εδώ:
- Ορίσαμε το «μέγεθος_τεμαχίου» για να προσδιορίσουμε το μέγεθος κάθε κομματιού (1 MB σε αυτό το παράδειγμα).
- Στη συνέχεια χρησιμοποιούμε requests.get με stream=True για ροή του περιεχομένου απόκρισης χωρίς να φορτώνεται ολόκληρο το αρχείο στη μνήμη ταυτόχρονα.
- Αποθηκεύουμε κάθε κομμάτι στο αρχείο διαδοχικά καθώς γίνεται λήψη.
Καθώς η λήψη συνεχίζεται, θα δείτε τον αριθμό των byte που έχουν ληφθεί αυτήν τη στιγμή/συνολικό αριθμό byte:
Αφού ολοκληρωθεί η λήψη, θα πρέπει να δείτε το μήνυμα «Η λήψη ολοκληρώθηκε»:
Και θα πρέπει να δείτε το πρόγραμμα εγκατάστασης VS Code στον κατάλογό σας:
Τυλίγοντας
Ελπίζω να έχετε μάθει μερικούς διαφορετικούς τρόπους λήψης αρχείων από διευθύνσεις URL χρησιμοποιώντας την Python. Εκτός από το ενσωματωμένο urllib.request, έχουμε καλύψει δημοφιλή πακέτα Python τρίτων, όπως αιτήματα, urllib3, wget και PuCURL.
Ως προγραμματιστής, έχω χρησιμοποιήσει τη βιβλιοθήκη αιτημάτων περισσότερο από άλλες στα έργα μου για τη λήψη αρχείων και την εργασία με API Ιστού γενικά. Αλλά και οι άλλες μέθοδοι μπορεί επίσης να είναι χρήσιμες ανάλογα με την πολυπλοκότητα της εργασίας λήψης και το επίπεδο ευκρίνειας που χρειάζεστε για τα αιτήματα HTTP. Καλή λήψη!