David의 개발 이야기!

웹 크롤러 개념 익히기[1] - 네이버 주식 현재가 크롤링 예제 본문

크롤링 공부

웹 크롤러 개념 익히기[1] - 네이버 주식 현재가 크롤링 예제

david.kim2028 2023. 5. 2. 16:41
반응형

데이터마이닝 수업을 수강하며, 크롤링의 필요성을 다시 한번 느끼게 되어, 정리겸 공부할겸 포스팅을 하게 되었다.

인공지능수업이나, 데이터분석 수업을 수강하는 대학생이라면, 아마도, 데이터수집의 어려움을 겪을 텐데, 크롤링을 할줄 안다면, 큰 도움이 될 것이다. 단계별로 하나하나씩 진행하며, 포스팅을 해볼 예정이니, 뒷 내용까지 함께 봐보자!

 

1. 네이버 주식 현재가 크롤링

https://finance.naver.com/item/sise.naver?code=005930 

 

네이버 증권페이지에서, 주가를 뽑아와 txt 파일에 저장하는 예제이다.

 

1-1 기본 코드

알아야할 모듈과 함수 

1. requests : html 코드를 가져온다.

2. bs4 : html 코드를 가져와서 예쁘게(인간눈에) 바꿔준다

3. .content : html 코드를 가져와서 보여준다.

4. .status_code : 제대로 접속이 되었는지 확인해준다 

4. find_all

5. select 

 

find_all 을 통해 추출하기 

# 삼성전자
data = requests.get('https://finance.naver.com/item/main.nhn?code=005930')

print(data.content) # html 코드를 가져와서 보여줌
print(data.status_code) #그 웹페이지 접속제대로 되고 있는지 확인 200-> 정상 400/500 -> 차단

soup = BeautifulSoup(data.content, 'html.parser') #가져온 html 코드를 이쁘게 다시 바꿔줌
print(soup)

# 이제 위에서 html 속에서 필요한 정보만 뽑으면 됌
print(soup.find_all('strong', id="_newVal"))    #동적인 부분은 selenium을 사용해야함
print(soup.find_all('span', class_="code")[0].text)

 

위와 같이 코드를 구현하면, 세가지 고민에 빠지게 되는데, 

Case 1 : 글자가 쪼개져 있을때는 어떻게 할까? 6/5/5/0/0

Case 2 : class, id 가 없을때는 어떻게 할까?

Case 3 : 이미지는 어떻게 불러올까?

 

해답은 아래 코드와 같다.

 

Select와 find_all 의 차이 -> Select 는 id나 class 모를때 사용, find_all 은 정확히 알때 사용

#Case 1 : 글자가 쪼개져있을때 -> 6/5/5/0/0 이면 그 위에 쌓여있는걸로 불러오면 됌
print(soup.find_all('span', class_="blind")[12].text)

#Case 2 : class, id 가 없을때 -> select 사용하면 됌! 클래스명이 .f_down인걸 찾아주세요 id가 #_nowVal을 찾아주세요 class 는 . id 는 #
print(soup.select('td.f_up em')[0].text)

#Case 3 : 이미지 불러오기
print(soup.select('#img_chart_area')[0]['src'])

또, 꿀팁으로는, class, id를 모를 경우에는, select에 경로 비스무리한걸 붙여넣으면 되는데, 

다음 사진처럼 편리하게 할 수 있다.

찾고자 하는 CSS selector 우클릭 > 복사 > Selector 복사 (맥기준)

 

1-2 다른 회사의 주가는 어떻게 가져올 수 있을까?

#LG전자
data2 = requests.get('https://finance.naver.com/item/main.naver?code=066570')

soup2 = BeautifulSoup(data2.content, 'html.parser')
print("LG전자 주가 : %s" % soup2.select('#chart_area > div.rate_info > div > p.no_today > em > .blind')[0].text)

코드를 보면 url 뒷부분 code = 숫자숫자 부분만이 1-1 기본코드와 변했다는 것을 알 수 있다.

숫자숫자 부분이 결국, 주식의 종목코드를 의미한다.

 

1-3 다른 회사들의 주가를 한번에 편리하고 효율적이게 가져올 수 있는 방법은 없을까?

import requests
from bs4 import BeautifulSoup

def stockPrice(code):
    data2 = requests.get(f'https://finance.naver.com/item/main.naver?code={code}')
    soup2 = BeautifulSoup(data2.content, 'html.parser')
    return soup2.select('#chart_area > div.rate_info > div > p.no_today > em > .blind')[0].text


codes = ['005930', '066575', '005380', '035720', '034220', '003490']

f = open('a.txt', 'w')
for code in codes:
    price = stockPrice(code)
    f.write(f"\n{price}")
f.close()

 

def 함수를 통해 종목 코드만 입력하면, 현재가를 가져올 수 있는 코드를 구현해보았다.

codes 리스트에 관심있어하는 회사의 종목코드를 입력하고, 회사의 주가를 가져와 txt 파일에 추가하는 부분을 코드에 추가했다.

 

종목코드를 입력해야하는 부분이 조금 번거롭지만, 주가가 궁금할때마다 빠르게 찾아보고 알려주는 코드를 만들기위해서는,

앞부분에 회사이름을 입력하면 -> 종목코드를 가져오고 -> 이를 바탕으로 주가를 가져오는 로직으로 프로그램을 만들면 되지 않을까 싶다.

 

간단하게 requests 모듈과, bs4 모듈의 사용법, url 을 읽는 법에 대해 정리해보았다.

 

다음 정리에서, 네이버 view 처럼, 무한 스크롤을 해야할 경우, 어떻게 크롤링을 해야하는지 알아보자.

 

2023.05.02 - [크롤링 공부] - 웹 크롤러 이해하기[2] - 무한 스크롤 해결하기!

 

웹 크롤러 이해하기[2] - 무한 스크롤 해결하기!

크롤링을 하려다가 보면, 페이지가 넘어가야하는 부분들을 처리해야 할 때가 있다. 크게 두가지 종류로 나눌 수 있는데, 1. 페이지 넘버로 구분되어있을때 2. 스크롤을 계속해서 로딩을 계속 해

david-kim2028.tistory.com

 

반응형
Comments