오늘의 목표
네이버에서 제공하는 셀트리온의 주식 일별 시세를 뷰티풀 수프(Beautiful Soup)를 이용하여 크롤링해서 가져오기
1. 시장조사
셀트리온을 검색해서 들어가면 finance.naver.com/item/main.nhn?code=068270 해당 url 을 확인할 수 있다.
068270은 셀트리온 종목코드이고, 다른 종목을 확인하려면 종목코드만 바꿔서 접속하면 된다.
여기서 일별 시세 페이지를 보면 10page씩 아래와 같이 되어있음을 확인할 수 있다.
여기서 맨뒤로 이동하면 383page 까지 있음을 알 수 있다.
여기 page에서 페이지 소스보기를 클릭
<iframe name='day' src='/item/sise_day.nhn?code=068270' width="100%" height=360 marginheight=0 bottommargin=0 topmargin=0 SCROLLING=no frameborder=0 title="일별 시세"></iframe>
그럼 해당 소스코드를 확인 -> 저 경로를 통해서 저 표를 가져오는 듯
-> 저 경로로 들어가면 일별시세만 확인할 수 있는 페이지로 접속 할 수 있다.
-> finance.naver.com/item/sise_day.nhn?code=068270 요 경로
-> 여기로 들어가서 다시 페이지 소스보기 OR Ctrl + U 클릭
<td class="pgRR">
<a href="/item/sise_day.nhn?code=068270&page=383" >맨뒤
<img src="https://ssl.pstatic.net/static/n/cmn/bu_pgarRR.gif" width="8" height="5" alt="" border="0">
그럼 맨뒤라는 글자에 링크된 페이지가 383페이지임을 확인할 수 있다.
-> 여기서 383 숫자를 추출하여 1~383페이지까지 차례대로 일별 시세를 구할 수 있다.
2. 뷰티풀 수프(Beautiful Soup) 설치 및 사용하기
C:\Users\user\AppData\Local\Programs\Python>pip install beautifulsoup4
뷰티풀 수프(Beautiful Soup) 를 통해서 HTML 페이지 분석시 4가지 파서 라이브러리를 골라 사용 가능하다.
파서 | 문자열 | 장점 | 단점 |
python's html.parser | 'html.parser' | 기본 옵션으로 설치되어 있다. 속도가 적절하고, 유연한 파싱이 가능하다. | lxml 파서보다 느리고, html5lib 파서만큼 유연하지 못하다. |
lxml's HTML parser | 'lxml' | 속도가 매우 빠르고, 유연한 파싱이 가능하다. | |
lxml's XML parser | 'lxml-xml', 'xml' | 속도가 매우 빠르고, 유연한 파싱이 가능하다. | XML 파일에만 사용할 수 있다. |
html5lib | 'html5lib' | 웹 브라우저와 동일한 방식으로 파싱한다. 극도로 유연하여 복잡한 구조의 HTML 문서를 파싱하는데 사용한다. | 매우 느리다 |
이번 실습에서는 lxml 파서를 사용할 예정이므로 lxml 라이브러리도 함께 설치한다.
C:\Users\user\AppData\Local\Programs\Python>pip install lxml
2. 뷰티풀 수프(Beautiful Soup) find_all() 함수와 find() 함수 비교
find_all(['검색할 태그'][, class_='클래스 속성값'][, id='아이디 속성값'][, limit=찾을 개수])
find(['검색할 태그'][, class_='클래스 속성값'][, id='아이디 속성값'])
3. 뷰티풀 수프(Beautiful Soup) 를 이용한 데이터 크롤링하기
3-1 파이썬 코드를 이용한 소스코드 뽑아오기
- 여기서 문제가 발생했다... pgRR class 가 있는 페이지에 접근을 해야 하는데 이 페이지에 파이썬을 이용한 접근을 막아둔건지 접근이 안된다.. 그래서 그냥 소스코드를 내가 복사해서 따로 실습을 하였다.
<td class="pgRR">
<a href="/item/sise_day.nhn?code=068270&page=383" >맨뒤
-=> 우리가 앞서 확인한 소스코드에서 /item/sise_day.nhn?code=068270&page=383 이 부분만 출력하는 코드
>>>from bs4 import BeautifulSoup
>>>from urllib.request import urlopen
>>> url = 'file:///C:/Users/user/Desktop/item.htm'
// url = 'http://finance.naver.com/item/sise_day.nhn?code=068270' 원래는 이게 정상
>>> with urlopen(url) as doc:
html = BeautifulSoup(doc, 'lxml')
pgrr = html.find('td', class_='pgRR')
print(pgrr.a['href'])
/item/sise_day.nhn?code=068270&page=383
- url 변수에 해당 경로에 값을 가져와서
- html 변수에 해당 소스코드를 넣고
- pgrr 변수에 class 가 pgRR 이면서 td tag인 값을 넣고
- href값을 출력해 주었다.
3-2 본론 : 전체 페이지 읽어오기
3-1 과정을 통해서 해당 소스코드를 읽어왔으니 저 페이지 수를 이용해서 차례대로 한 페이지 씩 불러와보자
소스 코드를 통해서 확인했듯이 table 형태의 데이터이므로 팬더스의 read_html() 함수를 사용해서 읽는 것이 효과적이라고 한다.
>>> from bs4 import BeautifulSoup
>>> from urllib.request import urlopen
>>> url = 'file:///C:/Users/user/Desktop/item.htm'
>>> with urlopen(url) as doc:
html = BeautifulSoup(doc, 'lxml')
pgrr = html.find('td', class_='pgRR')
s = str(pgrr.a['href'].split('=')
last_page = s[-1]
>>> df = pd.DataFrame()
>>> sise_url = 'file:///C:/Users/user/Desktop/item.htm'
>>> for page in range(1, int(last_page)+1:
page_url = '{}&page={}'.format(sise_url, page)
df = df.append(pd.read_html(page_url, header=0)[0])
>>> df = df.dropna()
해당 소스코드를 응용하면 되는데.. 결국 나는 페이지 하나를 복사해서 붙여넣어서 만든거여서 해당 코드가 작동하지는 않는다...
결국 접근이 안되면 어찌할 방법ㅇ..
다른 방법을 연구 vs 계속 진도 나가며 공부 후자를 선택하였다.
- 모든 내용은 파이썬 증권 데이터 분석 책을 공부하며 작성해보았습니다.
'Python > 증권 데이터 분석' 카테고리의 다른 글
마리아디비(mariadb) 테이블 생성, 삭제, 버전확인 (0) | 2021.01.08 |
---|---|
마리아디비(mariadb) 설치하기 (0) | 2021.01.08 |
HTML 주요 태그 리스트(HTML main tag list) (0) | 2021.01.07 |
판다스(pandas) read_html() 함수로 엑셀파일 읽기, 사이트 파일 읽어오기 (0) | 2021.01.04 |
3년 전 - 마이크로소프트, 삼성전자 - 주식을 샀다면?? 코딩을 이용한 수익 비교 (0) | 2021.01.04 |
댓글