본문 바로가기
카테고리 없음

네이버 금융 웹 스크랩핑

by ekyoo 2021. 3. 11.
반응형
SMALL

파이썬 증권데이터 분석이라는 책을 참조하여 작성하였습니다.

제 4단락 웹 스크랩핑을 사용한 데이터 분석이라는 부분에서

네이버 금융페이지에서 관심있는 주식 종목의 일별 시세를 데이터를 모두 가져와

파이썬프로그램을 이용하여 보여주는 프로그래밍입니다.

 

책에서 보여주는 예제들은 항상 한번에 실행되지 않고 

적지않은? 삽질을 통해야만 실행이 되는데

처음 해보는 예제부터 난관이 많았습니다.

오랜만에 해보는 프로그래밍+삽질+개인적으로 살짝식 변형한 부분도 있습니다.

 

파이썬 증권데이터 분석이라는 책은 2020년 하반기쯤에 발행이 되었는데도 불구하고

3개월쯤이 지난 지금은

네이버금융 페이지가 웹 스크래핑을 차단 시켜

바로 데이터를 긁어오려고 시도하면 없는 페이지로 인식하게 만들어 버리더군요..

잦은 웹 스크랩핑으로 인해 상대방 시스템 성능에 지장을 주는 경우가 문제가 될 수 있기 때문입니다.

 

BeautifulSoup으로 lxml 파싱으로 html 페이지를 스크래핑시 에러페이지발생 !

from bs4 import BeautifulSoup as bs
from urllib.request import urlopen

url='https://finance.naver.com/item/sise_day.nhn?code=035720' # 035720=카카오 종목코드
with urlopen(url) as doc:
    html=bs(doc,'lxml')
    print(html)

아래와 같은 결과를 확인할 수 있습니다..

"방문하려는 페이지의 주소가 잘못 입력되었거나 페이지의 주소가 변경 혹은 삭제되어 요청하신 페이지를 찾을 수 없습니다.입력하신 주소가 정확한지 다시 한번 확인해 주시기 바랍니다."

여기서 왜안되는지  이해할 수 없어 오래걸렷네요.

 

그이유는 이 User agent 헤더정보 때문입니다.

헤더정보의 User Agent  정보가 설정되어 있어야 합니다.

테스트해보면...

from bs4 import BeautifulSoup as bs
from urllib.request import Request,urlopen

url='https://finance.naver.com/item/sise_day.nhn?code=035720' # 035720=카카오 종목코드

req=Request(url)
print(req.headers)

아무런 값이 설정되어있는것을 확인할 수 있습니다.

 

from bs4 import BeautifulSoup as bs
from urllib.request import Request,urlopen

url='https://finance.naver.com/item/sise_day.nhn?code=035720' # 035720=카카오 종목코드

req=Request(url)
print(req.headers)
req.add_header('User-Agent','Mozilla/5.0')
print(req.headers)
with urlopen(req) as doc:
    html=bs(doc,'lxml')
    #print(html)
    pgrr=html.find('td',class_='pgRR')
    print(pgrr.a['href'])

위와 같이 header정보에 User-Agent 정보를 추가해주고 다시 해당 네이버 금융페이지에 접근하면

제대로 html페이지를 받아오고 마지막 페이지가 몇페이지인지 읽어 올 수 있다.

헤더정보를 확인하려면 아래 사이트에 접속하여 확인하면 된다.

www.whatismybrowser.com/detect/what-is-my-user-agent

 

What is my user agent?

Every request your web browser makes includes your User Agent; find out what your browser is sending and what this identifies your system as.

www.whatismybrowser.com

또는 아래사이트에서도 확인할 수 있다.

http://m.avalon.co.kr/check.html

 

 

build_opener() 를 이용하여 매 페이지마다 User-Agent  헤더정보를 넣어주었다.

Request 생성자에 headers 인자를 넣어넣어주어도 되지만 페이지가 한두페이지가 아니니

자동으로 추가되게 하려고 시도해 보았다.

 

 

아래는 완성된 소스 코드이다.

소스를 실행하기 전에 반드시 install 해야할 라이브러리들이 있다.

 

pip install beautifulsoup4

pip install lxml

pip install html5lib

pip install pandas

 

import pandas as pd
from urllib import request as req
from bs4 import BeautifulSoup as bs

#네이버 금융 웹 스프랩핑 , 파이썬 증권 데이터 분석참조, [ekyoo]
#-----install 해야할것들-----
#pip install beautifulsoup4
#pip install lxml
#pip install html5lib
#pip install pandas
#---------------------------

# http://m.avalon.co.kr/check.html 에서 user agent정보를 넣어준다. user agent 정보를 넣지 않으면 네이버 금융 웹크롤링 차단됨.
headers=('User-Agent','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.36') 
url='https://finance.naver.com/item/sise_day.nhn?code=035720' # 035720=카카오 종목코드


opener = req.build_opener()
opener.addheaders = [headers]
response=opener.open(url)
doc=bs(response,'lxml')
last_page = doc.find('td',class_='pgRR').a['href'].split('=')[-1]
print('총페이지 : '+last_page)


df=pd.DataFrame()
for page in range(1,int(last_page)+1):
    page_url='{}&page={}'.format(url,page)
    response=opener.open(page_url)
    df=df.append(pd.read_html(response,header=0)[0])
    print('{}페이지 데이터 추가'.format(page))

df.dropna()
print(df)
반응형
LIST

댓글