본문 바로가기
Python

[python] wget 사용 방법 파일 링크 다운로드 해보기

by 퍼포먼스마케팅코더 2022. 9. 7.
반응형

python wget 사용 방법 파일 링크 다운로드 해보기

오늘 가져온 파이선 패키지는 wget 패키지 입니다. wget을 파이썬으로 코딩할 때 가져왔을 때는 이유 중 하나입니다. 뭐냐면 requests에서 파이썬 코딩을 해서 안에 링크, 즉 웹페이지 링크를 파일로 저장하는 방법이 있습니다. 근데 나쁜 점은 링크 뒤에 파일 이름이 붙어 있잖아요. 그런데 예를 들어 파일 이름이 붙어 있지 않은 경우가 있습니다. 보통은 뒤에 파일명이 붙어있기 때문에 어떤 파일인지 알고 웹페이지에 링크를 저장합니다.

 

보통은 이 파일 이름을 정할 때 이 파일 형식도 반드시 지정해야 파일로 웹페이지 링크가 저장됩니다. 대표적인 경우가 url로 호출하여 얻을 수 있는 requests 형식이 대표적인 예입니다. 한가지 문제점이 뭐냐면, 만약 웹페이지에서 다운받을 때 링크에 저장되어 있던 파일 형식이 다르면  이름 파일 형식 없이 웹페이지를 다운받을 수 있도록 requests로 호출하여 다운받으면 임시 파일로 저장됩니다. 무슨형식인지 모르는 형태로 일시적으로 파일이 저장된겁니다. 그렇게 되면 곤란해지는거죠.

 

왜냐하면 어떤웹 페이지를 클릭해서 링크를 다운받았을때는 정상으로 다운받을 수 있습니다. 하지만 파이썬에서 엄청난 목록이 많은 것을 단번에 다운로드 했을 때는 문제가 많아집니다. 그런 경우를 대비해서 나온 것이 바로 이 wget이라는 방법이 그것을 대체할 수 있습니다.

 

이 wget이라고 하는 패키지를 파이썬에 설치해서 다운받고, 이것을 import시켜서 파일 링크를 다운받으면 정상적으로 다운받을 수 있습니다. 제가 확인한 결과로는 지금 현재 제가 사용하고 있던 곳은 최선입니다. 단점은 한글 파일명이면 현재 깨져서 나옵니다.

 

그런데 아쉬운 점은 wget이라는 패키지는 외국에서 만들어진 라이브러리이기 때문에 한글 이름으로 된 것을 정상적으로 링크 저장해서 다운받을 수 있도록 해 주는 인코딩이나 디코딩 정보를 찾아보았는데 아쉽게도 없었습니다.

 

아쉬운 방향으로 현재 여기까지는 완료되었지만 시간이 날 때 업그레이드 해 보겠습니다. 지금 방법을 찾고 있는 중이에요. 그런데 만약 파일 형식은 깨지지 않고 임시 파일로 저장되지 않고 원본 파일로 저장됩니다. 현재 이것을 공유하고 있습니다만, 나중에 한글 파일명이 깨지는 것을 보완할 방법을 찾으면 나중에 업데이트 해 두겠습니다. 여기까지입니다.

 

wget

장점 : 파일 형식을 모르는 다운로드 링크를 받아도 정상적으로 다운 가능.

단점: 한글로 된 파일명은 현재 깨짐. 방법 찾고 있는 중.

import wget
import os

f = open ('C:/Users/user/raw/down/test_urls.txt', 'r', encoding='utf-8') #URL 입력

urls = f.readlines()

#source = wget.filename_from_url(url)
#print(source)

urls_2 = []

############# 리스트 내 중복값 제거

for v in urls :
    if v not in urls_2 :
        urls_2.append(v) #중복한 리스트 값 제거
#print(new_list)
#len(new_list)


############# 웹페이지 링크 다운

blogId = 'ha8140' #블로그 ID
directory = 'C:/Users/user/raw/down/down_'+str(blogId)+''
try:
    if not os.path.exists(directory):
        os.makedirs(directory)  #폴더 없으면 생성
except OSError:
    print("Error: Failed to create the directory.") 


out_path = str(directory) #다운로드 경로

def download(url, out_path="."):
    wget.download(url, out=out_path)


n = 1
for url in urls_2 :
    try:
        download(url, out_path)
        print(str(n) + "의 파일 링크 저장 완료")
    except :
        pass
    n +=1
print("최종완료")
반응형

댓글