2021-01-30

Posted by karais89 on January 30, 2021

크롤링보다는 자동화 쪽에 좀 더 관심이 있음.

21. http 통신 기초 - cookie, session, request, response

  1. request, response 간단 개념 알아보기
  2. cookie, session 개념 알아보기

https://www.zetawiki.com/wiki/쿠키와_세션_차이점

http 통신

  1. 비연결지향
  2. 상태정보유지안함

쿠키와 세션

  • 상태 정보 유지
  • 쿠키: 클라에서 저장. 자동로그인, 오늘 하루는 이창을 열지 않겠습니다 체크 등, 쇼핑몰 장바구니(비회원)
  • 세션: 서버에서 저장. 클라 응답시 세션아이디 생성후 서버에서 가지고 있음. 적절한 응답 전송.

22. requests 모듈 기초 (1)

  1. request 모듈 사용법(1) 및 장점
  2. json 데이터 핸들링
  3. requests 모듈 테스트 실습

http://docs.python-requests.org/en/master/user/advanced/

http://www.restapitutorial.com/lessons/httpmethods.html

  • 스레드 안전
  • 타임아웃
  • 파일업로드
  • 세션 제공
1
2
3
4
5
6
7
conda update conda
conda create --name section3 python=3.5
conda info --envs
activate section3
pip install requests
conda list
pip install beautifulsoup4

request 사용

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import sys
import io
import requests

sys.stdout = io.TextIOWrapper(sys.stdout.detach(), encoding = 'utf-8')
sys.stderr = io.TextIOWrapper(sys.stderr.detach(), encoding = 'utf-8')

s = requests.Session()
r = s.get("https://www.naver.com") # put(fetch), delete, get, post
# print('1', r.text)

# r = s.get('http://httpbin.org/cookies', cookies={'from':'myName'}) # rest테스트용도 url
# print('2', r.text)

url = 'http://httpbin.org/get'
headers = {'user-agent':'myPythonApp_1.0.0'}

# r = s.get(url, headers=headers)
# print('3', r.text)

s.close()

# 자동 메모리 해제
with requests.Session() as s:
    r = s.get("https://www.naver.com")
    print('4', r.text)

response code 확인 json 확인

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import sys
import io
import requests

sys.stdout = io.TextIOWrapper(sys.stdout.detach(), encoding = 'utf-8')
sys.stderr = io.TextIOWrapper(sys.stderr.detach(), encoding = 'utf-8')

# Response 상태 코드
s = requests.Session()
r = s.get('http://httpbin.org/get')
print(r.status_code)
print(r.ok)

# https://jsonplaceholder.typicode.com
r = s.get('https://jsonplaceholder.typicode.com/posts/1')
# print(r.text)
print(r.json()) # json 컨버팅
print(r.json().keys())
print(r.json().values())
print(r.encoding)
print(r.content)
print(r.raw)

실습

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import sys
import io
import requests, json

sys.stdout = io.TextIOWrapper(sys.stdout.detach(), encoding = 'utf-8')
sys.stderr = io.TextIOWrapper(sys.stderr.detach(), encoding = 'utf-8')

s = requests.Session()

# 스트림 형태를 json으로
r = s.get('http://httpbin.org/stream/20', stream=True)
# print(r.text)
# print(r.encoding)
# print(r.json()) # 파싱 에러
if r.encoding is None:
    r.encoding = 'utf-8'

for line in r.iter_lines(decode_unicode=True):
    # print(line)
    b = json.loads(line) # dict
    for e in b.keys():
        print("key:", e, "values:", b[e])
  • 스트림 형태를 json 형태로 변경 가능함.
  • json.loads은 스트링을 파이썬 딕셔너리 형태로 변경해줌.
  • iter_lines은 응답 데이터를 한줄에 한개씩 반복함

23. request 모듈 기초 (2)

  1. request 모듈 사용법(2)
  2. request 모듈 REST API 실습

실습(과제): https://www.apistore.co.kr/api/apiList.do 사용해보기

http://docs.python-requests.org/en/master/user/advanced/

http://www.restapitutorial.com/lessons/httpmethods.html

https://lallwr.blogspot.kr/2016/01/restful.html

get,pos,put(fetch),delete

거의 모든 api 시스템에서 제공해줌.

post, get

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import sys
import io
import requests, json

sys.stdout = io.TextIOWrapper(sys.stdout.detach(), encoding = 'utf-8')
sys.stderr = io.TextIOWrapper(sys.stderr.detach(), encoding = 'utf-8')

# r = requests.get('https://api.github.com/events')
# r.raise_for_status() # 에러가 발생했을 때 예외 발생
# print(r.text)

# 규격화된 쿠키 전송
jar = requests.cookies.RequestsCookieJar()
jar.set('name','kim', domain='httpbin.org', path='/cookies')

# r = requests.get('http://httpbin.org/cookies', cookies=jar)
# r.raise_for_status()
# print(r.text)

# r = requests.get('https://github.com', timeout=3)
# print(r.text)

# post - 파일 업로드, 글쓰기 등
# r = requests.post('http://httpbin.org/post', data={'name':'kim'}, cookies=jar)
# print(r.text)

# payload 어떤 데이터를 담는 것이라고 생각
payload1 = {'key1': 'value1', 'key2': 'value2'} # 딕셔너리 형태
payload2 = (('key1','value1'), ('key2', 'value2')) # 튜플 형태로도 전송 가능

# r = requests.post('http://httpbin.org/post', data=payload1)
# print(r.text)

payload3 = {'some':'nice'}
r = requests.post('http://httpbin.org/post', data=json.dumps(payload3)) # json 데이터 전송 가능
print(r.text)

put, delete

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import sys
import io
import requests, json

# REST : post, get, put(fetch), delete

sys.stdout = io.TextIOWrapper(sys.stdout.detach(), encoding = 'utf-8')
sys.stderr = io.TextIOWrapper(sys.stderr.detach(), encoding = 'utf-8')

payload1 = {'key1': 'value1', 'key2': 'value2'} # 딕셔너리 형태
payload2 = (('key1','value1'), ('key2', 'value2')) # 튜플 형태로도 전송 가능
payload3 = {'some':'nice'}

# r = requests.put('http://httpbin.org/put', data=payload1)
# print(r.text)

# fake rest api
# r = requests.put('https://jsonplaceholder.typicode.com/posts/1', data=payload1)
# print(r.text) # flask 등으로 테스트 가능

r = requests.delete('https://jsonplaceholder.typicode.com/posts/1')
print(r.text)

실습

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import sys
import io
import requests, json

sys.stdout = io.TextIOWrapper(sys.stdout.detach(), encoding = 'utf-8')
sys.stderr = io.TextIOWrapper(sys.stderr.detach(), encoding = 'utf-8')

# 사람인
ClientID = "네이버에서 발급 받은 ID"
ClientSecret = "네이버에서 발급 받은 시크릿 키"
h = {"X-Naver-Client-Id": ClientID, "X-Naver-Client-Secret": ClientSecret, "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8"}
d = {"url": "http://d2.naver.com/helloworld/4874130"}
r = requests.post('https://openapi.naver.com/v1/util/shorturl', headers=h, data=d)
r.raise_for_status()
print(r.text)
  • 마음에 드는 api를 rest로 가져와서 콘솔로 출력 (혹은 파일 저장)
  • 무료인곳, 개발자키 여부가 No인 경우.
  • 찾기가 좀 힘들어서 그냥 네이버 open api 사용 아래와 같은 형태
1
2
3
4
5
curl "https://openapi.naver.com/v1/util/shorturl" \
    -d "url=http://d2.naver.com/helloworld/4874130" \
    -H "Content-Type: application/x-www-form-urlencoded; charset=UTF-8" \
    -H "X-Naver-Client-Id: {애플리케이션 등록 시 발급받은 클라이언트 아이디 값}" \
    -H "X-Naver-Client-Secret: {애플리케이션 등록 시 발급받은 클라이언트 시크릿 값}" -v