728x90

개요

 

파이썬으로 request.get을 통해 웹을 크롤링하던 도중 원하는 데이터가 크롤링되지않아 처음엔 당황스러웠다.

하지만 크롤링이 되지않는 이유는 get방식으로 웹이 동작하는게 아니라 post방식을 통해 작동하기 때문이었다.

이를 확인하는 방법은 크롤링할 웹사이트로 이동할때 주소창이 변할경우 get방식으로 작동하고 

주소창이 바뀌지않을경우 post방식으로 작동한다는것을 알수있다.

 

 

특징

GET 방식은 다음과 같은 특징이 있습니다.

- 클라이언트가 입력한 값이 URL과 결합되어 스트링 형태로 서버에 전달됩니다
- 서버의 DB에 정보를 요청하는 것이 아니라 해당 웹페이지에서 보여지는 그대로를 가져오는 것입니다.
- 한번 요청시 데이터 양에 제한이 있습니다.

 

POST 방식은 다음과 같은 특징이 있습니다.

- 클라이언트와 서버 간에 스트링 형태로 그대로 서버에 전달되지 않고 인코딩이라는 과정을 거칩니다.
- 헤더를 통해 요청이 전송되는 방식입니다. 이 때문에 GET 방식과 같이 URL이 노출되지 않습니다.
- 요쳥시 GET 보다 더 많은 양의 정보를 교환할 수 있습니다.
- 페이지에서 날짜를 설정하고 조회하기 버튼을 눌렀을 때 서버는 DB에서 해당 기간에 해당되는 정보를 불러와 우리에게 보여줍니다.  이 때 사용하는 방식이 바로 POST 방식입니다. 조회하기 버튼을 눌렀을 때 URL 이 client 에게 노출이 되지 않으며, GET방식에 비해 더 많은 양의 정보를 받아올 수 있다는 장점이 있습니다. 

 

실습

 

 

>>> import requests

 

크롤링할 데이터는 바이낸스에서 상위트레이더의 포지션을 실시간으로 크롤링하는 프로그램을 짜보겠습니다.

https://www.binance.com/en/futures-activity/leaderboard?type=myProfile&tradeType=PERPETUAL&encryptedUid=CCF3E0CB0AAD54D9D6B4CEC5E3E741D2 

 

Binance Futures Leaderboard | ROI & PNL Rankings | Binance Futures

 

www.binance.com

 

위에 주소로 입력하게 될경우 TraderT라는 닉네임을 가진 트레이더의 포지션을 볼수있는데

이 데이터는 get방식으로 작동하는게 아닌 post방식을 통해 클라이언트가 서버(https://www.binance.com/bapi/futures/v1/public/future/leaderboard/getOtherPosition) 

이부분으로 request.post 요청을 하면 서버에서 응답을 해주는 방식으로 작동한다.

 

 

크롬f12를 눌러 개발자모드를 통해  network를 보면 post동식으로 동작하며

 

response로 원하는 데이터가 response오는걸 확인할수있다.

header쪽을 좀더보면 클라이언트가 서버로 post방식으로 request할때

request payload와 form data 두개의 방식으로 서버에게 전달하는데

 

 

Content-Type: application/json다음과 같은 요청이 있을 수 있습니다.

POST /some-path HTTP/1.1

Content-Type: application/json { "foo" : "bar", "name" : "John" }

AJAX별로 이것을 제출하면 브라우저는 단순히 페이로드 본문으로 제출하는 내용을 보여줍니다. 데이터가 어디에서 오는지 전혀 모르기 때문에 할 수 있는 모든 것입니다.

 

method="POST"and Content-Type: application/x-www-form-urlencoded/ 와 함께 HTML 양식을 제출하면 Content-Type: multipart/form-data요청은 다음과 같을 수 있습니다.

POST /some-path HTTP/1.1 Content-Type: application/x-www-form-urlencoded foo=bar&name=John

이 경우 form-data는 요청 페이로드입니다. 

여기에서 브라우저는 더 많이 알고 있습니다. bar가 제출된 양식의 입력 필드 foo 값이라는 것을 알고 있습니다. 그리고 그것이 당신에게 보여주고 있는 것입니다.

따라서 Content-Type데이터가 제출되는 방식은 다르지만 차이 가 있습니다. 두 경우 모두 데이터는 메시지 본문에 있습니다.

 

출처:https://stackoverflow.com/questions/23118249/whats-the-difference-between-request-payload-vs-form-data-as-seen-in-chrome

 

import requests
import websocket
import time
import json


url = 'https://www.binance.com/bapi/futures/v1/public/future/leaderboard/getOtherPosition'

payload = {
    'encryptedUid':'CCF3E0CB0AAD54D9D6B4CEC5E3E741D2',
    'tradeType':'PERPETUAL'
}
response1 = requests.post(url,json=payload)
#print(type(response1.text))
dict = json.loads(response1.text)
print(list.__len__(dict['data']['otherPositionRetList']))
print('심볼\t: 시작가격\t : 포지션수량\t : 포지션수량(usdt)')

for i in range(0,list.__len__(dict['data']['otherPositionRetList'])):
    print(dict['data']['otherPositionRetList'][i]['symbol'] +' : ' + str(dict['data']['otherPositionRetList'][i]['entryPrice'])+ ' : ' + str(dict['data']['otherPositionRetList'][i]['amount']),end='\t : ')
    usdt_amount = (int(dict['data']['otherPositionRetList'][i]['entryPrice'])*int(dict['data']['otherPositionRetList'][i]['amount']))
    print(usdt_amount)

 

출력결과

728x90

+ Recent posts