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

+ Recent posts