ইউআরএল থেকে ফিরে আসা জিপ ফাইলটি ডাউনলোড করুন


88

যদি আমার কোনও ইউআরএল থাকে যা যখন কোনও ওয়েব ব্রাউজারে জমা দেওয়া হয়, তখন একটি জিপ ফাইল সংরক্ষণের জন্য একটি ডায়ালগ বক্স পপ আপ করে দেয়, আমি পাইথনে এই জিপ ফাইলটি ধরার এবং ডাউনলোড করার বিষয়ে কীভাবে যাব?


4
আমি অধ্যায় চেষ্টা একটি বাইনারি ফাইল ডাউনলোড এবং ডিস্কে এটা লেখার এর এই পৃষ্ঠার যা chram হিসেবে কাজ করতেন।
জেইনাব আব্বাসিমাজার

উত্তর:


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())

আপনি কি দয়া করে নমুনার স্নিপেটও যুক্ত করতে পারেন? এটি তাই দয়ার কাজ হবে আপনার তা করার
Sarvagya দুবে

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+ এর জন্য, স্ট্রিংআইও মডিউলটি আইও মডিউল সহ সাবটি করুন এবং স্ট্রিংআইও-র পরিবর্তে বাইটসআইও ব্যবহার করুন : এখানে প্রকাশিত নোটগুলি এই পরিবর্তনের কথা উল্লেখ করেছে।

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

এই উত্তরের জন্য ধন্যবাদ। অনুরোধের সাথে একটি জিপ ফাইল পেয়ে আমার সমস্যা সমাধানের জন্য আমি এটি ব্যবহার করেছি ।
gr1zzly be4r

যোভরাম, আপনার কোড- যেখানে আমি ওয়েবপৃষ্ঠার ইউআরএল প্রবেশ করবো?
newGIS

25
আপনি একটি ভিন্ন অবস্থান ডাউনলোড করা ফাইল সংরক্ষণ করতে চান তাহলে, প্রতিস্থাপন z.extractall()সঙ্গেz.extractall("/path/to/destination_directory")
user799188

4
আপনি শুধু URL থেকে ফাইল সংরক্ষণ করতে চান তাহলে আপনাকে করতে পারেন: urllib.request.urlretrieve(url, filename)
yoavram

4
অন্যকে বিন্দু সংযোগে সহায়তা করতে এটি আমাকে 60 মিনিট দীর্ঘ সময় নিয়েছে, আপনি উপরেরটি pd.read_table(z.open('filename'))দিয়ে ব্যবহার করতে পারেন । আপনার যদি একটি জিপ url লিঙ্ক থাকে যাতে একাধিক ফাইল থাকে এবং আপনি কেবল একটি লোড করতে আগ্রহী হন তা কার্যকর Use
ফ্রিকস্টার

13

সাহায্যে এই ব্লগ পোস্টে , আমি এটা শুধু সঙ্গে কাজ পেয়েছেন requests। অদ্ভুত streamজিনিসের মূল বিষয়টি তাই আমাদের contentবড় অনুরোধগুলির জন্য কল করার দরকার নেই , যা স্মৃতিশক্তি আটকে রেখে এটি একবারে প্রক্রিয়া করা প্রয়োজন। streamএকটি সময়ে ডেটা এক খণ্ড মাধ্যমে iterating এই এড়াতে।

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()

4
উত্তরগুলি তাদের সামগ্রীর বেশিরভাগ লিঙ্কের উপর নির্ভর করবে না। লিঙ্কগুলি মৃত অবস্থায় যেতে পারে, বা অন্যদিকে থাকা সামগ্রীটিকে প্রশ্নের উত্তর আর দেওয়া যাবে না। আপনি যে পয়েন্টগুলিতে লিঙ্ক করেন সেটির সংক্ষিপ্তসার বা ব্যাখ্যা অন্তর্ভুক্ত করার জন্য দয়া করে আপনার উত্তরটি সম্পাদনা করুন।
মাইপেটলিয়ন

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.?
ভিক্টর এম হেরাসেম পেরেজ

@ ভিক্টর হেরাসমেপ্রেজ, একটি HTTP 302 প্রতিক্রিয়া স্থিতি কোডটির অর্থ পৃষ্ঠাটি সরিয়ে নেওয়া হয়েছে। আমি বিষয়টি আপনার মুখোমুখি হচ্ছে এখানে সম্বোধন চিন্তা করুন: stackoverflow.com/questions/32569934/...
Webucator

5

হয় urllib2.urlopen ব্যবহার করুন, বা আপনি দুর্দান্ত Requestsমডিউলটি ব্যবহার করে চেষ্টা করতে পারেন এবং urllib2 মাথাব্যথা এড়াতে পারেন:

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

4
তবে আপনি কীভাবে ফলাফলগুলিকে পার্স করবেন? কনটেন্ট ইন জিপ?
0atman

ব্যবহার করুন 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

উপরের সমাধানের জন্য @ অয়াভ্রামকে ধন্যবাদ, আমার ইউআরএল পথটি একটি জিপ করা ফোল্ডারের সাথে যুক্ত এবং 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()
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.