데이터분석(파이썬)

정적 페이지 크롤링 (beautifulsoap4)

Dean83 2023. 4. 7. 12:32

1. 정적 페이지 크롤링

     - 정적 페이지의 좋은 예가 네이버 증시 페이지 이다. 이걸 기준으로 내용 정리를 하려 한다. 
     - 해당 페이지의 url 은 https://finance.naver.com/sise/sise_index_day.naver?code=KPI200&page= {page_no} 로,

        페이지 번호가 바뀌면 url 이 변경된다.

     - beautifulsoup4 를 통해 페이지 내용을 가져온 후, 원하는 데이터를 추출해 온다. 

    

크롬 브라우저에서 F12를 눌러 개발자 모드로 진입 한 뒤, 내가 원하는 항목에 마우스를 갖다대면, 

우측에 소스코드가 나오게 된다.  해당 화면에서 마우스 우클릭 -> Copy XPath를 하여 find_all 에 사용할 이름을 확인한다.

 

import requests
import bs4

number = 1
page_url = f"https://finance.naver.com/sise/sise_index_day.naver?code=KPI200&page={number}"

source = requests.get(page_url).text
source = bs4.BeautifulSoup(source)

dates = source.find_all("td",class_ = "date")

아래처럼 날짜를 가져오게 된다. 

'2023.02.13',
 '2023.02.10',
 '2023.02.09',
 '2023.02.08',
 '2023.02.07',
 '2023.02.06'

가격 정보 가져오기

prices = source.find_all("td",class_ = "number_1")

price_list = []
for price in prices[::4]:
    price_list.append(price.text)
    
price_list

- 배열에 ::4의 의미는, 처음부터 4 간격으로 데이터를 가져오겠다는 뜻으로, 점프를 하게 된다.

- find_all의 결과인 prices 의 텍스트를 보면, td 클래스가 하나에 4개씩 들어가 있고, 그중 첫번째가 가격정보 이다. 

- 아래는 prices 의 원본이다

[<td class="number_1">323.13</td>, <td class="number_1">
<span class="tah p11 red01">
				+1.67%
				</span>
</td>, <td class="number_1" style="padding-right:40px;">86,068</td>, <td class="number_1" style="padding-right:30px;">4,932,899</td>, <td class="number_1">317.82</td>, <td class="number_1">
<span class="tah p11 nv01">
				-1.77%
				</span>
</td>, <td class="number_1" style="padding-right:40px;">145,369</td>, <td class="number_1" style="padding-right:30px;">7,946,592</td>, <td class="number_1">323.56</td>, <td class="number_1">
<span class="tah p11 red01">
				+0.56%
				</span>
</td>, <td class="number_1" style="padding-right:40px;">121,196</td>, <td class="number_1" style="padding-right:30px;">6,690,164</td>, <td class="number_1">321.75</td>, <td class="number_1">
<span class="tah p11 red01">
				+0.43%
				</span>
</td>, <td class="number_1" style="padding-right:40px;">155,303</td>, <td class="number_1" style="padding-right:30px;">9,273,697</td>, <td class="number_1">320.38</td>, <td class="number_1">
<span class="tah p11 nv01">
				-0.51%
				</span>
</td>, <td class="number_1" style="padding-right:40px;">137,961</td>, <td class="number_1" style="padding-right:30px;">7,276,002</td>, <td class="number_1">322.03</td>, <td class="number_1">
<span class="tah p11 red01">
				+1.25%
				</span>
</td>, <td class="number_1" style="padding-right:40px;">194,245</td>, <td class="number_1" style="padding-right:30px;">9,773,752</td>]

 

- 아래는 이 데이터에서 가격정보 text만 추출한 결과이다. 

['323.13', '317.82', '323.56', '321.75', '320.38', '322.03']

 

for 문을 이용하여 page 번호를 바꿔 url을 호출하고 위의 작업을 하면, 각 페이지 별로 크롤링을 할 수 있다. 

 

마지막 페이지 번호 확인 하기

웹페이지에 보면, 맨뒤 라는 항목이 있다. 해당 부분을 크롬 브라우저를 통해 위에서 한것처럼 데이터를 가져오면, 마지막 페이지 번호를 확인 할 수 있다. 

p = source.find_all("td",class_ = "pgRR")[0].find_all("a")[0]["href"]

index = int(p.split("page=")[-1])

 

 

'데이터분석(파이썬)' 카테고리의 다른 글

EDA (Exploratory Data Analysis)  (0) 2023.04.10
Pandas  (0) 2023.04.10
동적 웹크롤링 (Selenium, Cromedriver)  (0) 2023.04.10
웹 크롤링 기획 기본  (0) 2023.04.07
데이터 분석 개요  (0) 2023.04.07