Python kullanarak HTTP üzerinden bir dosya indirebilirim?

oy
678

Ben programa bir web sitesinden bir MP3 indirmek için kullandığımız bir küçük yarar ve daha sonra / Açıkçası iTunes'a eklediğiniz bir podcast XML dosyası günceller oluşturur.

Yaratan metin işleme / XML dosyası Python ile yazılmış günceller. Bir Windows iç wget kullanmak .batancak gerçek MP3 indirmek için dosyanın. Gerçi Python ile yazılmış tüm yarar olmasını tercih ederim.

Ben başvurdu böylece neden aslında aşağı Python dosyası yüklemek için bir yol bulmak için olsa mücadele wget.

Yani, nasıl Python kullanarak dosyayı indiririm?

Oluştur 22/08/2008 saat 16:34
kaynak kullanıcı
Diğer dillerde...                            


24 cevaplar

oy
382

Python 2'de, standart kütüphane ile birlikte gelir urllib2 kullanın.

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

Bu kütüphaneyi kullanmaya en temel yolu, eksi herhangi bir hata işleme olduğunu. Ayrıca bu tür değişen başlıkları gibi daha karmaşık şeyler yapabilir. Dokümantasyon bulunabilir burada.

Cevap 22/08/2008 saat 16:38
kaynak kullanıcı

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

wbIçinde open('test.mp3','wb')bir dosyayı açtığında (ve varolan herhangi bir dosyayı siler) sadece metin yerine onunla verileri kaydedebilmek için ikili modda.

Cevap 22/08/2008 saat 16:58
kaynak kullanıcı

oy
12

Ben urllib2 daha tamamlandığında, Corey ile anlaşmak urllib ve büyük olasılıkla daha karmaşık şeyler yapmak istiyorsanız kullanılır modül olmalı, ama sadece temelleri isterseniz urllib daha basit modülüdür, cevaplar rahat ettirmek için:

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

Iyi çalışır. Veya, Arayabileceğin "yanıt" nesne ile uğraşmak istemiyorsanız ) (okuma doğrudan:

import urllib
mp3 = urllib.urlopen('http://www.example.com/sound.mp3').read()
Cevap 22/08/2008 saat 16:58
kaynak kullanıcı

oy
926

Kullanılarak tane daha, urlretrieve:

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

(Python için 'ithal urllib.request' ve urllib.request.urlretrieve kullanmak 3+)

Henüz başka bir, bir "progressbar" ile

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()
Cevap 22/08/2008 saat 17:19
kaynak kullanıcı

oy
286

2012 yılında, kullanmak piton istekleri kütüphane

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

Kaçabilirsiniz pip install requestsalmak için.

API çok daha kolaydır çünkü İstekler alternatifleri üzerinde birçok avantajı vardır. Kimlik doğrulama yapmak varsa, bu özellikle doğrudur. urllib ve urllib2 bu durumda oldukça unintuitive ve ağrılıdır.


2015/12/30

İnsanlar ilerleme çubuğunun hayranlığını dile getirdiler. Kesinlikle öyle serin. Birkaç off-the-raf çözümleri dahil şimdi vardır 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)

Bu aslında @kvance 30 ay önce açıklanan uygulamasıdır.

Cevap 24/05/2012 saat 21:08
kaynak kullanıcı

oy
18

Python 2/3 için PabloG kod geliştirilmiş sürümü:

#!/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)
Cevap 13/05/2013 saat 09:59
kaynak kullanıcı

oy
16

Yazdı wget sadece bu amaç için saf Python kütüphanesi. Bu kadar pompalanır urlretrieveile bu özelliklerin sürüm 2.0 itibariyle.

Cevap 25/09/2013 saat 18:55
kaynak kullanıcı

oy
1

Bu biraz geç olabilir, Ama pabloG kodunu gördü ve bir os.system ( 'cls') AWESOME görünmesi için ekleme tutamadı! Buna bir bak :

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

Windows dışında bir ortamda çalışıyorsa varsa, o zaman başka bir şeyi 'cls' kullanmak zorunda kalacaktır. MAC OS X ve Linux'ta bu açığa 'olmalıdır.

Cevap 14/10/2013 saat 03:54
kaynak kullanıcı

oy
2

Kaynak kodu olabilir:

import urllib
sock = urllib.urlopen("http://diveintopython.org/")
htmlSource = sock.read()                            
sock.close()                                        
print htmlSource  
Cevap 26/11/2013 saat 14:21
kaynak kullanıcı

oy
6

Siz de urlretrieve ile ilerleme geribildirim alabilirsiniz:

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)
Cevap 26/01/2014 saat 14:12
kaynak kullanıcı

oy
14

wget modülü kullanmak:

import wget
wget.download('url')
Cevap 25/03/2015 saat 12:59
kaynak kullanıcı

oy
60

Python 3