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


874

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

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

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

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



नीचे दिए गए कई उत्तर संतोषजनक प्रतिस्थापन नहीं हैं wget। अन्य बातों के अलावा, wget(1) टाइमस्टैम्प (2) ऑटो को निर्धारित करता है url से फ़ाइलनाम, संलग्न .1(आदि) यदि फ़ाइल पहले से मौजूद है (3) में कई अन्य विकल्प हैं, जिनमें से कुछ आप अपने में डाल सकते हैं .wgetrc। यदि आप उनमें से किसी को चाहते हैं, तो आपको उन्हें पायथन में खुद को लागू करना होगा, लेकिन केवल wgetपायथन से आह्वान करना सरल है ।
श्रीवत्सआर

2
पायथन 3 के लिए लघु समाधान:import urllib.request; s = urllib.request.urlopen('http://example.com/').read().decode()
बसज

जवाबों:


450

पायथन 2 में, urllib2 का उपयोग करें जो मानक पुस्तकालय के साथ आता है।

import urllib2
response = urllib2.urlopen('http://www.example.com/')
html = response.read()

यह लाइब्रेरी का उपयोग करने का सबसे बुनियादी तरीका है, किसी भी त्रुटि से निपटने के लिए माइनस। आप अधिक जटिल सामान भी कर सकते हैं जैसे कि हेडर बदलना। प्रलेखन यहाँ पाया जा सकता है।


11
यदि आपके द्वारा दिए गए url में स्थान नहीं हैं तो यह काम नहीं करेगा। उस स्थिति में, आपको url को पार्स करना होगा और पथ को urlencode करना होगा।
जेसन सुंदरम

91
यहाँ पायथन 3 समाधान है: stackoverflow.com/questions/7243750/…
tommy.carstensen

6
सिर्फ संदर्भ के लिए। पथ को बदलने के लिए रास्ता हैurllib2.quote
आंद्रे प्यूएल

11
@ जैसनसुंदरम: यदि इसमें रिक्त स्थान हैं, तो यह यूआरआई नहीं है।
ज़ाज़

1
यह बड़ी फ़ाइलों के साथ विंडोज़ पर काम नहीं करता है। आपको सभी ब्लॉक पढ़ने की जरूरत है!
अविया

1115

एक और, का उपयोग कर urlretrieve:

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

(पायथन 3+ उपयोग के लिए import urllib.requestऔर urllib.request.urlretrieve)

फिर भी एक और, एक "प्रगति पट्टी" के साथ

import urllib2

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)

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

1
अजीब तरह से, यह मेरे लिए विंडोज पर काम किया जब urllib2 विधि नहीं होगी। Urllib2 विधि ने मैक पर काम किया, हालांकि।
फ्रीफॉल

6
बग: file_size_dl + = block_sz होना चाहिए + = लेन (बफर) के बाद से अंतिम पढ़ा अक्सर एक पूर्ण block_sz नहीं है। इसके अलावा खिड़कियों पर आपको आउटपुट फ़ाइल को "wb" के रूप में खोलने की आवश्यकता होती है अगर यह एक पाठ फ़ाइल नहीं है।
बैंगन जेफ

1
मुझे भी urllib और urllib2 ने काम नहीं किया लेकिन urlretrieve ने अच्छा काम किया, निराश हो रहा था - धन्यवाद :)
funk-shun

2
if not os.path.isfile(file_name):ओवरराइटिंग पॉडकास्ट से बचने के लिए पूरी बात (file_name की परिभाषा को छोड़कर) लपेटें ! एक .html फ़ाइल में पाए गए यूआरएल के साथ क्रोनजोब के रूप में इसे चलाने के लिए उपयोगी
श्रीराम मुरली

2
@ पाब्लो जी अब 31 वोटों से थोड़ा अधिक है;) वैसे भी, स्टेटस बार मजेदार था इसलिए मैं +1 करूंगा
सिंडर

340

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 महीने पहले वर्णित है।


अगर जिप फाइल वास्तव में कई फाइलों वाली फोल्डर है तो मैं कैसे सेव या एक्सट्रेक्ट करूं?
अब्दुल मुनीर

6
यह बड़ी फ़ाइलों को कैसे संभालता है, क्या सब कुछ मेमोरी में संग्रहीत हो जाता है या क्या इसे बड़ी मेमोरी आवश्यकता के बिना किसी फ़ाइल में लिखा जा सकता है?
bibstha

8
अनुरोध में स्ट्रीम = ट्रू सेट करके बड़ी फ़ाइलों को स्ट्रीम करना संभव है। आप एक समय में एक रद्दी पढ़ने के लिए प्रतिक्रिया पर iter_content () कॉल कर सकते हैं।
क्वास २ k

7
किसी url लाइब्रेरी को फ़ाइल अनज़िप सुविधा की आवश्यकता क्यों होगी? फ़ाइल को url से पढ़ें, इसे सहेजें और फिर इसे जिस तरह से आपकी नाव तैरती है, उसमें अनज़िप करें। इसके अलावा एक ज़िप फ़ाइल एक 'फ़ोल्डर' नहीं है जैसा कि यह विंडोज़ में दिखाता है, इसकी एक फ़ाइल है।
हरेल

2
@ अली:: r.textपाठ या यूनिकोड सामग्री के लिए। यूनिकोड के रूप में लौटा। r.content: बाइनरी कंटेंट के लिए। बाइट्स के रूप में लौटा। इसके बारे में यहाँ पढ़ें: docs.python-requests.org/en/latest/user/quickstart
hughdbrown

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

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


30
इस समाधान का नुकसान यह है, कि डिस्क में सहेजे जाने से पहले पूरी फ़ाइल को रैम में लोड किया जाता है, बस कुछ चीज़ों को ध्यान में रखना चाहिए यदि एक बड़ी प्रणाली के लिए राउटर जैसे सीमित रैम के साथ इसका उपयोग किया जाए।
ट्रिपलेट

2
@tripplet तो हम इसे कैसे ठीक करेंगे?
लुकास हेनरिक

11
पूरी फ़ाइल को मेमोरी में पढ़ने से बचने के लिए, एक तर्क पास करने की कोशिश करें file.readकि पढ़ने के लिए बाइट्स की संख्या है। देखें: gist.github.com/hughdbrown/c145b8385a2afa6570e2
hughdbrown

@hughdbrown मुझे आपकी स्क्रिप्ट उपयोगी लगी, लेकिन एक सवाल है: क्या मैं पोस्ट-प्रोसेसिंग के लिए फाइल का उपयोग कर सकता हूं? मान लीजिए कि मैं एक jpg फ़ाइल डाउनलोड करता हूं जिसे मैं OpenCV के साथ प्रोसेस करना चाहता हूं, क्या मैं काम करने के लिए 'डेटा' वेरिएबल का उपयोग कर सकता हूं? या क्या मुझे इसे डाउनलोड की गई फ़ाइल से दोबारा पढ़ना होगा?
रॉड्रिगो ई। प्रिंसिपल

5
उपयोग shutil.copyfileobj(mp3file, output)इसके बजाय ।
औरेलेन ओम्स

129

अजगर ३

  • 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')

    नोट: प्रलेखन के अनुसार, urllib.request.urlretrieveएक "विरासत इंटरफ़ेस" है और "भविष्य में पदावनत हो सकता है" (धन्यवाद गेरेज़ )

अजगर २


2
यह निश्चित रूप से थोड़ी देर लगा, लेकिन वहाँ है, अंत में आसान सीधा आपी मैं एक अजगर stdlib से उम्मीद है :)
ThorSummoner

Python3 के लिए बहुत अच्छा जवाब, यह भी देखें docs.python.org/3/library/…
Edouard Thiel

@EdouardThiel यदि आप urllib.request.urlretrieveऊपर क्लिक करते हैं तो यह आपको उस सटीक लिंक पर ले आएगा। चीयर्स!
बारामुइन

2
urllib.request.urlretrieveएक "विरासत इंटरफ़ेस" के रूप में प्रलेखित है और "भविष्य में पदावनत हो सकता है"।
गेरिट

@gerrit मैंने एक नोट जोड़ा, सिर ऊपर करने के लिए धन्यवाद!
बामुपिन


21

पायथन 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)

मैं कोष्ठक को पहली पंक्ति से हटा दूंगा, क्योंकि यह बहुत पुरानी विशेषता नहीं है।
अरपाद होरवाथ

21

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

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

1
यह 2 + 3 संगतता के लिए सबसे अच्छा तरीका है।
फश

21
import os,requests
def download(url):
    get_response = requests.get(url,stream=True)
    file_name  = url.split("/")[-1]
    with open(file_name, 'wb') as f:
        for chunk in get_response.iter_content(chunk_size=1024):
            if chunk: # filter out keep-alive new chunks
                f.write(chunk)


download("https://example.com/example.jpg")

17

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


3
कस्टम फ़ाइल नाम के साथ सहेजने के लिए कोई विकल्प नहीं है?
एलेक्स

2
@Alex ने -o FILENAME का विकल्प संस्करण 2.1 में दिया
अनातोली टेकटोनिक

जब मैं Cygwin के तहत इस मॉड्यूल का उपयोग करता हूं तो प्रगति बार दिखाई नहीं देता है।
जो कोडर

आपको भ्रम से बचने के -oलिए इसमें बदलाव करना चाहिए -O, क्योंकि यह GNU wget में है। या कम से कम दोनों विकल्प मान्य होने चाहिए।
एरिक

@eric मुझे यकीन नहीं है कि मैं wget.pyवास्तविक के लिए इन-प्लेस प्रतिस्थापन करना चाहता हूं wget-oपहले से ही अलग तरह से व्यवहार करती है - यह के साथ संगत है curlइस तरह से। क्या दस्तावेज़ में नोट समस्या को हल करने में मदद करेगा? या यह कमांड लाइन संगत होने के लिए ऐसे नाम की उपयोगिता के लिए आवश्यक विशेषता है?
अनातोली टेकटोनिक

15

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

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

  2. urllib2.urlopen('url_to_file')

  3. requests.get(url)

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

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


14

मैं कोरी से सहमत हूं, 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()

10

Python3 में आप urllib3 और shutil libraires का उपयोग कर सकते हैं। पाइप या पिप 3 का उपयोग करके उन्हें डाउनलोड करें (यह निर्भर करता है कि पाइथन 3 डिफ़ॉल्ट है या नहीं)

pip3 install urllib3 shutil

फिर इस कोड को चलाएं

import urllib.request
import shutil

url = "http://www.somewebsite.com/something.pdf"
output_file = "save_this_name.pdf"
with urllib.request.urlopen(url) as response, open(output_file, 'wb') as out_file:
    shutil.copyfileobj(response, out_file)

ध्यान दें कि आप डाउनलोड करते हैं urllib3लेकिन urllibकोड में उपयोग करते हैं


7

आप 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)

7

यदि आपके पास wget स्थापित है, तो आप समानांतर_sync का उपयोग कर सकते हैं।

पाइप स्थापित करें parallel_sync

from parallel_sync import wget
urls = ['http://something.png', 'http://somthing.tar.gz', 'http://somthing.zip']
wget.download('/tmp', urls)
# or a single file:
wget.download('/tmp', urls[0], filenames='x.zip', extract=True)

Doc: https://pythonhosted.org/parallel_sync/pages/examples.html

यह बहुत शक्तिशाली है। यह फ़ाइलों को समानांतर में डाउनलोड कर सकता है, विफलता पर पुन: प्रयास कर सकता है, और यह दूरस्थ मशीन पर भी फाइलें डाउनलोड कर सकता है।


ध्यान दें कि यह केवल Linux के लिए है
jjj

4

यदि गति आपके लिए मायने रखती है, तो मैंने मॉड्यूल urllibऔर wget, और संबंधित के लिए एक छोटा प्रदर्शन परीक्षण कियाwget मैं स्थिति पट्टी के साथ और बिना एक बार एक बार कोशिश की। मैंने तीन अलग-अलग 500MB फ़ाइलों के साथ परीक्षण करने के लिए (अलग-अलग फाइलें- इस संभावना को खत्म करने के लिए कि हुड के नीचे कुछ कैशिंग चल रहा है) को समाप्त किया। Python2 के साथ डेबियन मशीन पर परीक्षण किया गया।

सबसे पहले, ये परिणाम हैं (वे अलग-अलग रन में समान हैं):

$ python wget_test.py 
urlretrive_test : starting
urlretrive_test : 6.56
==============
wget_no_bar_test : starting
wget_no_bar_test : 7.20
==============
wget_with_bar_test : starting
100% [......................................................................] 541335552 / 541335552
wget_with_bar_test : 50.49
==============

जिस तरह से मैंने परीक्षण किया वह "प्रोफ़ाइल" डेकोरेटर का उपयोग कर रहा है। यह पूर्ण कोड है:

import wget
import urllib
import time
from functools import wraps

def profile(func):
    @wraps(func)
    def inner(*args):
        print func.__name__, ": starting"
        start = time.time()
        ret = func(*args)
        end = time.time()
        print func.__name__, ": {:.2f}".format(end - start)
        return ret
    return inner

url1 = 'http://host.com/500a.iso'
url2 = 'http://host.com/500b.iso'
url3 = 'http://host.com/500c.iso'

def do_nothing(*args):
    pass

@profile
def urlretrive_test(url):
    return urllib.urlretrieve(url)

@profile
def wget_no_bar_test(url):
    return wget.download(url, out='/tmp/', bar=do_nothing)

@profile
def wget_with_bar_test(url):
    return wget.download(url, out='/tmp/')

urlretrive_test(url1)
print '=============='
time.sleep(1)

wget_no_bar_test(url2)
print '=============='
time.sleep(1)

wget_with_bar_test(url3)
print '=============='
time.sleep(1)

urllib सबसे तेज लगता है


बार को इतना समय बढ़ाने के लिए हुड के नीचे कुछ पूरी तरह से भयानक होना चाहिए।
एलिस्टेयर कार्सडेन

4

पूर्णता के लिए, subprocessपैकेज का उपयोग करके फ़ाइलों को पुनर्प्राप्त करने के लिए किसी भी प्रोग्राम को कॉल करना भी संभव है । फ़ाइलों को पुनः प्राप्त करने के लिए समर्पित कार्यक्रम पाइथन कार्यों की तुलना में अधिक शक्तिशाली हैं urlretrieve। उदाहरण के लिए, wgetनिर्देशिका को पुनरावर्ती रूप से डाउनलोड कर सकते हैं ( -R), FTP के साथ सौदा कर सकते हैं, पुनर्निर्देशित कर सकते हैं, HTTP प्रॉक्सी, मौजूदा फ़ाइलों को फिर से डाउनलोड करने से बच सकते हैं ( -nc), और aria2बहु-कनेक्शन डाउनलोड कर सकते हैं जो संभवतः आपके डाउनलोड को गति प्रदान कर सकते हैं।

import subprocess
subprocess.check_output(['wget', '-O', 'example_output_file.html', 'https://example.com'])

जुपिटर नोटबुक में, कोई प्रोग्राम को सीधे !सिंटैक्स के साथ भी कॉल कर सकता है :

!wget -O example_output_file.html https://example.com

3

स्रोत कोड हो सकता है:

import urllib
sock = urllib.urlopen("http://diveintopython.org/")
htmlSource = sock.read()                            
sock.close()                                        
print htmlSource  

3

आप पायथन 2 और 3 पर PycURL का उपयोग कर सकते हैं ।

import pycurl

FILE_DEST = 'pycurl.html'
FILE_SRC = 'http://pycurl.io/'

with open(FILE_DEST, 'wb') as f:
    c = pycurl.Curl()
    c.setopt(c.URL, FILE_SRC)
    c.setopt(c.WRITEDATA, f)
    c.perform()
    c.close()

2

मैंने निम्नलिखित लिखा है, जो वैनिला पायथन 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 एमबी परीक्षण है। मेरी वेबसाइट से .zip करें।

महान काम करता है, इसे ज्यूपिटर के माध्यम से चलाएं मुझे क्या चाहिए :-)
समीर औलसाडी

1

यह थोड़ी देर हो सकती है, लेकिन मैंने पाब्लो का कोड देखा और यह AWESOME दिखने के लिए एक os.system ('cls') को जोड़ने में मदद नहीं कर सका! इसकी जांच - पड़ताल करें :

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

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


3
clsमेरे OS X या न ही मेरे Ubuntu सर्वर पर कुछ भी नहीं करता है। कुछ स्पष्टीकरण अच्छा हो सकता है।
21

मुझे लगता है कि आपको clearपूरे कमांड लाइन आउटपुट को क्लीयर करने के बजाय प्रिंट लाइन का उपयोग करना चाहिए , या प्रिंट लाइन को बेहतर तरीके से बदलना चाहिए ।
एरजून

4
यह उत्तर केवल एक अन्य उत्तर की प्रतिलिपि बनाता है और os.system()एक प्लेटफ़ॉर्म विशिष्ट कमांड ( cls) का उपयोग करके स्क्रीन को खाली करने के लिए एक उपप्रकार लॉन्च करता है । इसका कोई उत्थान कैसे होता है ?? पूरी तरह से बेकार "जवाब" IMHO।
कोरी गोल्डबर्ग 19

1

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

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

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

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


0

देर से जवाब, लेकिन python>=3.6आप के लिए उपयोग कर सकते हैं:

import dload
dload.save(url)

इसके dloadसाथ स्थापित करें :

pip3 install dload

0

मैं एक वेबपेज से सभी फ़ाइलों को डाउनलोड करना चाहता था। मैंने कोशिश की wgetलेकिन यह विफल हो रहा था इसलिए मैंने पायथन मार्ग के लिए फैसला किया और मुझे यह धागा मिल गया।

इसे पढ़ने के बाद, मैंने पाब्लो और स्टेनsoupget के उत्कृष्ट उत्तरों पर विस्तार करते हुए , थोड़ा कमांड लाइन आवेदन किया है और कुछ उपयोगी विकल्प जोड़ रहा ।

यह BeatifulSoup का उपयोग करता है पृष्ठ के सभी URL को इकट्ठा करने के लिए का और फिर वांछित एक्सटेंशन (ओं) के साथ डाउनलोड करता है। अंत में यह समानांतर में कई फाइलें डाउनलोड कर सकता है।

यह रहा:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from __future__ import (division, absolute_import, print_function, unicode_literals)
import sys, os, argparse
from bs4 import BeautifulSoup

# --- insert Stan's script here ---
# if sys.version_info >= (3,): 
#...
#...
# def download_file(url, dest=None): 
#...
#...

# --- new stuff ---
def collect_all_url(page_url, extensions):
    """
    Recovers all links in page_url checking for all the desired extensions
    """
    conn = urllib2.urlopen(page_url)
    html = conn.read()
    soup = BeautifulSoup(html, 'lxml')
    links = soup.find_all('a')

    results = []    
    for tag in links:
        link = tag.get('href', None)
        if link is not None: 
            for e in extensions:
                if e in link:
                    # Fallback for badly defined links
                    # checks for missing scheme or netloc
                    if bool(urlparse.urlparse(link).scheme) and bool(urlparse.urlparse(link).netloc):
                        results.append(link)
                    else:
                        new_url=urlparse.urljoin(page_url,link)                        
                        results.append(new_url)
    return results

if __name__ == "__main__":  # Only run if this file is called directly
    # Command line arguments
    parser = argparse.ArgumentParser(
        description='Download all files from a webpage.')
    parser.add_argument(
        '-u', '--url', 
        help='Page url to request')
    parser.add_argument(
        '-e', '--ext', 
        nargs='+',
        help='Extension(s) to find')    
    parser.add_argument(
        '-d', '--dest', 
        default=None,
        help='Destination where to save the files')
    parser.add_argument(
        '-p', '--par', 
        action='store_true', default=False, 
        help="Turns on parallel download")
    args = parser.parse_args()

    # Recover files to download
    all_links = collect_all_url(args.url, args.ext)

    # Download
    if not args.par:
        for l in all_links:
            try:
                filename = download_file(l, args.dest)
                print(l)
            except Exception as e:
                print("Error while downloading: {}".format(e))
    else:
        from multiprocessing.pool import ThreadPool
        results = ThreadPool(10).imap_unordered(
            lambda x: download_file(x, args.dest), all_links)
        for p in results:
            print(p)

इसके उपयोग का एक उदाहरण है:

python3 soupget.py -p -e <list of extensions> -d <destination_folder> -u <target_webpage>

और एक वास्तविक उदाहरण यदि आप इसे क्रिया में देखना चाहते हैं:

python3 soupget.py -p -e .xlsx .pdf .csv -u https://healthdata.gov/dataset/chemicals-cosmetics
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.