본문 바로가기
Python/증권 데이터 분석

뷰티풀 수프(Beautiful Soup) 이용한 페이지 크롤링 작업

by grey-hat hacker 2021. 1. 7.
728x90

오늘의 목표

네이버에서 제공하는 셀트리온의 주식 일별 시세를 뷰티풀 수프(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&amp;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&amp;page=383" >맨뒤

 

-=> 우리가 앞서 확인한 소스코드에서  /item/sise_day.nhn?code=068270&amp;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 계속 진도 나가며 공부 후자를 선택하였다. 

 


- 모든 내용은 파이썬 증권 데이터 분석 책을 공부하며 작성해보았습니다. 

728x90
반응형

댓글