web-dev-qa-db-ja.com

基本的なhttpファイルのダウンロードとpythonのディスクへの保存?

私は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

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

ありがとうございます。

136
arvindch

ファイルをダウンロードするためのきれいな方法は次のとおりです。

import urllib

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

これはWebサイトからファイルをダウンロードし、それをfile.gzと命名します。これは、 urllibとpython 経由で写真をダウンロードすることからの、私のお気に入りの解決策の1つです。

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

188
Blue Ice

前述のとおり ここ

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

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

101
dparpyani

私は wget を使います。

あなたが例証したいなら、シンプルで良い図書館?

import wget

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

file_name = wget.download(file_url)

wgetモジュールはpython 2とpython 3のバージョンをサポート

32
Ali

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 __== '__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の関数呼び出し

25
Saurabh yadav

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

import subprocess

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

Python3 +の場合URLopenerは推奨されません。そして使用すると以下のようにエラーになります。

url_opener = urllib.URLopener()AttributeError:モジュール 'urllib'には属性 'URLopener'がありません

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

import urllib.request 
urllib.request.urlretrieve(url, filename)
1
Om Prakash Sao

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

ファイアウォールを無効にする(lazy)/ルールを編集して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ライブラリは一種のペアダウンですが、オープンソースのweaselインストーラはhttpsにurllibを使用しているようでした。

0
Jayme Snyder