URL से रिटर्न की गई ज़िप फ़ाइल डाउनलोड करें


88

अगर मेरे पास एक URL है, जो एक वेब ब्राउज़र में प्रस्तुत किया जाता है, तो एक ज़िप फ़ाइल को बचाने के लिए एक संवाद बॉक्स पॉप अप होता है, मैं पायथन में इस ज़िप फ़ाइल को पकड़ने और डाउनलोड करने के बारे में कैसे जाऊंगा?


1
मैंने एक बाइनरी फ़ाइल डाउनलोड करने और इसे इस पेज की डिस्क पर लिखने की कोशिश की, जो इस पृष्ठ की डिस्क के रूप में काम करती है।
ज़िनाब अब्बासिमज़ार

जवाबों:


36

अधिकांश लोग requestsइसे उपलब्ध होने पर उपयोग करने की सलाह देते हैं , और requests दस्तावेज़ इसे एक यूआरएल से कच्चे डेटा को डाउनलोड करने और बचाने के लिए सुझाते हैं:

import requests 

def download_url(url, save_path, chunk_size=128):
    r = requests.get(url, stream=True)
    with open(save_path, 'wb') as fd:
        for chunk in r.iter_content(chunk_size=chunk_size):
            fd.write(chunk)

चूंकि उत्तर ज़िप फ़ाइल को डाउनलोड करने और सहेजने के बारे में पूछता है , इसलिए मैं ज़िप फ़ाइल को पढ़ने के बारे में विवरण में नहीं गया। संभावनाओं के लिए नीचे दिए गए कई उत्तरों में से एक देखें।

यदि किसी कारण से आपके पास पहुंच नहीं है requests, तो आप urllib.requestइसके बजाय उपयोग कर सकते हैं । यह ऊपर के रूप में काफी मजबूत नहीं हो सकता है।

import urllib.request

def download_url(url, save_path):
    with urllib.request.urlopen(url) as dl_file:
        with open(save_path, 'wb') as out_file:
            out_file.write(dl_file.read())

अंत में, यदि आप अभी भी पायथन 2 का उपयोग कर रहे हैं, तो आप उपयोग कर सकते हैं urllib2.urlopen

from contextlib import closing

def download_url(url, save_path):
    with closing(urllib2.urlopen(url)) as dl_file:
        with open(save_path, 'wb') as out_file:
            out_file.write(dl_file.read())

क्या आप सैंपल स्निपेट को भी जोड़ सकते हैं। ऐसा करना आपके लिए बहुत अच्छा होगा
सर्वज्ञ दुबे

207

जहाँ तक मैं बता सकता हूँ, ऐसा करने का उचित तरीका है:

import requests, zipfile, StringIO
r = requests.get(zip_file_url, stream=True)
z = zipfile.ZipFile(StringIO.StringIO(r.content))
z.extractall()

निश्चित रूप से आप की जाँच करने के लिए कि प्राप्त के साथ सफल रहा था चाहते हैं r.ok

अजगर 3+ के लिए, स्ट्रिंग मॉड्यूल को io मॉड्यूल के साथ उप करें और स्ट्रिंग के बजाय बाइट्सियो का उपयोग करें: यहां रिलीज़ नोट हैं जो इस बदलाव का उल्लेख करते हैं।

import requests, zipfile, io
r = requests.get(zip_file_url)
z = zipfile.ZipFile(io.BytesIO(r.content))
z.extractall("/path/to/destination_directory")

इस उत्तर के लिए धन्यवाद। मैंने इसका उपयोग अनुरोध के साथ एक ज़िप फ़ाइल प्राप्त करने के लिए अपनी समस्या को हल करने के लिए किया था ।
gr1zzly 4r

yoavram, आपके कोड में- मैं वेबपृष्ठ का url कहाँ दर्ज करूँ?
newGIS

25
यदि आप डाउनलोड की गई फ़ाइल को किसी अन्य स्थान पर सहेजना चाहते हैं, तो उसके z.extractall()साथ बदलेंz.extractall("/path/to/destination_directory")
user799188

1
यदि आप फ़ाइल को उस यूआरएल से सहेजना चाहते हैं जो आप कर सकते हैं urllib.request.urlretrieve(url, filename):।
यवराम

3
दूसरों को डॉट्स कनेक्ट करने में मदद करने के लिए मुझे 60 मिनट तक का समय लग गया, फिर आप pd.read_table(z.open('filename'))उपरोक्त के साथ उपयोग कर सकते हैं। उपयोगी है अगर आपके पास एक ज़िप यूआरएल लिंक है जिसमें कई फाइलें हैं और आप केवल एक लोड करने में रुचि रखते हैं।
फ्राकस्टर

13

इस ब्लॉग पोस्ट की मदद से , मैंने इसे बस काम कर लिया है requests। अजीब streamबात की बात यह है कि हमें contentबड़े अनुरोधों पर कॉल करने की आवश्यकता नहीं है , जो स्मृति को रोकते हुए सभी को एक बार संसाधित करने की आवश्यकता होगी। streamएक बार में एक डेटा के माध्यम से पुनरावृत्ति करके इससे बचा जाता है।

url = 'https://www2.census.gov/geo/tiger/GENZ2017/shp/cb_2017_02_tract_500k.zip'
target_path = 'alaska.zip'

response = requests.get(url, stream=True)
handle = open(target_path, "wb")
for chunk in response.iter_content(chunk_size=512):
    if chunk:  # filter out keep-alive new chunks
        handle.write(chunk)
handle.close()

2
उत्तर उनकी सामग्री के थोक के लिए लिंक पर निर्भर नहीं होना चाहिए। लिंक मृत हो सकते हैं, या दूसरी तरफ की सामग्री को अब सवाल का जवाब देने के लिए नहीं बदला जा सकता है। आपके द्वारा इंगित की गई जानकारी का सारांश या स्पष्टीकरण शामिल करने के लिए कृपया अपना उत्तर संपादित करें।
19

8

यहाँ मुझे पायथन 3 में काम करने के लिए मिला:

import zipfile, urllib.request, shutil

url = 'http://www....myzipfile.zip'
file_name = 'myzip.zip'

with urllib.request.urlopen(url) as response, open(file_name, 'wb') as out_file:
    shutil.copyfileobj(response, out_file)
    with zipfile.ZipFile(file_name) as zf:
        zf.extractall()

नमस्ते। इस त्रुटि से कैसे बचा जा सकता है urllib.error.HTTPError: HTTP Error 302: The HTTP server returned a redirect error that would lead to an infinite loop.:?
विक्टर एम हेरासमी पेरेज़

@VictorHerasmePerez, एक HTTP 302 प्रतिक्रिया स्थिति कोड का अर्थ है कि पृष्ठ को स्थानांतरित कर दिया गया है। मुझे लगता है कि आपका सामना करने वाला मुद्दा यहां संबोधित किया गया है: stackoverflow.com/questions/32569934/…
Webucator

5

या तो urllib2.urlopen का उपयोग करें, या आप उत्कृष्ट Requestsमॉड्यूल का उपयोग करने की कोशिश कर सकते हैं और urllib2 सिरदर्द से बच सकते हैं:

import requests
results = requests.get('url')
#pass results.content onto secondary processing...

1
लेकिन आप परिणामों को कैसे पार्स करते हैं। एक ज़िप को कंटिन्यू करें?
आत्मान

zipfileमॉड्यूल का उपयोग करें zip = zipfile.ZipFile(results.content):। तो बस का उपयोग करके फ़ाइलें के द्वारा पार्स ZipFile.namelist(), ZipFile.open()याZipFile.extractall()
aravenel

5

मैं एक .bzip2 फ़ाइल को सहेजने का तरीका खोज रहा हूँ। मुझे उन अन्य लोगों के लिए कोड पेस्ट करने चाहिए जो इस की तलाश में आ सकते हैं।

url = "http://api.mywebsite.com"
filename = "swateek.tar.gz"

response = requests.get(url, headers=headers, auth=('myusername', 'mypassword'), timeout=50)
if response.status_code == 200:
with open(filename, 'wb') as f:
   f.write(response.content)

मैं बस के रूप में फ़ाइल को सहेजना चाहता था।


3

उपरोक्त समाधान के लिए @yoavram के लिए धन्यवाद, मेरा यूआरएल पथ एक ज़िप्ड फ़ोल्डर से जुड़ा हुआ है , और BADZipfile की त्रुटि का सामना करना पड़ता है (फ़ाइल ज़िप फ़ाइल नहीं है), और यह अजीब था अगर मैंने कई बार कोशिश की कि यह यूआरएल को पुनः प्राप्त कर ले और इसे अनज़िप कर दिया अचानक इसलिए मैं समाधान को थोड़ा संशोधित करता हूं। यहाँ के अनुसार is_zipfile विधि का उपयोग करना

r = requests.get(url, stream =True)
check = zipfile.is_zipfile(io.BytesIO(r.content))
while not check:
    r = requests.get(url, stream =True)
    check = zipfile.is_zipfile(io.BytesIO(r.content))
else:
    z = zipfile.ZipFile(io.BytesIO(r.content))
    z.extractall()
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.