여니의 Side Project/가상화폐 매수매도 프로그램

[#3] 업비트 시세 종목 조회 , 마켓 코드 조회하기(requests,beautifulSoup, http응답메소드 etc)

여니's 2021. 1. 19. 15:32

docs.upbit.com/reference#open-api-%ED%82%A4-%EB%A6%AC%EC%8A%A4%ED%8A%B8-%EC%A1%B0%ED%9A%8C

 

업비트 개발자 센터

업비트 Open API 사용을 위한 개발 문서를 제공 합니다.업비트 Open API 사용하여 다양한 앱과 프로그램을 제작해보세요.

docs.upbit.com


requests 모듈

>> HTTP 요청을 보내는 모듈이다.

pypi.org/project/requests/

 

requests

Python HTTP for Humans.

pypi.org

 

<기본 구조>

import requests

response=requests.get('url입력')

response.status_code 

response.text

 

주소를 GET 요청(Request)를 통해 서버로 보냈고, 

서버에서는 그 요청을 받아서 처리를 하고 클라이언트에게 응답을 했다.

응답은 200 상태 코드와 함께 온다.

= 이는 서버에서 잘 처리되었다는 정상적인 응답을 의미한다.

(status_code : 상태코드)

text는 응답의 내용 >> HTML코드가 온다.

 

status_code #응답코드

raise_for_status() #200 ok 응답코드가 아닐 경우 에러 발생

json() #json 응답일 경우 딕셔너리 타입으로 변환함

 

Requests는 좋은 라이브러리지만 python이 이해하는 구조로 만들어주지 못한다.

text로 받아온 건 pytho의 문자열 객체를 반환하는 것일뿐이라 정보 추출이 어렵다.

 

그래서 이때 BeautifulSoup를 이용하게 된다.

Beautifulsoup는 html 코드를 python이 이해할 수 있는 구조로 변환하는

파싱(parsing)을 맡고 있고

이 라이브러리를 이용해서 우리는 의미있는 정보를 추출해낼 수 있다.

 

즉,

requests를 이용해서 html 코드를 가져오고,

beautifulSoup를 이용해서 파싱 작업을 진행한다.

 

하지만

지금은 html 자체를 불러오는 게 아니고

필요한 정보만 담여있는 api를 사용하는 것이기 때문에

필요 없는 과정이다.

 

 

더보기

help(response)

>> 

 

class Response(builtins.object)

| The :class:`Response <Response>` object, which contains a

| server's response to an HTTP request.

|

| Methods defined here:

|

| __bool__(self)

| Returns True if :attr:`status_code` is less than 400.

|

| This attribute checks if the status code of the response is between

| 400 and 600 to see if there was a client error or a server error. If

| the status code, is between 200 and 400, this will return True. This

| is **not** a check to see if the response code is ``200 OK``.

|

| __enter__(self)

|

| __exit__(self, *args)

|

| __getstate__(self)

|

| __init__(self)

| Initialize self. See help(type(self)) for accurate signature.

|

| __iter__(self)

| Allows you to use a response as an iterator.

|

| __nonzero__(self)

| Returns True if :attr:`status_code` is less than 400.

|

| This attribute checks if the status code of the response is between

| 400 and 600 to see if there was a client error or a server error. If

| the status code, is between 200 and 400, this will return True. This

| is **not** a check to see if the response code is ``200 OK``.

|

| __repr__(self)

| Return repr(self).

|

| __setstate__(self, state)

|

| close(self)

| Releases the connection back to the pool. Once this method has been

| called the underlying ``raw`` object must not be accessed again.

|

| *Note: Should not normally need to be called explicitly.*

|

| iter_content(self, chunk_size=1, decode_unicode=False)

| Iterates over the response data. When stream=True is set on the

| request, this avoids reading the content at once into memory for

| large responses. The chunk size is the number of bytes it should

| read into memory. This is not necessarily the length of each item

| returned as decoding can take place.

|

| chunk_size must be of type int or None. A value of None will

| function differently depending on the value of `stream`.

| stream=True will read data as it arrives in whatever size the

| chunks are received. If stream=False, data is returned as

| a single chunk.

|

| If decode_unicode is True, content will be decoded using the best

| available encoding based on the response.

|

| iter_lines(self, chunk_size=512, decode_unicode=False, delimiter=None)

| Iterates over the response data, one line at a time. When

| stream=True is set on the request, this avoids reading the

| content at once into memory for large responses.

|

| .. note:: This method is not reentrant safe.

|

| json(self, **kwargs)

| Returns the json-encoded content of a response, if any.

|

| :param \*\*kwargs: Optional arguments that ``json.loads`` takes.

| :raises ValueError: If the response body does not contain valid json.

|

| raise_for_status(self)

| Raises :class:`HTTPError`, if one occurred.

|

| ----------------------------------------------------------------------

| Data descriptors defined here:

|

| __dict__

| dictionary for instance variables (if defined)

|

| __weakref__

| list of weak references to the object (if defined)

|

| apparent_encoding

| The apparent encoding, provided by the chardet library.

|

| content

| Content of the response, in bytes.

|

| is_permanent_redirect

| True if this Response one of the permanent versions of redirect.

|

| is_redirect

| True if this Response is a well-formed HTTP redirect that could have

| been processed automatically (by :meth:`Session.resolve_redirects`).

|

| links

| Returns the parsed header links of the response, if any.

|

| next

| Returns a PreparedRequest for the next request in a redirect chain, if there is one.

|

| ok

| Returns True if :attr:`status_code` is less than 400, False if not.

|

| This attribute checks if the status code of the response is between

| 400 and 600 to see if there was a client error or a server error. If

| the status code is between 200 and 400, this will return True. This

| is **not** a check to see if the response code is ``200 OK``.

|

| text

| Content of the response, in unicode.

|

| If Response.encoding is None, encoding will be guessed using

| ``chardet``.

|

| The encoding of the response content is determined based solely on HTTP

| headers, following RFC 2616 to the letter. If you can take advantage of

| non-HTTP knowledge to make a better guess at the encoding, you should

| set ``r.encoding`` appropriately before accessing this property.

|

| ----------------------------------------------------------------------

| Data and other attributes defined here:

|

| __attrs__ = ['_content', 'status_code', 'headers', 'url', 'history', '...

 

HTTP 응답 메서드

get

:  입력한 URL의 HTML 코드 받기

 

post :

URL에 폼 입력을 처리하기 위해 구성한 서버 측 스크립트로 구성되어 있고,

헤더 정보에 포함되지 않고 데이터 부분에 요청 정보가 입력된다.

 

head

: get방식과 유사하나, 헤더 정보 이외에는 어떤 데이터도 보내지 않는다.

 

delete

: 원격지 웹 서버에 파일을 삭제하기 위해 사용된다. (<->put)


다시 Upbit로 돌아와서

import requests 모듈 입력해야 함


querystring = {"isDetails": "false"}

>> isDetails(boolean) : 유의종목 필드와 같은 상세 정보 노출 여부

 

response = requests.request("GET", url, params=querystring)
print(response.text)

 

get 요청시 parameter 전달은 params=넘겨줄 파라미터 변수명

post 요청시 data 전달은 data=넘겨줄 파라미터 변수명

 


직렬화란?

: 파이썬 객체를 효율적으로 저장하거나 스트림으로 전송할 때 데이터를 줄로 세워서 저장하는 것이다.

 

역직렬화?

: 직렬화된 파일이나 바이트를 원래의 객체로 복원하는 방식이다.