import glob
import os

data_Path = os.path.join(os.getcwd(), 'data')

# # '*'는 임의 길이의 모든 문자열을 의미한다.
output = glob.glob(data_Path + '/*.txt')
print(output)
print('-' * 20) 

# '?'는 한자리의 문자를 의미한다.
output = glob.glob(data_Path + '/temp?.txt')
print(output)
print('-' * 20)  

# '[2-3]'은 2~3사이의 숫자를 의미한다.
output = glob.glob(data_Path + '/temp[2~3]?.txt')
print(output)
print('-' * 20)

# recursive=True는 하위경로 검색여부이다.
output = glob.glob(data_Path + '/*.txt', recursive=True)
print(output)

Requests를 이용하여 URL 파일 다운로드 저장

다운로드 URL을 가지고 파일을 다운받아 저장하여 보자
request모듈은 PUT, GET, POST, HEAD, PATCH, DELETE, OPTIONS 가 있다
요청 방식에따라 알맞은 메소드를 사용하면 된다

일반적인경우

get을 사용하여 다운로드 받을수 있다

import requests

url = 'https://www.facebook.com/favicon.ico'
file = requests.get(url)

open('D:\\facebook.ico', 'wb').write(file.content)

로그인이 필요한경우

로그인이 필요한경우는 세션을 만든뒤에 로그인을 해주고 그뒤에 파일을 요청해야 파일다운로드가 가능하다

  • 다운받을 사이트의 로그인 동작확인
  • 로그인요청
  • 로그인 후 파일요청

사이트마다 다르기는 하겠지만 보통 ID, PW를 입력받고 로그인 절차를 진행하게 될것이다 요새는 SCRF정보를 로그인정보에 포함하거나 로그인 URL에 정보를 포함하여 보안 검사를 하는것 같다 지금 테스트 하는 사이트는 from태그에 action 속성을 써서 로그인 요청을 할때마다 URL이 변경된다

사이트 정보를 확인해보자 브라우저에서 개발자 툴킷을 실행한다 보통 단축키가 F12

ID, PW입력 Input태그의 ID속성 form 태그의 action속성을 확인한다 로그인정보 입력시에 넣어야한다

ID와 PW를 입력할 속성을 확인하였으니 로그인 정보에 해당하는 ID를 넣어서
로그인한 세션을 반환하는 펑션을 만든다

import requests
from bs4 import BeautifulSoup as bs

LOGIN_INFO = {
    'login': 'test_user', # ID입력 속성 ID, <<login_id>>
    'password': '1234'    # PW입력 속성 ID, <<login_pw>>
}

def get_login_session(url):
    s = requests.Session()
    # html소스 가져오기
    first_page  = s.get(url, verify=False)
    html = first_page.text
    soup = bs(html, 'html.parser')
    # from 태그 중에서 method가  post인 것을 찾음.
    form_tag = soup.find('form', {'method': 'post'}) 
    if(form_tag is not None):
        print(form_tag['action'])
        login_url = default_url + form_tag['action']
        login_result = s.post(login_url, data=LOGIN_INFO, verify=False)
        return s

다운로드 url에 접속하면 로그인페이지가 나온다 first_page에는 따라서 로그인 페이지의 html이 들어있다
BeautifulSoup을 이용하여 원하는 태그를 가져오고 속성 action값을 확인한다
테스트 사이트는 기본 url뒤에 action속성값을 추가하여 url을 생성하여서 기본url뒤에 action속성값을 더해서 login_url을 만든다
login_urlLOGIN_INFO를 정보를 담아서 post 메소드를 실행한다
verify 옵션은 ssl인증서 확인 비활성화 옵션이다
login_result의 login_result.status_code의 값이 200이면 로그인 성공이고 400, 404등의 코드이면 로그인 실패이다 코드에 따라 문제를 확인하여 해결하면 된다

저장하는 코드를 추가하여 다운로드 하여보자

import requests
from bs4 import BeautifulSoup as bs

download_url = 'https://localhost:8000/files/test.txt?827cc19%7Cb09b72a6db1b79586b7d3e6e5bb4ac5d%7C1652694385'
default_url = 'https://localhost:8000/
LOGIN_INFO = {
    'login': 'test_user', # ID입력 속성 ID, <<login_id>>
    'password': '1234'    # PW입력 속성 ID, <<login_pw>>
}

def get_login_session(url):
    s = requests.Session()
    # html소스 가져오기
    first_page  = s.get(url, verify=False)
    html = first_page.text
    soup = bs(html, 'html.parser')
    # from 태그 중에서 method가  post인 것을 찾음.
    form_tag = soup.find('form', {'method': 'post'}) 
    if(form_tag is not None):
        print(form_tag['action'])
        login_url = default_url + form_tag['action']
        login_result = s.post(login_url, data=LOGIN_INFO, verify=False)
        return s

session = get_login_session(download_url)
file = session.get(download_url)
open('D:\\test.txt', 'wb').write(file.content)

test.txt 파일이 다운로드가 된다

'개발' 카테고리의 다른 글

[Python] glob으로 경로 검색  (0) 2022.06.17
[Python] SMB서버 파일 읽어서 압축 저장하기  (0) 2022.05.12

aliases : [서버파일다운, 파일압축, 이미지바이트배열변환]
tags : 서버파일저장, 압축파일저장, SMBConnection


로컬에 파일을 저장하지 않고 압축파일만 저장해보자

서버에서 파일을 읽어서 D:/temp.zip로 저장한다

<<temp>>항목은 알맞게 변경하자


from smb.SMBConnection import SMBConnection
import platform   

user = <<user>>
pssward = <<pssward>>
sharName = <<sharName>>
ip = <<ip>>
path = <<path>>
extension = 'jpg'  

def make_datapath_list(conn, sharName, path, extension):
    """
    서버의 폴더 하위의 모든 파일중 extension을 포함하는 해당하는 리스트를 만든다
    extension: 이름의 일부분이나 확장자를 주면됨
    """
    path_list = []      
    dir = conn.listPath(sharName, path)      
    for e in dir:
        if e.isDirectory and e.filename not in ['.', '..']:
            filepath = path + '/' +e.filename
            path_list.extend(make_datapath_list(conn, sharName, filepath, extension))                
        elif extension in e.filename:
            path_list.append(path + '/' +e.filename)
    return path_list  

#SMB 연결
conn = SMBConnection(user, pssward, platform.uname().node,
        sharName, domain='WORKGROUP', use_ntlm_v2=True)
conn.connect(ip, 139)  



#파일 목록 구하기

path_list = make_datapath_list(conn, sharName, path, extension)  

#압축없이 파일 저장 하기
# for path_item in path_list:
#     split_path = path_item.split('/')  # 파일명 구하기
#     fileName = split_path[-1]
#     with open('D:/temp/' + fileName, 'wb') as fp:
#         conn.retrieveFile(sharName, path_item, fp)

#압축하여 파일저장
#로컬에 Zip파일만 저장됨
flo = BytesIO()        
images = []          

# 파일읽어옴
for path_item in path_list:
    conn.retrieveFile(sharName, path_item, flo)
    flo.seek(0)          
    split_path = path_item.split('/')  # 파일명 구하기
    fileName = split_path[-1]
    images.append([fileName, flo])    # [파일명, 받은파일]
    # print(split_path[-1]) # 이름출력



# 읽은파일 압축하여 저장
zip_file_bytes_io = BytesIO()
with ZipFile(zip_file_bytes_io, 'w') as zip_file:
    for image_name, bytes_stream in images:
        zip_file.writestr(image_name, bytes_stream.getvalue())   

with open('D:/temp.zip', 'wb') as f:    
    f.write(zip_file_bytes_io.getvalue())    

conn.close()

'개발' 카테고리의 다른 글

[Python] glob으로 경로 검색  (0) 2022.06.17
[Python] Requests를 이용하여 URL 파일 다운로드 저장  (0) 2022.05.19

+ Recent posts