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