본문 바로가기
카테고리 없음

김대리, 네이버금융 크롤링 해 볼까?(2/2)

by 데이터스토리 2022. 2. 28.
반응형

"김대리. 이제 코딩을 할꺼면 그 단계에 따라 진행하는 거 겠네.

  1. 라이브러리 Import
  2. URL 생성
  3. 페이지 수집
  4. 파싱
  5. 데이터(주요검색종목) 추출

이 순서 말이지"

"예. 맞아요.

주요검색종목에서 종목(삼성전자, 카카오,...), 현재가, 변동금액 이렇게 추출 할께요."

 

"그래, O~~K."

1. 라이브러리 Import
import requests
from bs4 import BeautifulSoup

      "requests"는 웹페이지 코드를 가져오는 라이브러리이고,

      "BeautifulSoup"는 웹페이지 파싱하는 라이브러리 입니다.

      "BeautifulSoup"을 설치하면 bs4 라는 폴더에 생겨요. 그래서 "from bs4"를 붙여서 가지고 와요.

2. URL 생성
url = 'https://finance.naver.com/'

      네이버 금융 홈페이지에 접근합니다.

 

3. 페이지 수집
response = requests.get(url) 
print(response)

<output>

<Response [200]>

     정상처라인 '200'이 출력되었습니다.

 

4. 파싱
if response.status_code == 200: # 정상 
    html = response.text 
    soup = BeautifulSoup(html, 'html.parser') 
    print(soup) 
else: 
    print(response.status_code)

<output>

 

     "html = response.text" 코드는 URL 웹페이지 결과를 html 변수에 넣어줍니다.

     이것은 다음 줄에 있는 파싱을 위한 형태  데이터 입력을 위한 작업이죠.

 

     "soup = BeautifulSoup(html, 'html.parser')"가 BeautifulSoup을 이용하여 파싱을 위한 환경을 갖추는 것입니다.

     "print(soup)"로 출력하면 위 그림에 보이는 코드가 나와요.

     이 코드는 우리가 크롤링 하려는 페이지가 가지고 있는 코드와 같아요.

 

5. 데이터(주요검색종목) 추출

 

좀전에 개발자도구를 통해서 "주요검색종목"이 나오는 위치를 미리 확인했어요.

 

1) "selector복사"를 이용해서 위치값을 가져올께요.

 

위치값이 "#container > div.aside > div > div.aside_area.aside_popular > table" 이렇게 나와요.

 

 

2) 위치 부분의 코드를 가져와요

pos = "#container > div.aside > div > div.aside_area.aside_popular > table"

table = soup.select_one(pos)
print(table)

<output>

위 코드에서 soup.select는 pos 에 명시된 위치 하단의 코드를 저장하고 있어요.

soup.select_one(pos)

soup에 담긴 코드에서 "pos" 위치에 해당하는 코드 중 첫번째 코드(select_one이 그 의미임)를 가져와요.

변수 "table"을 출력해 보면 위 그림과 같이 나와요.

3) table에 담긴 코드를 좀 더 분석해 볼께요.

 

 먼저 table 변수 내용을 보면 아래 그림처럼 <tbody> 아래로

<tr>~</tr> 블록이 반복되는 것이 보여요.

여기에 <th..>에 종목이름인 '삼성전자'가 보이고

<td>~</td>사이에 현재가인 71,900원이 보이죠.

<img..>의 속성으로 alt가 있는데 여기에 상승, 하락이 나오고 텍스트로 변동금액이 나오는 것을 알 수 있어요.

 

 

4) 반복처리되는 <tr> 태그 값을 가져와 볼께요.

 

tbody = table.select_one('tbody')   # 'tbody' 내역 분리
trs   = tbody.select('tr')          # <tr> 분리 --> 종목 블록 구분
print(trs); print('-'*50)

<output>

 

<tbody> 하부 코드를 가져왔어요.

<tr>..</tr>이 반복되고 있어요.

 

5) 반복되는 <tr> 태그안에 있는 종목명, 현재가, 변동방향, 변동금액을 가져와 볼께요.

for tr in trs:
    th   = tr.find("th")          # <th> 분리 --> 종목
    td   = tr.find("td")          # <td> 분리 --> 현재가
    img  = tr.find("img")["alt"]  # <img> 분리 --> 변동방향
    span = tr.find("span")        # <span> 분리 --> 변동금액
    
    print('--- ',th.text, td.text, img, span.text)  # 주식명, 현재가. 변동, 변동금액

<output>

 

 

반복문으로 각 항목 위치 내용을 변수에 넣었어요.

'상승, 하락' 데이터는 <img>태그에 'alt='속성에 있으니 "tr.find("img")["alt"]" 이렇게 코딩하면 됩니다.

 

이렇게 하니, 결과가 나왔네요.

 

팀장 어떠세요. 어렵지 않죠."

 

 

"그러네. 해 보니 어렵지 않은데.

자~. 아메리카노 한잔 하러가지."

//

반응형