하얀설표 블로그




예제)파이썬 requests.Session 사용방법과 활용방법





( 수정됨)


Session.request

requests.get과 requests.post 등의 명령이 requests.request을 사용하던 것과 마찬가지로 세션의 get, post, put 등의 요청도 세션.request(method, url) 명령을 기반으로 한다.

import requests
with requests.Session() as s:
    r = s.request('get', 'https://httpbin.org/get')
    print(r.status_code)
    r = s.get('https://httpbin.org/get')
    print(r.status_code)

>> 200
200

headers의 상속

세션의 headers를 설정하면 세션에서 사용하는 요청은 모두 세션의 헤더를 사용한다.

코드

import requests
with requests.Session() as s:
    s.headers.update({'key1': 'value1'})
    print(s.headers)
    r = s.get('https://httpbin.org/headers')
    print(f"r.headers : {r.headers}")
    print(f"r.request.headers : {r.request.headers}")
    print(f"r.json() : {r.json()}")

>> r.headers : {'Date': 'Fri, 07 Jul 2023 05:03:48 GMT', 'Content-Type': 'application/json', 'Content-Length': '248', 'Connection': 'keep-alive', 'Server': 'gunicorn/19.9.0', 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Credentials': 'true'}
r.request.headers : {'User-Agent': 'python-requests/2.31.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'key1': 'value1'}
r.json() : {'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Host': 'httpbin.org', 'Key1': 'value1', 'User-Agent': 'python-requests/2.31.0', 'X-Amzn-Trace-Id': 'Root=1-64a79c9f-2a306c46642dfe17014765a8'}}

cookies의 상속

헤더와 마찬가지로 쿠키도 상속된다. 세션의 cookies를 설정하면 된다.

코드

import requests
with requests.Session() as s:
    s.cookies.update({'key1': 'value1'})
    print(s.cookies)
    r = s.get('https://httpbin.org/cookies')
    print(f"r.cookies : {r.cookies}")
    print(f"r.json() : {r.json()}")

>> {'User-Agent': 'python-requests/2.31.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'key1': 'value1'}
r.headers : {'Date': 'Fri, 07 Jul 2023 04:53:16 GMT', 'Content-Type': 'application/json', 'Content-Length': '248', 'Connection': 'keep-alive', 'Server': 'gunicorn/19.9.0', 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Credentials': 'true'}
r.json() : {'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Host': 'httpbin.org', 'Key1': 'value1', 'User-Agent': 'python-requests/2.31.0', 'X-Amzn-Trace-Id': 'Root=1-64a79a3b-2e522e6d2365ba820a484ade'}}

parameter의 상속

파라미터 역시 상속된다.

코드

import requests
with requests.Session() as s:
    s.params = {'key1': 'value1'}
    r = s.get('https://httpbin.org/get')
    print(r.url)
    print(r.request.url)
    print(r.json())

>> https://httpbin.org/get?key1=value1
https://httpbin.org/get?key1=value1
{'args': {'key1': 'value1'}, 'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Host': 'httpbin.org', 'User-Agent': 'python-requests/2.31.0', 'X-Amzn-Trace-Id': 'Root=1-64a79d80-353ce1d623a8a32f25a09c0a'}, 'origin': '180.66.204.185', 'url': 'https://httpbin.org/get?key1=value1'}

최대 리다이렉트 횟수 변경

코드

requests 모듈에서 설정한 리다이렉트 최대 횟수는 30회인데, 이를 30회보다 많게, 또는 적게 변경하려면 세션 객체를 사용해야한다.
단순히 리다이렉트를 금지하거나 리다이렉트되었는지 확인하려면 이것보다는 requests 객체의 리다이렉트 유무를 판단하거나 리다이렉트를 금지시키는 기능을 사용하는게 좋다.

import requests
url = 'https://httpbin.dev/redirect/31'
with requests.session() as s:
    s.max_redirects = 32
    r = s.get(url)
    r.raise_for_status()
   print(r.status_code)

>> 200

활용방법

주로 이용되는 것은 로그인과 같이 쿠키나 헤더값을 가져오는 작업을 할 때다.
파이썬 requests 로그인이라는 검색어로 검색해보면 다양한 사이트를 requests 모듈로 로그인하는 방법들을 찾아볼수 있다.

로그인 세션 유지 외에도 활용할 곳은 다양한데, 다음은 api의 인증키를 공유하는 코드의 예시다.
세션 파라미터에 인증키만을 설정한 다음, 각 api에서 사용하는 파라미터만 등록했지만 실제 요청에서는 세션의 파라미터도 사용된 것을 확인할 수 있다.

이처럼 다수의 url에 요청을 보내야할 때, 공통으로 사용하는 값이 있다면 세션을 이용해 반복입력을 피할 수 있다.

코드

import requests
with requests.Session() as s:
    s.params = {'crtfc_key': '{API 인증키}'}
    r = s.get('https://opendart.fss.or.kr/api/company.json',
        params = {'corp_code': '00126380'}
    )
    print(r.url)
    print(r.json())
    r = s.get('https://opendart.fss.or.kr/api/list.json')
    print(r.url)
    print(r.json())

>> https://opendart.fss.or.kr/api/company.json?crtfc_key={API 인증키}&corp_code=00126380
{'status': '000', 'message': '정상', 'corp_code': '00126380', 'corp_name': '삼성전자(주)', 'corp_name_eng': 'SAMSUNG ELECTRONICS CO,.LTD', 'stock_name': '삼성전자', 'stock_code': '005930', 'ceo_nm': '한종희, 경계현', 'corp_cls': 'Y', 'jurir_no': '1301110006246', 'bizr_no': '1248100998', 'adres': '경기도 수원시 영통구  삼성로 129 (매탄동)', 'hm_url': 'www.samsung.com/sec', 'ir_url': '', 'phn_no': '02-2255-0114', 'fax_no': '031-200-7538', 'induty_code': '264', 'est_dt': '19690113', 'acc_mt': '12'}
https://opendart.fss.or.kr/api/list.json?crtfc_key={API 인증키}&page_count=1
{'status': '000', 'message': '정상', 'page_no': 1, 'page_count': 10, 'total_count': 169, 'total_page': 17, 'list': [
    {'corp_code': '01490431', 'corp_name': '태가비엠', 'stock_code': '', 'corp_cls': 'E', 'report_nm': '감사보고서 (2023.03)', 'rcept_no': '20230707000217', 'flr_nm': '보현회계법인', 'rcept_dt': '20230707', 'rm': ''},
    {'corp_code': '00779845', 'corp_name': 'OCI스페셜티', 'stock_code': '', 'corp_cls': 'E', 'report_nm': '임원의변동', 'rcept_no': '20230707000216', 'flr_nm': 'OCI스페셜티', 'rcept_dt': '20230707', 'rm': '공'},
    {'corp_code': '00148984', 'corp_name': '조선내화', 'stock_code': '000480', 'corp_cls': 'Y', 'report_nm': '임원ㆍ주요주주특정증권등소유상황보고서', 'rcept_no': '20230707000215', 'flr_nm': '이인옥', 'rcept_dt': '20230707', 'rm': ''},
    {'corp_code': '00126292', 'corp_name': '삼성카드', 'stock_code': '029780', 'corp_cls': 'Y', 'report_nm': '임원ㆍ주요주주특정증권등소유상황보고서', 'rcept_no': '20230707000214', 'flr_nm': '삼성생명', 'rcept_dt': '20230707', 'rm': ''},
    {'corp_code': '00164876', 'corp_name': '케이비증권', 'stock_code': '003450', 'corp_cls': 'E', 'report_nm': '투자설명서(일괄신고)', 'rcept_no': '20230707000212', 'flr_nm': '케이비증권', 'rcept_dt': '20230707', 'rm': ''},
    {'corp_code': '00104856', 'corp_name': '삼성증권', 'stock_code': '016360', 'corp_cls': 'Y', 'report_nm': '투자설명서(일괄신고)', 'rcept_no': '20230707000211', 'flr_nm': '삼성증권', 'rcept_dt': '20230707', 'rm': ''},
    {'corp_code': '00299659', 'corp_name': '메가박스중앙', 'stock_code': '', 'corp_cls': 'E', 'report_nm': '[기재정정]최대주주등의 주식보유변동', 'rcept_no': '20230707000210', 'flr_nm': '메가박스중앙', 'rcept_dt': '20230707', 'rm': '공'},
    {'corp_code': '00251400', 'corp_name': 'BNK투자증권', 'stock_code': '', 'corp_cls': 'E', 'report_nm': '투자설명서(일괄신고)', 'rcept_no': '20230707000209', 'flr_nm': 'BNK투자증권', 'rcept_dt': '20230707', 'rm': ''},
    {'corp_code': '00104856', 'corp_name': '삼성증권', 'stock_code': '016360', 'corp_cls': 'Y', 'report_nm': '임원ㆍ주요주주특정증권등소유상황보고서', 'rcept_no': '20230707000207', 'flr_nm': '삼성생명', 'rcept_dt': '20230707', 'rm': ''},
    {'corp_code': '00164876', 'corp_name': '케이비증권', 'stock_code': '003450', 'corp_cls': 'E', 'report_nm': '일괄신고추가서류(파생결합증권-주가연계증권)', 'rcept_no': '20230707000206', 'flr_nm': '케이비증권', 'rcept_dt': '20230707', 'rm': ''}
]}


공감 : 0







white.seolpyo.com