IT/python

[python] 네이버 증권 web crawling 해보기

고잉킴 2023. 10. 19. 15:27

오늘도 잡주에 물려있는 고잉킴입니다.

테마주 크리 타고 잠깐 올랐던 주식에 물려서 빼지도 못하고 외면하고 있습니다.

 

헛헛한 마음에 이미 많은 블로그에서 공유되었지만 일별 시세를 web crawling 을 해보았습니다.

 

1. 패키지 install

pip install beautifulsoup4
pip install pandas==2.0.3  
pip install requests
pip install lxml ## html parser

pandas 의 버전을 지정한 이유는 2.1.0부터 read_html 이 deprecate되어서 2.0.3으로 지정하여 설치하였구요.

 Error : FutureWarning: Passing literal html to 'read_html' is deprecated and will be removed in a future version. To read from a literal string, wrap it in a 'StringIO' object.
  data = pd.read_html(req)[0].to_csv(index=False, header=True)

parser로는 많이 사용하는 lxml을 사용하겠습니다. 

 

2. 필요 패키지 import

from bs4 import BeautifulSoup
import requests
import pandas as pd


3. URL, GET request 입력

각 사별 코드 번호는 네이버 증권에서 검색시 숫자가 있는데요. 그 숫자를 넣어주시면 됩니다.

code = '코드번호'
sise_url = f'https://finance.naver.com/item/sise_day.naver?code={code}'

headers = {'User-agent': 'Mozilla/5.0'}
html_content = requests.get(sise_url, headers=headers).text

여기서 header 에 User-agent 를 넣어줍니다. 해당 페이지로 접근해서 개발자 도구 > Network > Header 정보를 조회할 수 있습니다. User-agent의 경우 네이버 증권 접속시 필수 Header라 넣어줘야 접근이 가능합니다.  

User-Agent header


4. html 파싱하고 맨 마지막 페이지 정보 추출

soup = BeautifulSoup(html_content, "lxml")
pgrr = soup.find('td', class_='pgRR')
print(pgrr.a['href'])

s = pgrr.a['href'].split('=')
last_page = s[-1]

맨 마지막 페이지의 태그를 찾아서 a태그 값을 출력해보고 마지막 페이지를 추출합니다.

 

5. 데이터 조회

df = pd.DataFrame()

for page in range(1, int(last_page)+1):
    url = '{}&page={}'.format(sise_url, page)
    req = requests.get(url, headers=headers).text
    df = df._append(pd.read_html(req, header=0)[0], ignore_index=True)


df = df.dropna()
df.reset_index(drop=True, inplace=True)
print(df)

 

6. 정리

네이버 증권뿐만 아니라 일부 웹크롤링을 막아두지 않은 사이트에 대해서도 적용해볼 수 있지 않을까 싶습니다.

물론 인증 부분이 들어가면 requests 관련 추가되는 부분들이 있겠네요.

결국 접근하는 url 정보와 tag 정보 (페이지 우클릭 >  페이지 소스 보기) 를 변경해주면서 필요한 정보를 긁어가면 되겠죠!