"Requests"의 두 판 사이의 차이

Pywiki
둘러보기로 가기 검색하러 가기
175번째 줄: 175번째 줄:
 
|requests.exceptions.Timeout
 
|requests.exceptions.Timeout
 
|응답이 지연되거나 오지 않는 경우.
 
|응답이 지연되거나 오지 않는 경우.
 +
|-
 +
|json.decoder.JSONDecodeError: Extra data: ...
 +
|json.loads 를 사용할 때 데이터가 json형태가 아닌 경우.
 
|}
 
|}
 
===웹 크롤링 팁===
 
===웹 크롤링 팁===
 
  
 
개발자도구의 Network 탭에서 통신의 결과를 볼 수 있는데, 내가 무언가를 클릭했을 때 어떤 데이터가 반환되는 건지 볼 수가 있다. 해당 요청을 우클릭>copy>copy link address 를 통해 주소를 복사하면 해당 반환을 얻는 주소를 알 수 있다.
 
개발자도구의 Network 탭에서 통신의 결과를 볼 수 있는데, 내가 무언가를 클릭했을 때 어떤 데이터가 반환되는 건지 볼 수가 있다. 해당 요청을 우클릭>copy>copy link address 를 통해 주소를 복사하면 해당 반환을 얻는 주소를 알 수 있다.
 
[[분류:라이브러리]]
 
[[분류:라이브러리]]

2021년 4월 17일 (토) 11:33 판

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 응답이 지연되거나 오지 않는 경우.
json.decoder.JSONDecodeError: Extra data: ... json.loads 를 사용할 때 데이터가 json형태가 아닌 경우.

8.2 웹 크롤링 팁

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