CodeGym /Java Course /Python SELF KO /๋„คํŠธ์›Œํฌ ์ž‘์—… ์‹ค์Šต

๋„คํŠธ์›Œํฌ ์ž‘์—… ์‹ค์Šต

Python SELF KO
๋ ˆ๋ฒจ 23 , ๋ ˆ์Šจ 3
์‚ฌ์šฉ ๊ฐ€๋Šฅ

4.1 ์‘๋‹ต ์ฒ˜๋ฆฌ

requests ๋ชจ๋“ˆ์€ ์„œ๋ฒ„ ์‘๋‹ต์„ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•œ ํŽธ๋ฆฌํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•ด.

์ƒํƒœ ์ฝ”๋“œ

์‘๋‹ต๊ณผ ํ•จ๊ป˜ ์„œ๋ฒ„๊ฐ€ ์š”์ฒญ ์ฒ˜๋ฆฌ ์ƒํƒœ๋„ ๋ณด๋‚ด์ง€. ์ƒํƒœ์— ๋Œ€ํ•œ ์ •๋ณด๋Š” status_code์™€ reason ํ•„๋“œ์— ์žˆ์–ด. ์•„๋ž˜ ์˜ˆ์ œ๋ฅผ ๋ด๋ด:


import requests

response = requests.get('https://jsonplaceholder.typicode.com/posts/1')
print(response.status_code)  # ์‘๋‹ต์˜ ์ƒํƒœ ์ฝ”๋“œ๋ฅผ ์ถœ๋ ฅ
print(response.reason)  # ์ƒํƒœ์— ๋Œ€ํ•œ ์„ค๋ช…์„ ์ถœ๋ ฅ
print(response.ok)  # ์ƒํƒœ ์ฝ”๋“œ๊ฐ€ 400 ๋ฏธ๋งŒ์ด๋ฉด True ๋ฐ˜ํ™˜
        

ํ—ค๋”

๋‹น์—ฐํžˆ HTTP ์š”์ฒญ์€ ํ—ค๋” ์—†์ด ๋ชป ๊ฐ€์ง€! ์š”์ฒญ ํ—ค๋”๋‚˜ ์‘๋‹ต ํ—ค๋”๊ฐ€ ํ•„์š”ํ•˜๋ฉด headers ํ•„๋“œ๋ฅผ ํ†ตํ•ด ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์–ด:


import requests

response = requests.get('https://jsonplaceholder.typicode.com/posts/1')
print(response.headers)  # ์‘๋‹ต ํ—ค๋”๋ฅผ ์ถœ๋ ฅ
print(response.headers['Content-Type'])  # ํŠน์ • ํ—ค๋” ๊ฐ’์„ ์ถœ๋ ฅ
            

์‘๋‹ต ๋ณธ๋ฌธ

์„œ๋ฒ„ ์‘๋‹ต์—๋Š” ๋ฐ”์ดํŠธ, ํ…์ŠคํŠธ, json ๋˜๋Š” xml์ด ํฌํ•จ๋  ์ˆ˜ ์žˆ์–ด. ์„œ๋ฒ„์— ์š”์ฒญํ•œ ๋‚ด์šฉ์„ ์•Œ๊ณ  ์žˆ๋‹ค๋ฉด, ์›ํ•˜๋Š” ํƒ€์ž…์˜ ๊ฐ์ฒด๋ฅผ ๋ฐ”๋กœ ์–ป๊ธฐ ์œ„ํ•ด ๋ฉ”์„œ๋“œ๋‚˜ ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด:


import requests

response = requests.get('https://jsonplaceholder.typicode.com/posts/1')
print(response.text)  # ํ…์ŠคํŠธ ํ˜•ํƒœ๋กœ ์‘๋‹ต ๋ณธ๋ฌธ ์ถœ๋ ฅ
print(response.json())  # JSON ํ˜•ํƒœ๋กœ ์‘๋‹ต ๋ณธ๋ฌธ ์ถœ๋ ฅ
print(response.content)  # ๋ฐ”์ดํŠธ ํ˜•ํƒœ๋กœ ์‘๋‹ต ๋ณธ๋ฌธ ์ถœ๋ ฅ
        

ํ—ค๋” (headers)์™€ ์‘๋‹ต ์ƒํƒœ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋„คํŠธ์›Œํฌ์˜ ์ž‘๋™ ๋ฐฉ์‹์— ๋Œ€ํ•œ ๊ฐ•์˜์—์„œ ๋‹ค๋ฃฐ ๊ฑฐ์•ผ.

4.2 ์—๋Ÿฌ ์ฒ˜๋ฆฌ

requests ๋ชจ๋“ˆ์€ ์—๋Ÿฌ๋ฅผ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋Š” ์˜ˆ์™ธ๋ฅผ ์ œ๊ณตํ•ด.

HTTP ํ‘œ์ค€์€ ์˜ˆ์™ธ๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š์•„, ๋Œ€์‹ ์— ์—๋Ÿฌ ์ฝ”๋“œ๋ฅผ (status_code) ์‚ฌ์šฉํ•ด. ์š”์ฒญ ์‹คํŒจ ์‹œ Python ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๊ณ  ์‹ถ๋‹ค๋ฉด, ํ•จ์ˆ˜ raise_for_status()๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ํ˜ธ์ถœํ•ด์•ผ ํ•ด.

์˜ˆ์ œ:


import requests

try:
    response = requests.get('https://jsonplaceholder.typicode.com/posts/1')
    response.raise_for_status()  # 4xx ๋ฐ 5xx ์ƒํƒœ ์ฝ”๋“œ๋ฅผ ์œ„ํ•œ ์˜ˆ์™ธ ๋ฐœ์ƒ
except requests.exceptions.HTTPError as err:
    print(f"HTTP error occurred: {err}")
except Exception as err:
    print(f"Other error occurred: {err}")
else:
    print("Success!")
        

์—๋Ÿฌ ์ฝ”๋“œ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋„คํŠธ์›Œํฌ์˜ ์ž‘๋™ ๋ฐฉ์‹์— ๋Œ€ํ•œ ๊ฐ•์˜์—์„œ ์•Œ์•„๋ณผ ์ˆ˜ ์žˆ์–ด.

4.3 ๋ฐ์ดํ„ฐ ์ „์†ก

JSON์ด ๋ฐœ๋ช…๋˜๊ธฐ ์ „์—๋Š” ๋Œ€๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•˜๊ธฐ ์œ„ํ•ด "ํผ"์„ ์‚ฌ์šฉํ–ˆ์–ด. ํผ์€ ๋ธŒ๋ผ์šฐ์ € ํŽ˜์ด์ง€์˜ ํŠน๋ณ„ํ•œ ๊ฐ์ฒด์ด์ž HTTP์—์„œ์˜ ๋ฐ์ดํ„ฐ ํ‘œ์ค€์ด์•ผ. ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์š”์ฒญ๊ณผ ํ•จ๊ป˜ data ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๋ฉด ๋ผ.

์ค‘์š”! GET ์š”์ฒญ์€ ์š”์ฒญ ๋ณธ๋ฌธ์„ ํฌํ•จํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•  ์ˆ˜ ์—†์–ด. ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋Š” URL์—๋งŒ ํฌํ•จ๋ผ.

GET ์š”์ฒญ์œผ๋กœ ๋ฐ์ดํ„ฐ ์ „์†ก

GET ์š”์ฒญ์—์„œ๋Š” URL์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•ด. ์˜ˆ์ œ๋ฅผ ๋ด๋ด:


import requests

params = {'key1': 'value1', 'key2': 'value2'}
response = requests.get('https://httpbin.org/get', params=params)
print(response.url)  # ์ถ”๊ฐ€๋œ ํŒŒ๋ผ๋ฏธํ„ฐ์™€ ํ•จ๊ป˜ URL ์ถœ๋ ฅ
    

ํผ ๋ฐ์ดํ„ฐ ์ „์†ก

๋ฐ์ดํ„ฐ๋ฅผ ์„œ๋ฒ„๋กœ ์ „์†กํ•˜๊ธฐ ์œ„ํ•ด POST ์š”์ฒญ์„ ์‚ฌ์šฉํ• ๊ฑฐ์•ผ.

์˜ˆ์ œ:


import requests

data = {
    'username': 'example',
    'password': 'password'
}
response = requests.post('https://httpbin.org/post', data=data)
print(response.json())
        

ํŒŒ์ผ ์ „์†ก

์ธํ„ฐ๋„ท์œผ๋กœ ์ด์ง„ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, ์˜ˆ๋ฅผ ๋“ค์–ด ์ด๋ฏธ์ง€๋ฅผ ์—…๋กœ๋“œํ•˜๋Š” ๊ฒฝ์šฐ, files ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ผ์„ ์š”์ฒญ์— ์ฒจ๋ถ€ํ•˜๋ฉด ๋ผ.

์˜ˆ์ œ:


import requests

files = {'file': open('example.txt', 'rb')}
response = requests.post('https://httpbin.org/post', files=files)
print(response.json())
        

์ •๋ง ๊ฐ„๋‹จํ•˜์ง€. ์—ฌ๋Ÿฌ ํŒŒ์ผ์„ ์ „์†กํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, files ๋ณ€์ˆ˜์— ์ž„์˜์˜ ์ด๋ฆ„์œผ๋กœ ๋‚˜์—ดํ•˜๋ฉด ๋ผ.

์ค‘์š”! ํŒŒ์ผ ์ „์†ก ํ›„์—๋Š” ํŒŒ์ผ์„ ๋‹ซ์•„ ๋ฆฌ์†Œ์Šค ๋ˆ„์ˆ˜๋ฅผ ๋ฐฉ์ง€ํ•ด์•ผ ํ•ด. with ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ž‘์—…์ด ๋๋‚˜๋ฉด ์ž๋™์œผ๋กœ ํŒŒ์ผ์ด ๋‹ซํ˜€:


import requests

with open('example.txt', 'rb') as f:
    files = {'file': f}
    response = requests.post('https://httpbin.org/post', files=files)
print(response.json())
        

4.4 ๋กœ๊ทธ์ธ ๋ฐ ์ธ์ฆ

API (Application Programming Interface)๋ž€ ์„œ๋กœ ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋žจ๋“ค์ด ์ƒํ˜ธ์ž‘์šฉ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ๊ทœ์น™๊ณผ ํ”„๋กœํ† ์ฝœ์˜ ์ง‘ํ•ฉ์ด์•ผ. ๋งŽ์€ ์›น์‚ฌ์ดํŠธ์™€ ์„œ๋น„์Šค๋“ค์ด API์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๊ธฐ ์œ„ํ•ด ๋กœ๊ทธ์ธ ํ›„ ์š”์ฒญ์„ ๋ณด๋‚ด๋„๋ก ํ—ˆ์šฉํ•ด.

์„ฑ๊ณต์ ์œผ๋กœ ๋กœ๊ทธ์ธํ•˜๋ฉด "์„œ๋ฒ„์™€์˜ ์ธ์ฆ ์„ธ์…˜"์„ ํฌํ•จํ•˜๋Š” ์„ธ์…˜ (session) ๊ฐ์ฒด๋ฅผ ๋ฐ›๊ฒŒ ๋ผ. ์ดํ›„ ์š”์ฒญ์—์„œ๋Š” ์ด ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ด.

์ธ์ฆ

์„œ๋ฒ„์— ๋กœ๊ทธ์ธํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ธ์ฆ(๋กœ๊ทธ์ธ ๊ณผ์ •)์„ ๊ฑฐ์ณ์•ผ ํ•ด, ์š”์ฒญ๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ๋ณด๋‚ด์•ผ ํ•ด.


import requests
from requests.auth import HTTPBasicAuth
        
response = requests.get('https://httpbin.org/basic-auth/user/pass', \ 
                        auth=HTTPBasicAuth('user', 'pass'))
print(response.status_code)
        
    

์ด๊ฒŒ ์ธ์ฆ ๊ณผ์ •์ด์•ผ, ํ•˜์ง€๋งŒ ์ผ๋ฐ˜์ ์œผ๋กœ ์„ธ์…˜๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•ด.

์„ธ์…˜ ์‚ฌ์šฉ

์„ธ์…˜์€ ์š”์ฒญ ๊ฐ„์— cookies๋‚˜ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด์™€ ๊ฐ™์€ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์–ด.


import requests

payload = {
    'username': 'your_username',
    'password': 'your_password'
}
            
# ์„ธ์…˜ ์ƒ์„ฑ
session = requests.Session()
            
# ์‚ฌ์ดํŠธ์— ๋กœ๊ทธ์ธ
login_response = session.post('https://example.com/login', data = payload)
            
# ๋กœ๊ทธ์ธ๋œ ์‚ฌ์šฉ์ž๋กœ ์„ธ์…˜ ์ž‘์—…์„ ๊ณ„์† ์ง„ํ–‰
data_response = session.get('https://example.com/api/data')
print(data_response.json())
        
์ฝ”๋ฉ˜ํŠธ
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION