Requests
1 개요
웹 요청이나 API를 사용할 때 주로 사용하는 패키지.
2 보내기. input.
2.1 기본적인 사용법
요청을 보내면 객체 안에 데이터가 담긴다.
의도 | 방법 |
---|---|
GET을 보낼 때 | 받을객체 = requests.get("http://주소") |
POST를 보낼 때 | 받을객체 = requests.post("http://주소") |
보통 받은 데이터는 바로 쓰지 못하고, 받을객체.test
형태로 변환하여 사용한다.
응답을 response에 받는다면 내용을 보기 위해선 response.text로 볼 수 있다.
2.2 데이터와 함께 넘기기
의도 | 설명 | 방법 |
---|---|---|
GET에 데이터 담기 | url을 문법에 맞춰 변형시켜 보내거나..
사전에 담아 보낸다. 사전을 params에 담는다. 상황에 따라 headers 요소 안에 사전을 담으면 헤더에 담을 데이터를 지정할 수 있다. |
사전={ '보낼변수' : '담을내용',
'보낼변수2' : '담을내용2'
}
받을객체=requests.get(주소, params=사전)
|
POST를 보낼 때 | post에선 url주소에 파라미터를 넣지 않는다.
사전을 data에 담는다. |
사전={ '보낼변수' : '담을내용',
'보낼변수2' : '담을내용2'
}
받을객체=requests.post(주소, data=사전)
|
2.3 인증관련
의도 | 설명 | 방법 |
---|---|---|
SSL인증을 사용하는 경우 | 에러가 발생하면 verify에 False를 담아 보낸다. | 사전={ '보낼변수' : '담을내용',
'보낼변수2' : '담을내용2'
}
받을객체=requests.post(주소, data=사전, verify=False)
|
id와 password를 요구하는 경우 | auth 안에 id와 password를 담는다. | 사전={ '보낼변수' : '담을내용',
'보낼변수2' : '담을내용2'
}
받을객체=requests.post(주소, data=사전, auth=("id", "password"))
|
2.4 이외 옵션
의도 | 설명 | 방법 |
---|---|---|
headers | 헤더. | 받을객체=requests.post(주소, headers={'Content-Type': 'application/vnd.api+json; charset=utf-8'})
|
cookies | ||
timeout |
2.5 요청 url의 기본형태
모듈을 사용하면 간단히 보내지기도 하지만, 다음과 같은 형태로 url을 만드는 코드를 짜서 요청하면 정확한 응답을 받을 수 있다.
도메인주소/경로?변수=내용&변수2=내용2&변수3=내용3
다음과 같은 형태로 넣을 것들을 지정하여 url을 만들어 낼 수도 있다.
params = {'pageNo': '1', 'numOfRows':'10','dataType':'json',
'eqmtId':cctvId,'hhCode':'00','ServiceKey': key}
params_str=''#파라미터요청을 문자열로 변환하기 위한 변수
for i, j in params.items():
params_str = params_str + "&" + i + "=" + j
params_str="?"+params_str[1:]
3 응답. output.
의도 | 설명 | 방법 |
---|---|---|
응답코드 보기 | 응답 결과에 따라 http 코드를 반환한다.
200이면 정상. |
받은객체.status_code |
3.1 응답데이터
데이터 | 설명 |
---|---|
응답.test | 응답받은 내용을 text 형태의 데이터로 본다. 직접 보기 위해 사용. |
응답.content | 응답받은 내용을 바이너리 형태의 데이터로 본다. 파일로 다루기 위해 사용. |
4 HTTP
4.1 유의사항
헤더를 입력해야 전체 데이터를 무리없이 받아올 수 있다. 헤더가 없는 경우 어째서인지 전체 데이터를 받아오지 못한다;
url = 'https://주소'
headers = {'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Whale/2.8.108.15 Safari/537.36"}
raw = requests.get(url, headers=headers)
위와 같은 형태로 요청해야 하는데, User-Agent는 개발자모드의 console 창에서 navigator.userAgent
를 입력하면 나온다.
5 JSON
response= requests.get('http://주소') #응답받은 것을 response에 담는다.
result=response.json() 이 명령은 받은 응답을 json으로 인식한다는 의미이다. 파이썬의 딕셔너리로 바꾸어준다.
result['키'] 형태로 접근이 가능하다.
5.1 JSON 보기
json tree, Online JSON Viewer를 통해 전체적인 구조를 파악할 수도 있다.
6 XML
response= requests.get('http://주소')
import xmltodict #xml을 딕셔너리로 바꾸어준다.
content=response.content
dict=xmltodict.parse(content) #이렇게 거치면 딕셔너리로 바꾸어준다.
최상단 항목이 response라면 dict['response'] 형태로 하나하나 아래로 내려간다.
저장할 땐 XML을 다루는 것보단 JSON을 다루는 게 더 나을지도.
7 데이터 저장하기
res.text가 일반 텍스트로 보는 거라면, res.content는 바이너리 형태의 데이터를 보여준다.
8 에러 파악
response.text 를 출력하면 응답메시지를 통해 어떤 에러가 났는지 볼 수 있다.
8.1 에러종류
에러 | 설명 |
---|---|
requests.exceptions.Timeout | 응답이 지연되거나 오지 않는 경우. |
8.2 웹 크롤링 팁
개발자도구의 Network 탭에서 통신의 결과를 볼 수 있는데, 내가 무언가를 클릭했을 때 어떤 데이터가 반환되는 건지 볼 수가 있다. 해당 요청을 우클릭>copy>copy link address 를 통해 주소를 복사하면 해당 반환을 얻는 주소를 알 수 있다.