python - urlretrieve - 파이썬 동영상 다운로드




파이썬을 사용하여 HTTP를 통해 파일을 다운로드하려면 어떻게해야합니까? (15)

파이썬 3

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

파이썬 2

  • urllib2.urlopen (감사합니다 Corey )

    import urllib2
    response = urllib2.urlopen('http://www.example.com/')
    html = response.read()
    
  • urllib.urlretrieve (감사합니다 PabloG )

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

필자는 일정에 따라 웹 사이트에서 MP3를 다운로드하는 작은 유틸리티를 가지고 있으며 iTunes에 분명히 추가 한 podcast XML 파일을 작성 / 업데이트합니다.

XML 파일을 생성 / 업데이트하는 텍스트 처리는 Python으로 작성됩니다. 그러나 Windows .bat 파일 안의 wget을 사용하여 실제 MP3를 다운로드합니다. 파이썬으로 작성된 전체 유틸리티를 선호합니다.

나는 실제로 파이썬에서 파일을로드하는 방법을 찾기 위해 애를 썼다. 그래서 나는 왜 wget 의지했다.

그렇다면 파이썬을 사용하여 파일을 어떻게 다운로드합니까?


2012 년에는 Python 요청 라이브러리를 사용하십시오.

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

pip install requests 을 실행하여 얻을 수 있습니다.

요청은 API가 훨씬 간단하기 때문에 대안보다 많은 장점이 있습니다. 인증을해야하는 경우 특히 그렇습니다. 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)

이것은 본질적으로 30 개월 전에 설명 된 구현입니다.


Python 2에서는 표준 라이브러리와 함께 제공되는 urllib2를 사용합니다.

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

이것은 오류 처리를 제외한 라이브러리를 사용하는 가장 기본적인 방법입니다. 헤더 변경과 같은보다 복잡한 작업을 수행 할 수도 있습니다. 설명서는 here. 에서 찾을 수 here.


python3에서는 urllib3과 libilires를 사용할 수 있습니다. pip 또는 pip3을 사용하여 다운로드하십시오 (python3이 기본값인지 여부에 따라 다름)

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 을 사용한다는 점에 유의하십시오.


wget 모듈 사용 :

import wget
wget.download('url')

wget이 설치되어 있으면 parallel_sync를 사용할 수 있습니다.

pip install 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

이것은 꽤 강력합니다. 파일을 병렬로 다운로드하고, 실패시 다시 시도 할 수 있으며, 원격 컴퓨터에서 파일을 다운로드 할 수도 있습니다.


나는 바닐라 파이썬 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 MB 테스트 .zip입니다.

다음은 파이썬에서 파일을 다운로드하는 데 가장 일반적으로 사용되는 호출입니다.

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

  2. urllib2.urlopen('url_to_file')

  3. requests.get(url)

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

참고 : urlopenurlretrieve 는 크기가 큰 파일 (크기가 500MB 이상)을 다운로드 할 때 상대적으로 나쁜 것으로 나타납니다. requests.get 은 다운로드가 완료 될 때까지 파일을 메모리에 저장합니다.


당신은 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)

소스 코드는 다음과 같습니다.

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

완전성을 위해서, subprocess 패키지를 사용하여 파일을 검색하는 프로그램을 호출 할 수도 있습니다. 파일 검색 전용 프로그램은 urlretrieve 와 같은 Python 함수보다 강력합니다. 예를 들어 wget 은 디렉토리를 재귀 적으로 다운로드 할 수 있고 ( -R ) FTP, 리디렉션, HTTP 프록시를 처리 할 수 ​​있으며 기존 파일 ( -nc )을 다시 다운로드하지 aria2 수 있습니다. 다운로드를 병렬화하십시오.

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

Jupyter Notebook에서 ! 사용하여 직접 프로그램을 호출 할 수도 있습니다 ! 통사론:

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

이 목적으로 순수 파이썬으로 wget 라이브러리를 작성했습니다. 버전 2.0에서 이러한 기능 을 사용하여 urlretrieve 를 실행 합니다 .


파이썬 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()

하나 더, urlretrieve 사용 :

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

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

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




urllib