바뀜

5,292 바이트 추가됨 ,  2021년 4월 3일 (토) 16:18
새 문서: ==개요== 웹 요청이나 API를 사용할 때 주로 사용하는 패키지. ==보내기. input.== ===기본적인 사용법=== {| class="wikitable" !의도 !방법 |- |GET을 보...

==개요==
웹 요청이나 API를 사용할 때 주로 사용하는 패키지.
==보내기. input.==
===기본적인 사용법===
{| class="wikitable"
!의도
!방법
|-
|GET을 보낼 때
|받을객체=requests.get(주소)
|-
|POST를 보낼 때
|받을객체=requests.post(주소)
|}
===데이터와 함께 넘기기===
{| class="wikitable"
!의도
!설명
!방법
|-
|GET에 데이터 담기
|url을 문법에 맞춰 변형시켜 보내거나..
사전에 담아 보낸다.

사전을 params에 담는다.

상황에 따라 headers 요소 안에 사전을 담으면 헤더에 담을 데이터를 지정할 수 있다.
|<syntaxhighlight lang="python">
사전={ '보낼변수' : '담을내용',
'보낼변수2' : '담을내용2'
}
받을객체=requests.get(주소, params=사전)
</syntaxhighlight>
|-
|POST를 보낼 때
|post에선 url주소에 파라미터를 넣지 않는다.
사전을 data에 담는다.
|<syntaxhighlight lang="python">
사전={ '보낼변수' : '담을내용',
'보낼변수2' : '담을내용2'
}
받을객체=requests.post(주소, data=사전)
</syntaxhighlight>
|}
===인증관련===
{| class="wikitable"
!의도
!설명
!방법
|-
|SSL인증을 사용하는 경우
|에러가 발생하면 verify에 False를 담아 보낸다.
|<syntaxhighlight lang="python">
사전={ '보낼변수' : '담을내용',
'보낼변수2' : '담을내용2'
}
받을객체=requests.post(주소, data=사전, verify=False)
</syntaxhighlight>
|-
|id와 password를 요구하는 경우
|auth 안에 id와 password를 담는다.
|<syntaxhighlight lang="python">
사전={ '보낼변수' : '담을내용',
'보낼변수2' : '담을내용2'
}
받을객체=requests.post(주소, data=사전, auth=("id", "password"))
</syntaxhighlight>
|}
===이외 옵션===
{| class="wikitable"
!의도
!설명
!방법
|-
|headers
|헤더.
|<syntaxhighlight lang="python">
받을객체=requests.post(주소, headers={'Content-Type': 'application/vnd.api+json; charset=utf-8'})
</syntaxhighlight>
|-
|cookies
|
|
|-
|timeout
|
|
|}
===요청 url의 기본형태===
모듈을 사용하면 간단히 보내지기도 하지만, 다음과 같은 형태로 url을 만드는 코드를 짜서 요청하면 정확한 응답을 받을 수 있다.

<code>도메인주소/경로?변수=내용&변수2=내용2&변수3=내용3</code>

다음과 같은 형태로 넣을 것들을 지정하여 url을 만들어 낼 수도 있다.<syntaxhighlight lang="python">
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:]
</syntaxhighlight>
==응답. output.==
{| class="wikitable"
!의도
!설명
!방법
|-
|응답코드 보기
|응답 결과에 따라 http 코드를 반환한다.
200이면 정상.
|받은객체.status_code
|-
|
|
|
|}
==HTTP==
response= requests.get('[http://xn--9l4b19k/ http://주소]')

응답을 response에 받는다.

내용을 보기 위해선 response.text로 볼 수 있다.
===유의사항===
헤더를 입력해야 전체 데이터를 무리없이 받아올 수 있다. 헤더가 없는 경우 어째서인지 전체 데이터를 받아오지 못한다;<syntaxhighlight lang="python">
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)
</syntaxhighlight>위와 같은 형태로 요청해야 하는데, User-Agent는 개발자모드의 console 창에서 <code>navigator.userAgent</code>를 입력하면 나온다.
==JSON==
response= requests.get('[http://xn--9l4b19k/ http://주소]') #응답받은 것을 response에 담는다.

result=response.json() 이 명령은 받은 응답을 json으로 인식한다는 의미이다. 파이썬의 딕셔너리로 바꾸어준다.

result['키'] 형태로 접근이 가능하다.
===JSON 보기===
json tree, [http://jsonviewer.stack.hu/ Online JSON Viewer]를 통해 전체적인 구조를 파악할 수도 있다.
==XML==
response= requests.get('[http://xn--9l4b19k/ http://주소]')

import xmltodict #xml을 딕셔너리로 바꾸어준다.

content=response.content

dict=xmltodict.parse(content) #이렇게 거치면 딕셔너리로 바꾸어준다.

최상단 항목이 response라면 dict['response'] 형태로 하나하나 아래로 내려간다.

저장할 땐 XML을 다루는 것보단 JSON을 다루는 게 더 나을지도.

=에러 파악=
response.text 를 출력하면 응답메시지를 통해 어떤 에러가 났는지 볼 수 있다.
===에러종류===
{| class="wikitable"
!에러
!설명
|-
|requests.exceptions.Timeout
|응답이 지연되거나 오지 않는 경우.
|}
===웹 크롤링 팁===


개발자도구의 Network 탭에서 통신의 결과를 볼 수 있는데, 내가 무언가를 클릭했을 때 어떤 데이터가 반환되는 건지 볼 수가 있다. 해당 요청을 우클릭>copy>copy link address 를 통해 주소를 복사하면 해당 반환을 얻는 주소를 알 수 있다.
[[분류:라이브러리]]