본문 바로가기
Programming Basics

[웹 크롤링] 네이버 증권에서 '종목코드', '상장회사', '주가' 크롤링하기

by ISLA! 2023. 8. 4.

주가 크롤링하기

 

다음과 같이 네이버 증권 페이지에서 종목코드 별로 상장회사와 주가를 확인하는 결과를 출력해보자.

 

가져오고 싶은 정보는 웹페이지에서 다음과 같다.

 

 

 

getSoup 함수

  • 크롤링하려는 대상의 url을 작성한다. 그런데 다음과 같이 종목코드별로 웹페이지가 다름을 알 수 있다.

  • 따라서 getSoup의 인자로 com_code(종목번호)를 받고, 이를 url 끝에 결합하도록 했다.

  • UserAgent 라이브러리로 custom_header 작성 : 크롤링하는 사용자 정보를 서버에 전달
  • 이전 예제와 동일하게 req 객체에 웹의 데이터를 가져와 저장
  • soup 객체에 html 데이터를 텍스트로 변환
  • return 값을 soup으로 한다

 

getPrice 함수

  • com_code(종목번호)를 인자로 받아, 바로 getSoup 함수를 실행시켜 그 결과를 soup 에 담는다
  • soup.select_one("p.no_today") : p 태그에서 no_today를 클래스로 가지는 값만 가져와 no_today 에 저장
  • no_today에서 span 태그의 blind 클래스 값만 가져와, 텍스트로 변환한 후 price 에 저장
  • price 값을 return

 

main 함수

  • 데이터를 가져오고 싶은 종목 코드를 com_code 리스트에 넣어준다.
  • 종목명은 com_names 리스트에 넣어준다.
  • price (주가) 이름의 빈 리스트를 만든다.
  • 반복문으로, com_code 리스트의 요소를 받아 getPrice() 함수로 주가를 받아오고
  • 주가를 price 리스트에 추가한다.
  • 마지막으로 df 객체에 종목코드, 회사 이름, 주가 값에 대한 리스트를 결합하여 데이터 프레임을 생성한다
  • print(df) 하면 끝!

 

 

🧑‍💻 전체 코드

import requests
from bs4 import BeautifulSoup
import pandas as pd
from fake_useragent import UserAgent


def getPrice(com_code):
    soup = getSoup(com_code)
    no_today = soup.select_one("p.no_today")
    price = no_today.select_one("span.blind").get_text()
    #print(price)
    return price

def getSoup(com_code):
    url = "https://finance.naver.com/item/main.naver?code="+com_code
    ua = UserAgent()
    
    # 기존 user-agent와 원리는 같음. 다만, 이런 라이브러리가 존재한다! 정도로만 확인해주세요!
    headers = {'user-agent' : ua.ie} 
    req = requests.get(url)
    soup = BeautifulSoup(req.text, "html.parser")
    return soup 

    return soup

def main():
    com_codes = ["030200", "005930"]
    com_names = ["KT", "삼성전자"]

    prices = []
    for code in com_codes:
        price = getPrice(code)
        prices.append(price)

    df = pd.DataFrame({"종목코드":com_codes, "상장회사": com_names, "주가": prices})
    print(df)
    

if __name__ == "__main__":
    main()

 

🧑‍💻 또다른 크롤링 방법(참고)

import requests
from bs4 import BeautifulSoup
import pandas as pd

com_codes = ["030200", "005930"]
com_names = ["KT", "삼성전자"]
com_price = []

def makeDf(all_list):
    df = pd.DataFrame({"code":com_codes, "name": com_names, "price": com_price})
    return df

def crawler(soup):
    price = soup.find("div", class_="today").find ("span", class_="blind")
    com_price.append(price.text)
    return None

def main():   
    custom_header = {
        'referer' : 'https://finance.naver.com/item/main.naver?',
        'user-agent' : 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36'
    }

    main_url = "https://finance.naver.com/item/main.naver?"

    for i in com_codes:
        url = main_url+"code="+i
        req = requests.get(url, headers = custom_header)
        soup = BeautifulSoup(req.text, "html.parser")
        result = crawler(soup)
    
    final_df = makeDf(result)
    return  print(final_df)

if __name__ == "__main__":
    main()

"""
1. 코드번호 가져오기
2. for i in [코드번호]:
    url = "~/000000"
"""

 

 

 

728x90