Pythonで基本的なhttpファイルをダウンロードしてディスクに保存しますか?


159

私はPythonを使い始めたばかりで、質問に対する回答を得るために、このサイトでQ&Aを行っています。しかし、私は初心者であり、いくつかの解決策を理解するのは難しいと思います。非常に基本的な解決策が必要です。

誰かが「http経由でファイルをダウンロードする」および「Windowsでディスクに保存する」ための簡単な解決策を私に説明してくれませんか?

shutilとosモジュールの使い方もわかりません。

ダウンロードしたいファイルは500 MB以下で、.gzアーカイブファイルです。誰かがアーカイブを抽出してその中のファイルを利用する方法を誰かが説明できれば、それは素晴らしいことです。

以下は、さまざまな回答を組み合わせて書いた部分的な解決策です。

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

誰かがエラーを指摘し(初心者レベル)、これを行うためのより簡単な方法を説明できますか?

ありがとう!

回答:


206

ファイルをダウンロードするクリーンな方法は次のとおりです。

import urllib

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

これにより、Webサイトからファイルがダウンロードされ、名前が付けられfile.gzます。これは、urllibとpythonを介して画像をダウンロードすることから、私のお気に入りのソリューションの1つです。

この例ではurllibライブラリを使用しており、ソースからファイルを直接取得します。


3
わかりました、ありがとう!しかし、リクエストを通じてそれを機能させる方法はありますか?
arvindch 2013年

5
/myfolder/file.gzに保存する可能性はありますか?
John Snow

17
たぶん、自分で試してみることほど良い可能性はありませんか?:)私はうまくできましたtestfile.retrieve("http://example.com/example.rpm", "/tmp/test.rpm")
ダルミット2014

18
これはPython 3.3以降非推奨であり、urllib.request.urlretrieveソリューション(以下の回答を参照)は「モダン」な方法です
MichielB

1
このコードにユーザー名とパスワードを追加する最良の方法は何ですか?tks
Estefy

109

ここで述べたよう

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

EDIT:それでもリクエストを使用したい場合は、この質問またはこれをご覧ください


1
urllibは機能しますが、多くの人がurllibよりもリクエストの使用を推奨しているようです。なんで?
arvindch 2013年

2
requestsurllibREST APIを使用する場合に比べて非常に便利です。あなたがもっともっとやろうとしているのでなければ、これは良いはずです。
dparpyani 2013年

さて、リクエストの使用のために提供したリンクを読みました。ダウンロードを保存するために、ファイルパスを宣言する方法について混乱しています。これにosとshutilをどのように使用しますか?
arvindch 2013年

62
Python3の場合:import urllib.request urllib.request.urlretrieve(url, filename)
Flash

1
ダウンロードが失敗した場合、これでhttpステータスコードを抽出できません
Aashish Thite

34

私はwgetを使用します。

あなたが例を挙げたいなら、シンプルで良いライブラリですか?

import wget

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

file_name = wget.download(file_url)

wgetモジュールがpython 2およびpython 3バージョンをサポート


33

wget、urllib、およびrequestを使用する4つのメソッド。

#!/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秒で4469882関数呼び出し(4469842プリミティブ呼び出し)

testRequest2-0.072秒で8580関数呼び出し(8574プリミティブ呼び出し)

testUrllib-0.036秒で3810関数呼び出し(3775プリミティブ呼び出し)

testwget-0.020秒で3489関数呼び出し


1
関数呼び出しの数をどのように取得しましたか?
アブデルハク2018

28

以下のためのpython3 + URLopener推奨されていません。使用すると、次のようなエラーが発生します。

url_opener = urllib.URLopener()AttributeError:module 'urllib' has no attribute 'URLopener'

だから、試してみてください:

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

1
奇妙なことです。なぜPython 2が非推奨になり、このソリューションだけが適切に機能するときに、誰もこの回答に投票しないのです...
wowkin2

1
同意しました!私は以前の解決策に髪を引っ張っていました。200回賛成票を投じたいと思います。
Yechiel K

5

エキゾチックなWindowsソリューション

import subprocess

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

1

ESXiのwgetがSSLでコンパイルされておらず、OVAをベンダーのWebサイトから世界の反対側にあるESXiホストに直接ダウンロードしたかったので、この方法を始めました。

ルールを編集してファイアウォールを無効にする(怠惰)/ httpsを有効にする(適切)

pythonスクリプトを作成しました:

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ライブラリはペアになっていますが、オープンソースのイタチインストーラはhttpsにurllibを使用しているように見えたので、このパスをたどるように促しました


-5

ファイルを保存するもう1つのクリーンな方法は次のとおりです。

import csv
import urllib

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

これはおそらく、urllib.urlretrieveまたはurllib.URLopener().retrieve、ここで何を意味するのか不明です。
mateor '24

9
ファイルに名前を付けるだけの場合、なぜcsvをインポートするのですか?
Azeezah M 2016
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.