always_here

지식을 공유하고 함께 성장하는 엔지니어 as_always 입니다

AS_ALWAYS

핀테크 교육/금융데이터 활용

크롤링 (네이버 금융 크롤링)

nauung_always 2022. 7. 5. 11:21
728x90

크롤링 : 웹 페이지로부터 데이터를 추출하는 행위

soup = BeautifulSoup(입력 문자열, 'html.parser')

  • soup.select('태그명') : 태그를 입력으로 사용할 경우
  • soup.select('.클래스명') : 클래스를 입력으로 사용할 경우
  • soup.select('#아이디') : ID를 입력으로 사용할 경우
  • soup.select('상위태그 하위태그') : 자손 관계 (띄어쓰기)
  • soup.select('상위태그 > 하위태그') : 자식 관계 ( > )

requests라는 패키지에 있는 get이라는 모듈(함수)에 url을 입력으로 하고, 이를 변수에 저장한 후,
변수.text를 하면 해당 URL의 HTML 코드를 받아올 수 있다.

  • response = requests.get(url)
  • response.text

url = f"https://finance.naver.com/item/sise_day.naver?code={company_code}"

 
네이버 금융 페이지를 보면, 

위와 같이 모든 데이터를 한 페이지에서 가져올 수 없다. 따라서 맨 뒤를 눌러 마지막 페이지(last_page)를 찾아 for문을 돌려 크롤링을 해 줘야한다. 

데이터는 표로 이루어진 table 형식이다. 

pd.read_html()을 사용하면 리스트 안에 데이터프레임이 들어있는 형태로 html에 있는 모든 table을 한번에 가져온다.
따라서 인덱스를 이용하여 원하는 표를 개별 데이터프레임으로 지정해주면 된다.  

#User-agent : 크롤링 접속 차단 오류 방지
headers = {'user-agent''Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36'}
 
    for page in range(1int(last_page) + 1):    
        pg_url = '{}&page={}'.format(url, page)     
        response = requests.get(pg_url, headers=headers)
        df = df.append(pd.read_html(response.text)[0],ignore_index=True
 
 
'날짜','종가','전일비','시가','고가','저가','거래량' 으로 이루어진 데이터프레임 생성
 
전일비를 크롤링을 통해 가져오게 되면,
위와 같이 상승과 하락의 표시와 색깔은 크롤링으로 가져올 수 없기에 전날 종가에서 당일 종가를 뺀 값을 전일비로 계산해서 저장했다. 
 
#전일비 계산 (+,- 고려 위해)
    for i in range(1,len(df['close'])):      
        df['diff'][i-1]=int(df['close'][i-1])-int(df['close'][i])
 

한 종목을 골라 종가를 기준으로 그래프를 그려보면 다음과 같이 출력할 수 있다. 
x축은 날짜 데이터, y축은 종가 데이터
co는 좌표를 청록색(cyan) 원으로 생성하겠다. 
-는 각 좌표를 실선으로 연결해서 표시하겠다.

plt.plot(df['날짜'], df['종가'], 'co-')
plt.grid(color='gray', linestyle='--')

 

 

 

728x90