이전까지는 ftp 로 자료 받을수 있어지만 ftp 중지되어
이제는 웹 에서 로그인후 자료를 다운받아야 한다.
API 있을것으로 사료되지만 API 사용하기전 직접 로그인후 다운받는 작업을 공유해보기로 한다.
- cmegroup 로그인후
- https://www.cmegroup.com/ftp/btic/BTIC_Weekly_Liquidity_Report.pdf 다운로드
작업은 위와 같이 간단하지만 인증구현/다운로드 부분 많이 까다롭다.
지금까지 연구한 상황을 공유해본다.
. 로그인 부분에 대해서는 X-XSRF-TOKEN 사용하고 있어 아이디/비번 으로 바로 로그인 할수가 없다.
초기페이지나 로그인 하기전에 X-XSRF-TOKEN 가져오는 부분이 있는데 확인 할수가 없다.
fiddler, wireShark 이용한 패킷 분석해도 말이다. -,.-
아쉬운데로 크롬 개발자 도구로 아래 주소 접속한후
https://login.cmegroup.com/sso/accountstatus/showAuth.action
Cookie 와 XSRF-TOKEN 값을 수동으로 가져온다.
가져온 Cookie 값을 python 소스에 입력해준다.
from bs4 import BeautifulSoup as bs
import requests
MEMBER_DATA = {
'userName': '아이디',
'password': '비번'
}
headers = {
'Pragma': 'no-cache',
'Cache-Control': 'no-cache',
'Accept': 'application/json',
'X-XSRF-TOKEN': 'fd99c5fc6fd51471',
'Content-Type': 'application/json',
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36',
'sec-ch-ua-platform': "macOS",
'Origin': 'https://login.cmegroup.com',
'Sec-Fetch-Site': 'same-origin',
'Sec-Fetch-Mode': 'cors',
'Sec-Fetch-Dest': 'empty',
'Referer': 'https://login.cmegroup.com/sso/accountstatus/showAuth.action',
'Accept-Language': 'ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7,und;q=0.6',
'Cookie' : 'JSESSIONID=DC05516BE124BE19651A29CEC7889D49D33B8ACE063F2149B6EA5B8E2A9BB788; XSRF-TOKEN=fd99c5fc6fd51471;'
}
with requests.Session() as s:
request = s.post('https://login.cmegroup.com/sso/authservice/authenticateCredential.action', headers=headers, json=MEMBER_DATA, verify=False)
print(request.text);
url2 = 'https://www.cmegroup.com/ftp/btic/BTIC_Weekly_Liquidity_Report.pdf'
r = requests.get(url2, allow_redirects=True, verify=False)
open('zzz.pdf', 'wb').write(r.content)
결과
로그인이 되지 않았을때에는
{"errorCode":"CSRF_MISMATCH","errorMessage":"We are unable to process your request due to CSRF token validation mismatch. Please try again. If the problem persists, please restart your browser.[ea78f35e-7466-4471-a27b-070f97660cd0]","rootErrorMessage":null,"data":null,"requestInfo":null}
로그인이 정상적이면 아래와 같은 json 얻을수 있다.
{"status":"CREDENTIAL_MATCHES","email":"zzz@msn.com","message":null,"showCaptcha":false}
위에서 보았듯이 크롬에서 접속해 있는 Cookie 를 이용하기 때문에
로그인이 정상적으로 된후 크롬에서 새로고침하면 로그인이 된 상태로 나온다.
그 이유는 같은 Cookie 내용을 사용하고 있으니까...
그 후 BTIC_Weekly_Liquidity_Report.pdf 다운로드 받는 부분에 대해서는 3분이상 멈춰있는 상태이다.
파일 다운로드 받는 코드는 잘 되는데 말이다.
import requests
url = 'https://www.facebook.com/favicon.ico'
r = requests.get(url, allow_redirects=True, verify=False)
open('facebook.ico', 'wb').write(r.content)
이슈
어느순간 아래와 같은 에러 메세지를 발생하는데 아래 링크 참고후 적용하였다.
raise MaxRetryError(_pool, url, error or ResponseError(cause))
urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='trytoso.tistory.com', port=443): Max retries exceeded with url: /manage/posts.json (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1123)')))
아래와 같이 verify=False 해주면 된다고 한다.
r = requests.get(url2, allow_redirects=True, verify=False)
하지만 아래 에러는 계속 난다. T.T
/usr/local/lib/python3.8/site-packages/urllib3/connectionpool.py:1013: InsecureRequestWarning: Unverified HTTPS request is being made to host 'trytoso.tistory.com'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
warnings.warn(
'프로그래밍 > Python' 카테고리의 다른 글
python 원격지 파일 다운로드 (0) | 2021.10.21 |
---|---|
python 그누보드 로그인후 메모페이지 크롤링 (0) | 2021.10.21 |