अगर मेरे पास एक URL है, जो एक वेब ब्राउज़र में प्रस्तुत किया जाता है, तो एक ज़िप फ़ाइल को बचाने के लिए एक संवाद बॉक्स पॉप अप होता है, मैं पायथन में इस ज़िप फ़ाइल को पकड़ने और डाउनलोड करने के बारे में कैसे जाऊंगा?
अगर मेरे पास एक URL है, जो एक वेब ब्राउज़र में प्रस्तुत किया जाता है, तो एक ज़िप फ़ाइल को बचाने के लिए एक संवाद बॉक्स पॉप अप होता है, मैं पायथन में इस ज़िप फ़ाइल को पकड़ने और डाउनलोड करने के बारे में कैसे जाऊंगा?
जवाबों:
अधिकांश लोग 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())
जहाँ तक मैं बता सकता हूँ, ऐसा करने का उचित तरीका है:
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")
z.extractall()
साथ बदलेंz.extractall("/path/to/destination_directory")
urllib.request.urlretrieve(url, filename)
:।
pd.read_table(z.open('filename'))
उपरोक्त के साथ उपयोग कर सकते हैं। उपयोगी है अगर आपके पास एक ज़िप यूआरएल लिंक है जिसमें कई फाइलें हैं और आप केवल एक लोड करने में रुचि रखते हैं।
इस ब्लॉग पोस्ट की मदद से , मैंने इसे बस काम कर लिया है 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()
यहाँ मुझे पायथन 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.
:?
या तो urllib2.urlopen का उपयोग करें, या आप उत्कृष्ट Requests
मॉड्यूल का उपयोग करने की कोशिश कर सकते हैं और urllib2 सिरदर्द से बच सकते हैं:
import requests
results = requests.get('url')
#pass results.content onto secondary processing...
zipfile
मॉड्यूल का उपयोग करें zip = zipfile.ZipFile(results.content)
:। तो बस का उपयोग करके फ़ाइलें के द्वारा पार्स ZipFile.namelist()
, ZipFile.open()
याZipFile.extractall()
मैं एक .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)
मैं बस के रूप में फ़ाइल को सहेजना चाहता था।
उपरोक्त समाधान के लिए @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()