python - करन - हिंदी गाने डाउनलोड




मैं पाइथन का उपयोग कर HTTP पर एक फ़ाइल कैसे डाउनलोड करूं? (13)

मेरे पास एक छोटी सी उपयोगिता है जिसका उपयोग मैं एक वेबसाइट से एक एमपी 3 डाउनलोड करने के लिए करता हूं और फिर पॉडकास्ट एक्सएमएल फ़ाइल बनाता / अपडेट करता हूं जिसे मैंने स्पष्ट रूप से आईट्यून्स में जोड़ा है।

पाठ प्रसंस्करण जो XML फ़ाइल बनाता / अद्यतन करता है उसे पायथन में लिखा जाता है। मैं वास्तविक एमपी 3 डाउनलोड करने के लिए विंडोज़ .bat फ़ाइल के अंदर wget का उपयोग करता हूं। हालांकि मैं पाइथन में पूरी उपयोगिता लिखना पसंद करूंगा।

मैं वास्तव में पाइथन में फ़ाइल को लोड करने का एक तरीका खोजने के लिए संघर्ष कर रहा था, इस प्रकार मैंने क्यों wget सहारा लिया।

तो, मैं पायथन का उपयोग कर फ़ाइल कैसे डाउनलोड करूं?


पायथन 3

  • urllib.request.urlopen

    import urllib.request
    response = urllib.request.urlopen('http://www.example.com/')
    html = response.read()
    
  • urllib.request.urlretrieve

    import urllib.request
    urllib.request.urlretrieve('http://www.example.com/songs/mp3.mp3', 'mp3.mp3')
    

पायथन 2

  • urllib2.urlopen (धन्यवाद Corey )

    import urllib2
    response = urllib2.urlopen('http://www.example.com/')
    html = response.read()
    
  • urllib.urlretrieve (धन्यवाद PabloG )

    import urllib
    urllib.urlretrieve('http://www.example.com/songs/mp3.mp3', 'mp3.mp3')
    

2012 में, पायथन अनुरोध पुस्तकालय का उपयोग करें

>>> import requests
>>> 
>>> url = "http://download.thinkbroadband.com/10MB.zip"
>>> r = requests.get(url)
>>> print len(r.content)
10485760

आप इसे प्राप्त करने के लिए pip install requests चला सकते हैं।

अनुरोधों के विकल्पों पर कई फायदे हैं क्योंकि एपीआई बहुत आसान है। यह विशेष रूप से सच है यदि आपको प्रमाणीकरण करना है। urllib और urllib2 इस मामले में काफी अनजान और दर्दनाक हैं।

2015/12/30

लोगों ने प्रगति पट्टी के लिए प्रशंसा व्यक्त की है। यह अच्छा है, यकीन है। tqdm सहित अब कई ऑफ-द-शेल्फ समाधान हैं:

from tqdm import tqdm
import requests

url = "http://download.thinkbroadband.com/10MB.zip"
response = requests.get(url, stream=True)

with open("10MB", "wb") as handle:
    for data in tqdm(response.iter_content()):
        handle.write(data)

यह अनिवार्य रूप से कार्यान्वयन @kvance 30 महीने पहले वर्णित है।


Wget मॉड्यूल का उपयोग करें:

import wget
wget.download('url')

urlretrieve और request.get सरल है, हालांकि वास्तविकता नहीं है। मैंने पाठ और छवियों सहित दो साइटों के लिए डेटा प्राप्त किया है, उपर्युक्त दो शायद अधिकांश कार्यों को हल करते हैं। लेकिन एक अधिक सार्वभौमिक समाधान के लिए मैं urlopen के उपयोग का सुझाव देते हैं। चूंकि इसे पायथन 3 मानक लाइब्रेरी में शामिल किया गया है, इसलिए आपका कोड किसी भी मशीन पर चलाया जा सकता है जो प्री-इंस्टॉलेशन साइट-पैरा के बिना पायथन 3 चलाता है

import urllib.request
url_request = urllib.request.Request(url, headers=headers)
url_connect = urllib.request.urlopen(url_request)
len_content = url_content.length

#remember to open file in bytes mode
with open(filename, 'wb') as f:
    while True:
        buffer = url_connect.read(buffer_size)
        if not buffer: break

        #an integer value of size of written data
        data_wrote = f.write(buffer)

#you could probably use with-open-as manner
url_connect.close()

पाइथन का उपयोग करते हुए http पर फ़ाइल डाउनलोड करते समय यह उत्तर HTTP 403 को निषिद्ध करने का समाधान प्रदान करता है। मैंने केवल अनुरोध और urllib मॉड्यूल का प्रयास किया है, अन्य मॉड्यूल कुछ बेहतर प्रदान कर सकता है, लेकिन यह वह है जिसे मैं ज्यादातर समस्याओं को हल करने के लिए उपयोग करता था।


आप urlretrieve के साथ प्रगति प्रतिक्रिया भी प्राप्त कर सकते हैं:

def report(blocknr, blocksize, size):
    current = blocknr*blocksize
    sys.stdout.write("\r{0:.2f}%".format(100.0*current/size))

def downloadFile(url):
    print "\n",url
    fname = url.split('/')[-1]
    print fname
    urllib.urlretrieve(url, fname, report)

इस उद्देश्य के लिए शुद्ध पायथन में wget लाइब्रेरी wget । यह संस्करण 2.0 के रूप में इन सुविधाओं के साथ urlretrieve पंप है।


पाइथन 2/3 के लिए पाब्लोग कोड का एक बेहतर संस्करण:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from __future__ import ( division, absolute_import, print_function, unicode_literals )

import sys, os, tempfile, logging

if sys.version_info >= (3,):
    import urllib.request as urllib2
    import urllib.parse as urlparse
else:
    import urllib2
    import urlparse

def download_file(url, dest=None):
    """ 
    Download and save a file specified by url to dest directory,
    """
    u = urllib2.urlopen(url)

    scheme, netloc, path, query, fragment = urlparse.urlsplit(url)
    filename = os.path.basename(path)
    if not filename:
        filename = 'downloaded.file'
    if dest:
        filename = os.path.join(dest, filename)

    with open(filename, 'wb') as f:
        meta = u.info()
        meta_func = meta.getheaders if hasattr(meta, 'getheaders') else meta.get_all
        meta_length = meta_func("Content-Length")
        file_size = None
        if meta_length:
            file_size = int(meta_length[0])
        print("Downloading: {0} Bytes: {1}".format(url, file_size))

        file_size_dl = 0
        block_sz = 8192
        while True:
            buffer = u.read(block_sz)
            if not buffer:
                break

            file_size_dl += len(buffer)
            f.write(buffer)

            status = "{0:16}".format(file_size_dl)
            if file_size:
                status += "   [{0:6.2f}%]".format(file_size_dl * 100 / file_size)
            status += chr(13)
            print(status, end="")
        print()

    return filename

if __name__ == "__main__":  # Only run if this file is called directly
    print("Testing with 10MB download")
    url = "http://download.thinkbroadband.com/10MB.zip"
    filename = download_file(url)
    print(filename)

पाइथन में फ़ाइलों को डाउनलोड करने के लिए सबसे अधिक उपयोग की जाने वाली कॉल निम्नलिखित हैं:

  1. urllib.urlretrieve ('url_to_file', file_name)

  2. urllib2.urlopen('url_to_file')

  3. requests.get(url)

  4. wget.download('url', file_name)

नोट: urlretrieve और urlretrieve बड़ी फ़ाइलों (आकार> 500 एमबी) डाउनलोड करने के साथ अपेक्षाकृत खराब प्रदर्शन करने के लिए पाए जाते हैं। requests.get फ़ाइल को स्मृति में संग्रहीत करता है जब तक कि डाउनलोड पूर्ण नहीं हो जाता है।


मैं कोरी से सहमत हूं, urllib2 urllib से अधिक पूर्ण है और यदि आप अधिक जटिल चीजें करना चाहते हैं, तो मॉड्यूल का उपयोग किया जाना चाहिए, लेकिन उत्तर को और अधिक पूरा करने के लिए, यदि आप केवल मूल बातें चाहते हैं तो urllib एक साधारण मॉड्यूल है:

import urllib
response = urllib.urlopen('http://www.example.com/sound.mp3')
mp3 = response.read()

ठीक काम करेगा। या, यदि आप "प्रतिक्रिया" ऑब्जेक्ट से निपटना नहीं चाहते हैं तो आप सीधे () सीधे कॉल कर सकते हैं:

import urllib
mp3 = urllib.urlopen('http://www.example.com/sound.mp3').read()

मैंने निम्नलिखित लिखा है, जो वेनिला पायथन 2 या पायथन 3 में काम करता है।

import sys
try:
    import urllib.request
    python3 = True
except ImportError:
    import urllib2
    python3 = False


def progress_callback_simple(downloaded,total):
    sys.stdout.write(
        "\r" +
        (len(str(total))-len(str(downloaded)))*" " + str(downloaded) + "/%d"%total +
        " [%3.2f%%]"%(100.0*float(downloaded)/float(total))
    )
    sys.stdout.flush()

def download(srcurl, dstfilepath, progress_callback=None, block_size=8192):
    def _download_helper(response, out_file, file_size):
        if progress_callback!=None: progress_callback(0,file_size)
        if block_size == None:
            buffer = response.read()
            out_file.write(buffer)

            if progress_callback!=None: progress_callback(file_size,file_size)
        else:
            file_size_dl = 0
            while True:
                buffer = response.read(block_size)
                if not buffer: break

                file_size_dl += len(buffer)
                out_file.write(buffer)

                if progress_callback!=None: progress_callback(file_size_dl,file_size)
    with open(dstfilepath,"wb") as out_file:
        if python3:
            with urllib.request.urlopen(srcurl) as response:
                file_size = int(response.getheader("Content-Length"))
                _download_helper(response,out_file,file_size)
        else:
            response = urllib2.urlopen(srcurl)
            meta = response.info()
            file_size = int(meta.getheaders("Content-Length")[0])
            _download_helper(response,out_file,file_size)

import traceback
try:
    download(
        "https://geometrian.com/data/programming/projects/glLib/glLib%20Reloaded%200.5.9/0.5.9.zip",
        "output.zip",
        progress_callback_simple
    )
except:
    traceback.print_exc()
    input()

टिप्पणियाँ:

  • एक "प्रगति पट्टी" कॉलबैक का समर्थन करता है।
  • डाउनलोड मेरी वेबसाइट से 4 एमबी परीक्षण। ज़िप है।

यह थोड़ा देर हो सकता है, लेकिन मैंने पाब्लोग के कोड को देखा और ओएससिस्टम ('सीएलएस') को जोड़ने में मदद नहीं कर सका ताकि इसे अद्भुत लगे! इसकी जांच - पड़ताल करें :

    import urllib2,os

    url = "http://download.thinkbroadband.com/10MB.zip"

    file_name = url.split('/')[-1]
    u = urllib2.urlopen(url)
    f = open(file_name, 'wb')
    meta = u.info()
    file_size = int(meta.getheaders("Content-Length")[0])
    print "Downloading: %s Bytes: %s" % (file_name, file_size)
    os.system('cls')
    file_size_dl = 0
    block_sz = 8192
    while True:
        buffer = u.read(block_sz)
        if not buffer:
            break

        file_size_dl += len(buffer)
        f.write(buffer)
        status = r"%10d  [%3.2f%%]" % (file_size_dl, file_size_dl * 100. / file_size)
        status = status + chr(8)*(len(status)+1)
        print status,

    f.close()

यदि विंडोज के अलावा किसी अन्य वातावरण में चल रहा है, तो आपको कुछ और 'cls' का उपयोग करना होगा। मैक ओएस एक्स और लिनक्स में यह 'स्पष्ट' होना चाहिए।


सरल अभी तक Python 2 & Python 3 संगत तरीका six पुस्तकालय के साथ आता है:

from six.moves import urllib
urllib.request.urlretrieve("http://www.example.com/songs/mp3.mp3", "mp3.mp3")

import urllib2
mp3file = urllib2.urlopen("http://www.example.com/songs/mp3.mp3")
with open('test.mp3','wb') as output:
  output.write(mp3file.read())

open('test.mp3','wb') में wb open('test.mp3','wb') बाइनरी मोड में एक फ़ाइल (और किसी भी मौजूदा फ़ाइल को मिटा देता है open('test.mp3','wb') खोलता है ताकि आप केवल टेक्स्ट के बजाय डेटा को सहेज सकें।







urllib