Programming Basics

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

ISLA! 2023. 8. 4. 23:36

주가 크롤링하기

 

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

 

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

 

 

 

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