플레이 데이터를 다니며 파이썬의 웹 크롤링을 할 때 배운 2개의 라이브러리가 있다.
requests
와 selenium
각각 어떤 목적에서 사용될까? 🤔
보통 웹 컨트롤이 필요할 경우(클릭)에는 selenium을 활용하고, 그렇지 않다면 requests 방법을 이용하는 것이 일반적이다.
왜냐하면 속도가 [requests > selenium]이기 때문이다.
requests는 보통 BeautifulSoup와 많이 쓴다.
requests로 긁어온 데이터를 BeautifulSoup로 파싱하는 것이다.
네이버 주식 정보에서 데이터를 가져오는 연습을 해보도록 하겠다.
우리가 들어갈 주소는 바로 여기 !
https://finance.naver.com/item/sise_day.naver?code=005930&page=1
5930 코드는 삼성전자를 의미한다.
우리는 여기서 위의 이미지와 같은 데이터 테이블을 가져올 것이다.
import requests
import pandas as pd
def get_stock(url):
head = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36"}
df=pd.concat([pd.read_html(requests.get(url.format(x), headers=head).text)[0].dropna() for x in range(1,5)])
return df
url 주소를 가져와 pandas의 데이터프레임으로 변환하는 함수다.
url = "https://finance.naver.com/item/sise_day.naver?code=005930&page={}"
df = get_stock(url)
통신 방식에는 크게 get 방식과 post 방식이 있다.
자세한건 추후 포스팅에서 다루기로 하고 일단 requests를 사용할 때 이 웹페이지가 어떤 통신 방식을 차용하는지를 알아야 한다.
크롬기준 "개발자 도구/ 네트워크 / 헤더 / 일반 / 요청 메서드"에서 알 수 있다.
post 방식은 파라미터로 payload값을 넘겨주어야 한다.
{"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36"}
그리고 네이버 같이 파이썬으로 웹 페이지를 접근하면 세션을 종료시키는 곳이 있다.
그럴 경우, header에 위 텍스트를 파라미터로 넘겨주면 차단을 피할 수 있다.
마찬가지로 스타벅스 홈페이지도 크롤링을 해볼건데 이번에는 POST 방식에 json 형식으로 받아오겠다.
import requests
def get_data(url,payload):
r = requests.post(url, data=payload)
return r.json()['list']
url과 payload를 이용하여 json 형태로 데이터 반환
payload는 "network/payload/form data"에서 알 수 있다.
url = "https://www.starbucks.co.kr/store/getStore.do?r=GKYHQKU7D3"
payload = {"in_biz_cds" : "0",
"in_scodes" : "0",
"ins_lat" : "37.566535",
"ins_lng" : "126.9779692",
"search_text" : "",
"p_sido_cd" : "01",
"p_gugun_cd" : "",
"in_distance" : "0",
"in_biz_cd" : "",
"isError" : "true",
"searchType" : "C",
"set_date" : "",
"all_store" : "0",
"T03" : "0",
"T01" : "0",
"T27" : "0",
"T12" : "0",
"T09" : "0",
"T30" : "0",
"T05" : "0",
"T22" : "0",
"T21" : "0",
"T10" : "0",
"T36" : "0",
"T43" : "0",
"T48" : "0",
"P10" : "0",
"P50" : "0",
"P20" : "0",
"P60" : "0",
"P30" : "0",
"P70" : "0",
"P40" : "0",
"P80" : "0",
"whcroad_yn" : "0",
"P90" : "0",
"new_bool" : "0",
"iend" : "1000",
"rndCod" : "IZVHHSIFWC",}
star = get_data(url,payload)