본문 바로가기
Python/Django(장고)

[Python/Django] 파이썬 주식 정보(뉴스) 페이지 만들기 - 5. 네이버 금융 크롤링 2

by 깐테 2021. 7. 15.

2021.07.13 - [Python/Django(장고)] - [Python/Django] 파이썬 주식 정보(뉴스) 페이지 만들기 - 4. 네이버 금융 홈페이지 크롤링 1

 

[Python/Django] 파이썬 주식 정보(뉴스) 페이지 만들기 - 4. 네이버 금융 홈페이지 크롤링 1

2021.07.07 - [Python/여러가지] - [Python] 파이썬 크롤링 - BeautifulSoup을 이용한 크롤링 [Python] 파이썬 크롤링 - BeautifulSoup을 이용한 크롤링 이번 포스트에서는 파이썬에서 자주 사용되는 BeautifulSou..

kante-kante.tistory.com

지난 포스트에서는 네이버 금융페이지에서 인기 검색 종목 상위 5개를 크롤링했다.

 

이번에는 좀 다른 정보들을 크롤링하여 웹에 표시해보도록 한다.

 


1. 네이버 금융 - 국내증시

 

https://finance.naver.com/sise/

 

국내증시 : 네이버 금융

관심종목의 실시간 주가를 가장 빠르게 확인하는 곳

finance.naver.com

업종별 시세는 전일대비 가격이 가장 많이 오른 분야의 정보를 보여준다.

 

여기서는 위의 3개 정보와 전일대비 상승률을 가져오도록 해보겠다.

 

업종별 시세 상위 3개

from bs4 import BeautifulSoup
import requests
import json

urls = 'https://finance.naver.com/main/main.nhn'
headers = {'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36"}
res = requests.get(urls,headers=headers)
soup = BeautifulSoup(res.text,'html.parser')

sise1 = list()
sise2 = list()

sise_title = soup.select('#content > div.article > div.section2 > div.section_top.section_top_first > ul > li > p.item > a > strong')
sise_diff = soup.select('#content > div.article > div.section2 > div.section_top.section_top_first > ul > li > p.item > em')

for s1 in sise_title:
    sise1.append(s1.text.strip())
    
for i in range(len(sise1)):
    title = sise_title[i].text.strip()
    diff = sise_diff[i].text.strip()
        
    sise_obj={
        'title':title,
         'diff': diff,
    }
    sise2.append(sise_obj)
sise_data = sise2

sise_title = 업종명

sise_diff = 전일비.

 

역시 django에서 출력하기 위해 리스트로 담아주었다.

 

 

 

2. 국내증시 - 인기 검색종목 10개

 

 

마찬가지로 인기 검색종목 상위 10가지가 정리되어 있는데, 이를 한번 크롤링해보도록 하겠다.

 

 

인기 검색종목 TOP 10

#python, django

from bs4 import BeautifulSoup
from urllib.request import urlopen
import urllib.request as req
import json

url = "http://finance.naver.com/sise/"          #네이버 금융 url 주소
res = req.urlopen(url).read().decode('cp949')   #utf-8 : 한글 깨짐, unicode_escape : 한글 깨짐, cp949로 변환해야한다.
soup = BeautifulSoup(res, "html.parser")
 
top101 = soup.select("#popularItemList > li > a")
top102 = soup.select("#popularItemList > li")
    
top10list1 = list()
top10list2 = list()

top101list = list()
top102list = list()
    
for top11 in top101:
    top10list1.append(top11.text.strip())

for top22 in top102:
    top10list2.append(top22.text.strip())

for i in range(len(top10list1)):
    toptext1 = top101[i].text.strip()

    item_objs={
        'toptext1':toptext1,
    }
    top101list.append(item_objs)
data1 = top101list

for i in range(len(top10list2)):
    toptext2 = top102[i].text.strip()

    item_objs={
        'toptext2':toptext2,
    }
    top102list.append(item_objs)
data2 = top102list

코드가 좀 요상하긴 한데 toptext1은 기업명을 의미하며

toptext2는 가격정보를 가지고 온다.

 

테스트 용으로 사용했던 코드라 알아보기 쉽지 않은데, 코드는 추후에 수정하도록 하겠다.

 

 

 

3.기관 순매수 상위 크롤링

https://finance.naver.com/sise/sise_deal_rank.nhn

 

외국인 매매 상위 : 네이버 금융

관심종목의 실시간 주가를 가장 빠르게 확인하는 곳

finance.naver.com

 

네이버 국내증시 페이지를 보면, 하단에 기관이나 외국인이 순매수 혹은 순매도한 기업들을 정리해 둔 표가 있다.

 

여기서는 우측에 보이는 기관 순매수 상위 7개를 크롤링 해보도록 하겠다.

 

 

기관 순매수 상위 7개

#django의 경우에는 views.py 부분에 함수를 정의해주면 된다. 이전 포스트 참조

from bs4 import BeautifulSoup
from urllib.request import urlopen
import requests
import json


url = 'https://finance.naver.com/sise/sise_deal_rank.nhn'         #네이버 금융 url 주소
headers = {'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36"}
response = requests.get(url,headers=headers)
soup = BeautifulSoup(response.text,'html.parser')

organ_name = soup.find_all('a', class_ = 'company')
organ_price = soup.find_all('td',class_ = 'number')

organ1 = list()
total_organ = list()

for o in organ_name[0:7]:
    organ1.append(o.text.strip())

for o2 in range(len(organ1)):
    title = organ_name[o2].text.strip()
    price = organ_price[o2].text.strip()

    organ_obj={
        'title': title,
        'price': price,
    }
    total_organ.append(organ_obj)
organ_data=total_organ

print(organ_data)

 

여기서 왜 organ_name(기관매수 기업명)을 [0:7]로 설정해두었냐 하면

 

처음에 BeautifulSoup을 이용하여 불러올 때 select가 아닌 find_all로 불러왔기 때문에

그 아래에 있는 인기 검색어까지 크롤링하게 된다.

 

따라서 인기 검색어는 리스트에서 제외시켜주기 위해 7개까지만 받아오도록 설정하였다.

 

print 문을 사용해서 확인해보면

 

배열 길이를 설정해주지 않았을 경우 이렇게 아래 부분까지 다 불러온다.

 

인기 검색어 부분을 제외한 기관 순매수 상위 7개를 불러왔다.

 

이렇게 따로 가져올수 있는것을 확인할 수 있다.

 

 

Django 웹에서 출력

 

반응형