본문 바로가기

언어/python&웹 크롤링

[python&웹 크롤링] 12. requests 모듈 기초(1)

이번 시간에는 아래 세가지를 다뤄보겠다.

1. requests 모듈 사용법 및 장점 - 이전까지는 urllib을 사용했는데 requests 모듈 사용
2. json 데이터 핸들링
3. requests 모듈 테스트 실습

 

아래는 reqeusts 모듈의 공식 레퍼런스 링크이다.

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

 

Advanced Usage — Requests 2.25.1 documentation

This document covers some of Requests more advanced features. Session Objects The Session object allows you to persist certain parameters across requests. It also persists cookies across all requests made from the Session instance, and will use urllib3’s

2.python-requests.org

이전까지는 urllib의 request를 사용했었는데, requests 모듈을 사용하게 되면 좋은 장점들이 여러가지 있다.

쓰레드 처리나 코드 간결성 등등 여러 장점때문에 사용하는데, 이는 구글에서 검색해보면 찾을 수 있다.

 

그럼 anaconda prompt를 실행 해보자.

section3라는 새로운 프로젝트를 아래 명령어를 통해 만들자.

conda create --name section3 python=3.5

만든 후에는 아래 명령어로 잘 설치가 되었는지 확인 하고
conda info --envs

section3를 활성화 시키자

activate section3

새로 설치를 했으니, requests, beautifulsoup4 모듈을 아래 명령어를 통해 설치하고
pip install requests
pip install beautifulsoup4

아래 명령어를 통해 설치가 잘 되었는지 확인해보자.
conda list

잘 되었으면, atom 명령어를 실행하여 atom 에디터를 실행하자.

이전에 진행했던 section2 폴더와 같은 경로로 section3라는 폴더를 생성 후, atom 에디터에 project에 import시키자

 

준비가 되었으면 section3 경로에 파이썬 파일을 생성하고 실행시켜보자.

 

 

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')
 
= requests.Session() #세션이 열림
#PUT(FETCH), DELETE, GET, POST
#r = s.get('https://naver.com') # naver를 get방식으로 가져옴
#print('1', r.text) # 네이버
 
#r = s.get('http://httpbin.org/cookies', cookies={'from':'myName'}) #cookies라는 변수로 딕셔너리 형태로 요청
#print(r.text)
 
url = 'http://httpbin.org/get'  #    http://httpbin.org 는 PUT(FETCH), DELETE, GET, POST 등 http 통신을 테스트 할 수 있는 주
headers = {'user-agent':'myPythonApp_1.0.0'}
 
#r = s.get(url, headers=headers) #쿠키와 헤더 등 페이로드 형식으로 보내고 받을 수 있다.
#print(r.text)
s.close() #세션 열면 반드시 close 리소스 낭비때문 (자원낭비)
 
with requests.Session() as s :  # with절로 실행 시 자동 close된다.
    r = s.get('https://www.naver.com')
    print(r.text)
 
cs

3-2-1.py

위의 주석들을 제거해보고 하나 하나 실행해보면 결과를 확인할 수 있다.

http://httpbin.org

 

httpbin.org

A simple HTTP Request & Response Service. Run locally: $ docker run -p 80:80 kennethreitz/httpbin

httpbin.org

위 사이트는 여러 http 통신 테스트를 진행 할 수 있다. requests모듈을 사용하여 세션을 열었고, 이 주소를 사용해서 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
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 상태 코드
= requests.Session()
= s.get('http://httpbin.org/get')
print(r.status_code)    #200
print(r.ok)             #True
 
#https://jsonplaceholder.typicode.com -json 테스트 할 수 있는 사이트
 
= s.get('https://jsonplaceholder.typicode.com/albums')
print(r.text)
print(r.json()) #json 형태로 자동으로 컨버팅 해줌
#print(r.json().keys())
#print(r.json().values())
print(r.encoding)
print(r.content)
print(r.raw)
 
cs

3-2-2.py

 

https://jsonplaceholder.typicode.com

 

JSONPlaceholder - Fake online REST API for testing and prototyping

{JSON} Placeholder Free to use fake online REST API for testing and prototyping. Powered by JSON Server + LowDB As of Dec 2020, serving ~1.8 billion requests each month.

jsonplaceholder.typicode.com

위 링크는 json 형식 데이터를 전송 테스트 할 수 있는 사이트이다.

마찬가지로 requests 모듈로 세션을 열어 json 값을 받아오는 테스트를 진행했다.

 

 

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
import sys
import io
import requests, json # json 임포트
 
sys.stdout = io.TextIOWrapper(sys.stdout.detach(), encoding = 'utf-8')
sys.stderr = io.TextIOWrapper(sys.stderr.detach(), encoding = 'utf-8')
 
#stream 데이터를 json으로 변환 후 그 안에 키값등 출력
= requests.Session()
= s.get('http://httpbin.org/stream/20', stream=True# stream=True 라고 명시적으로 기재하는게 좋음
#print(r.text)
# print(r.json()) # 보기에는 json 이지만 스트림 데이터라 에러가 남
#print(r.encoding)
 
if r.encoding is None :
    r.encoding = 'utf-8'
 
for line in r.iter_lines(decode_unicode=True) :
    #print(line)
    b = json.loads(line)
    #print(type(b)) #dict 형태
    #print(b['origin']) # json으로 딕셔너리 형태가 됬기때문에 키값으로 출력가능
    for e in b.keys() :
        print("key:",e,"values:",b[e])
 
cs

3-2-3.py

 

가장 상단에 json 모듈을 import 시켰고,

http://httpbin.org 사이트에서 stream 데이터를(20건) 가져온 값을 json으로 변환시키는 코드이다.

 

 


Today :
Yesterday :
Total :