개발자식

[크롤링] 웹 크롤링, 네이버 금융TOP 본문

Data/Python

[크롤링] 웹 크롤링, 네이버 금융TOP

밍츠 2022. 3. 30. 02:06

네이버 금융 TOP 종목을 크롤링한다.

이때 쓰인 table 태그를 알아보고 

어제보다 가장 많이 올른 종목을 확인해본다.


 

 

1. 네이버 금융 TOP 종목 크롤링

 

import requests
from bs4 import BeautifulSoup

 

url = 'http://finance.naver.com'
res = requests.get(url).content
soup = BeautifulSoup(res, 'html.parser')

 

 

TOP 종목의 종목명, 현재값, 어제보다 변화한 값, 어제보다 변화한 비율을 크롤링 하자

 

크롬 개발자 도구로 확인하니 TOP 종목이 tbody 태그로 감싸져 있는 것을 알 수 있다.

 

테이블 태그 

- 표를 만드는 태그

  • thead : 테이블 제목
  • tbody : 테이블 내용
    • <tr> : td 태그를 행으로 묶어줌
    • <td> : 표 각각의 실제 데이터를 의미
    • <th> : 표의 제목을 스는 역할
  • 세 가지 태그(thead, tbody, tfoot)는 필수사항은 아니고 구분하기 편함을 위해서이다.

 

사진 참고 :

 

 

 

tbody 태그를 찾고, tr 태그를 모두 찾는다.

 

top_items = soup.find('tbody', {'id':'_topItems1'})
item_rows = top_items.find_all("tr") 

print(len(item_rows))
print(item_rows[-1])

 

결과 :

 

15
<tr class="up">
<th scope="row"><a href="/item/main.naver?code=038500" onclick="clickcr(this, 'spe.slist', '038500', '15', event);">삼표시멘트</a></th>
<td>5,500</td>
<td><em class="bu_p bu_pup"><span class="blind">상승</span></em> 90</td>
<td> <em class="up"> +1.66% </em> </td>
</tr>

 

 

네이버 금융 TOP종목에는 "상승"이 없다.

아래의 사진을 보면 상승 표시의 기호가 td 태그에서 "상승"으로 대체됐고, 마찬가지로 하강 표시의 기호는 "하강"으로 대체됐다.

 

 

 

 

상승 95 -> 95 상승과 같이 바꿔주고 종목명, 현재값, 어제보다 변화한 값, 어제보다 변화한 비율을 출력하고 가장 많이 상승한 종목을 출력한다.

 

top_items = soup.find('tbody', {'id':'_topItems1'})
item_rows = top_items.find_all('tr') 

plus_items = [] # 백분율 변화량이 + 부호인 종목들을 모을 list
highest_item = {'top_name':'', 'percent_change':0} # 백분율 변화량이 + 부호인 종목 중 가장 큰 비율로 증가한 종목을 담을 dict

# item == 하나의 행 (종목)
for item in item_rows:
    item_name = item.find('th').get_text()
    item_price = item.find_all('td')[0].get_text()
    item_delta_price = item.find_all('td')[1].get_text()
    item_delta_percent = item.find_all('td')[2].get_text().strip()
    
    print('{} : 현재가 {}, 어제보다 {} {}, 백분율 변환 시{}'.format(
        item_name, item_price, item_delta_price[3:], item_delta_price[:2], item_delta_percent))
    
    # 백분율 변화량 기호가 '+' 이면
    if item_delta_percent[0] == "+":
        plus_items.append(item_name)
        
        # 백분율 변화량 기호가 '+' 이고 변화량 수치(+4.84% -> 4.84)가 기존 가장 큰 증가 비율보다 클 경우, 
        if float(item_delta_percent[1:-1]) > highest_item['percent_change']:
            highest_item['top_name'] = item_name
            highest_item['percent_change'] = float(item_delta_percent[1:-1])
        
plus_items = ', '.join(plus_items) # [W홀딩컴퍼니, 에이치엘비파워, 퓨전데이타] -> 'W홀딩컴퍼니, 에이치엘비파워, 퓨전데이타'

print('\n어제보다 상승한 종목은 [ {} ]입니다.'.format(plus_items))
print('어제보다 가장 많이 상승한 종목은 [ {} (+{}%) ]입니다.'.format(
    highest_item['top_name'], highest_item['percent_change']))

 

결과 : 

 

 

- 변화량 수치는 문자열로, % 기호를 인덱싱하여 떼주고 float()로 꼭 형변환 해야한다.

- 가장 큰 비율로 증가한 종목을 dict로 담았지만, sorted() 방식을 사용하여 정렬할 수 있다.

 

Comments