Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- 협업 필터링
- pytorch
- 백준
- selenium
- TF-IDF
- 데이터 엔지니어링
- 코딩테스트
- 분산 시스템
- 머신러닝
- 딥러닝
- 프로그래머스
- Python
- 웹크롤링
- 추천 시스템
- Overfitting
- Tensor
- 코테
- recommendation system
- codingtest
- 부스트캠프
- 데이터
- 파이썬
- 시각화
- 추천시스템
- wordcloud
- SGD
- 알고리즘
- Cosine-similarity
- coursera
- 웹스크래핑
Archives
- Today
- Total
개발자식
[크롤링] 웹 크롤링, 네이버 금융TOP 본문
네이버 금융 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() 방식을 사용하여 정렬할 수 있다.
'Data > Python' 카테고리의 다른 글
[Python] 순열과 조합 (Permutation and Combination) (0) | 2022.06.30 |
---|---|
[크롤링] 웹 크롤링_Open API 활용 (0) | 2022.03.31 |
[크롤링] 무한 스크롤 웹 스크래핑(Selenium) (0) | 2022.03.30 |
[크롤링] Post request 기반의 웹사이트 크롤링 (0) | 2022.03.30 |
[크롤링] BeautifulSoup, Wadis 마감 상품 재고 체크 & 메일 발송 크롤링 (0) | 2022.03.30 |
Comments