Temel http dosyası indirme ve python diske kaydetme?


159

Python'da yeniyim ve sorumun cevabı için bu sitede Soru-Cevap bölümünden geçiyorum. Ancak, yeni başlayan biriyim ve bazı çözümleri anlamakta zorlanıyorum. Çok temel bir çözüme ihtiyacım var.

Birisi bana 'http ile dosya indirme' ve 'Windows'ta diske kaydetme' için basit bir çözümü açıklayabilir mi?

Shutil ve os modüllerinin nasıl kullanılacağından da emin değilim.

İndirmek istediğim dosya 500 MB'ın altında ve bir .gz arşiv dosyasıdır.

İşte çeşitli cevapların bir araya getirdiği kısmi bir çözüm:

import requests
import os
import shutil

global dump

def download_file():
    global dump
    url = "http://randomsite.com/file.gz"
    file = requests.get(url, stream=True)
    dump = file.raw

def save_file():
    global dump
    location = os.path.abspath("D:\folder\file.gz")
    with open("file.gz", 'wb') as location:
        shutil.copyfileobj(dump, location)
    del dump

Birisi hataları (başlangıç ​​seviyesi) gösterebilir ve bunu yapmak için daha kolay yöntemleri açıklayabilir mi?

Teşekkürler!

Yanıtlar:


207

Bir dosyayı indirmenin temiz bir yolu:

import urllib

testfile = urllib.URLopener()
testfile.retrieve("http://randomsite.com/file.gz", "file.gz")

Bu, bir web sitesinden bir dosya indirir ve adlandırır file.gz. Bu, urllib ve python ile resim indirmekten en sevdiğim çözümlerden biri .

Bu örnek urllibkitaplığı kullanır ve dosyayı doğrudan bir kaynak formdan alır.


3
Tamam teşekkürler! Ancak, isteklerle çalışmasını sağlamanın bir yolu var mı?
arvindch

5
/ Myfolder/file.gz dosyasına kaydetme imkanı var mı?
John Snow

17
Kendin denemekten daha iyi bir olasılık yok, belki? :) Başarıyla yapabilirim testfile.retrieve("http://example.com/example.rpm", "/tmp/test.rpm").
Dharmit

18
Bu Python 3.3'ten beri onaylanmamıştır ve urllib.request.urlretrieve çözümü (aşağıdaki cevaba bakınız) 'modern' yoldur
MichielB

1
Bu koda kullanıcı adı ve şifre eklemenin en iyi yolu nedir? tks
Estefy

110

As söz burada :

import urllib
urllib.urlretrieve ("http://randomsite.com/file.gz", "file.gz")

EDIT:Hala istekleri kullanmak istiyorsanız, bu soruya veya buna bir göz atın .


1
urllib işe yarayacaktır, ancak birçok kişi urllib üzerinden isteklerin kullanılmasını önermektedir. Nedenmiş?
arvindch

2
requestsurllibbir REST API ile çalışırken oldukça faydalıdır . Çok daha fazlasını yapmak istemiyorsanız, bu iyi olmalı.
dparpyani

Tamam, şimdi isteklerin kullanımı için sağladığınız bağlantıları okudum. İndirme işlemini kaydetmek için dosya yolunun nasıl bildirileceği konusunda kafam karıştı. Bunun için os ve shutil'i nasıl kullanırım?
arvindch

62
Python3 için:import urllib.request urllib.request.urlretrieve(url, filename)
Flash

1
İndirme başarısız olursa http durum kodunu
çıkaramıyorum

34

Kullandığım wget .

Basit ve iyi bir kütüphane örneği mi istiyorsunuz?

import wget

file_url = 'http://johndoe.com/download.zip'

file_name = wget.download(file_url)

wget modülü desteği python 2 ve python 3 sürümleri


33

Wget, urllib ve request kullanarak dört yöntem.

#!/usr/bin/python
import requests
from StringIO import StringIO
from PIL import Image
import profile as profile
import urllib
import wget


url = 'https://tinypng.com/images/social/website.jpg'

def testRequest():
    image_name = 'test1.jpg'
    r = requests.get(url, stream=True)
    with open(image_name, 'wb') as f:
        for chunk in r.iter_content():
            f.write(chunk)

def testRequest2():
    image_name = 'test2.jpg'
    r = requests.get(url)
    i = Image.open(StringIO(r.content))
    i.save(image_name)

def testUrllib():
    image_name = 'test3.jpg'
    testfile = urllib.URLopener()
    testfile.retrieve(url, image_name)

def testwget():
    image_name = 'test4.jpg'
    wget.download(url, image_name)

if __name__ == '__main__':
    profile.run('testRequest()')
    profile.run('testRequest2()')
    profile.run('testUrllib()')
    profile.run('testwget()')

testRequest - 20.236 saniyede 4469882 işlev çağrısı (4469842 ilkel çağrı)

testRequest2 - 0.072 saniyede 8580 işlev çağrısı (8574 ilkel çağrı)

testUrllib - 0.036 saniyede 3810 işlev çağrısı (3775 ilkel çağrı)

testwget - 0.089 saniyede 3489 işlev çağrısı


1
İşlev çağrılarının sayısını nasıl elde ettiniz?
Abdelhak

30

İçin Python3 + URLopener kullanımdan kaldırılmıştır. Ve kullanıldığında aşağıdaki gibi hata alırsınız:

url_opener = urllib.URLopener () AttributeError: 'urllib' modülünün 'URLopener' özelliği yok

O zaman dene:

import urllib.request 
urllib.request.urlretrieve(url, filename)

1
Tuhaf ... Python 2 kullanımdan kaldırıldığında ve bu çözümün düzgün çalışması gerektiğinde neden kimse bu cevaba oy vermiyor ...
wowkin2

1
Kabul! Saçlarımı daha önceki çözümlerin üzerine çekiyordum. 200 kez oy verebilseydim!
Yechiel K

5

Egzotik Windows Çözümü

import subprocess

subprocess.run("powershell Invoke-WebRequest {} -OutFile {}".format(your_url, filename), shell=True)

1

ESXi'nin aracı SSL ile derlenmediği için bu yola başladım ve bir tedarikçinin web sitesinden doğrudan dünyanın diğer tarafındaki ESXi ana bilgisayarına bir OVA indirmek istedim.

Güvenlik duvarını (tembel) devre dışı bırakmak / kuralları düzenleyerek https'yi etkinleştirmek zorunda kaldım (uygun)

python komut dosyasını yarattı:

import ssl
import shutil
import tempfile
import urllib.request
context = ssl._create_unverified_context()

dlurl='https://somesite/path/whatever'
with urllib.request.urlopen(durl, context=context) as response:
    with open("file.ova", 'wb') as tmp_file:
        shutil.copyfileobj(response, tmp_file)

ESXi kütüphaneleri eşleştirildi, ancak açık kaynaklı çakal yükleyici https için urllib kullanıyor gibiydi ... bu yüzden bu yolda ilerlememe ilham verdi


-5

Dosyayı kaydetmenin başka bir temiz yolu şudur:

import csv
import urllib

urllib.retrieve("your url goes here" , "output.csv")

Bu muhtemelen urllib.urlretrieveveya urllib.URLopener().retrieveburada kastettiğin belirsiz olmalıdır .
mateor

9
Sadece bir dosyayı adlandırıyorsanız neden csv'yi içe aktarıyorsunuz?
Azeezah M
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.