본문으로 건너뛰기
실습하기

정적인 주가 데이터를 크롤링하는 방법

만약 주식 데이터가 정적인 형태로 제공된다면, 실습 화면의 예시와 같이 requestsBeautifulSoup 라이브러리만으로도 웹 크롤링을 진행할 수 있습니다.

이번 수업에서는 이 링크와 같은 가상 주식 데이터 표 내부의 데이터를 크롤링하는 방법을 알아보겠습니다.

회사명현재가전일대비등락률
회사 A1064262.44%
회사 B1458-35-2.40%
회사 C1991492.46%
회사 D2595220.85%
회사 E3074-36-1.17%
회사 F59820.33%

예시로 제시된 표의 데이터는 새로고침을 하지 않는 한 변하지 않는 정적인 데이터입니다.


코드 설명

앞서 배운 requests와 BeautifulSoup 라이브러리를 사용해 크롤링을 하는 과정은 비슷하지만, response.encoding = "utf-8"을 통해 한글 데이터를 정상적으로 가져올 수 있도록 설정해야 합니다.

또한 find("td", {"class": "company-cell"}), find_all("tr")와 같이 find 메서드 심화 사용법을 알아보겠습니다.

Step 1

웹 페이지 HTML 가져오기
response = requests.get(url)
response.encoding = "utf-8"
html_content = response.text
  • requests.get(url): 지정된 URL로부터 웹 페이지의 데이터를 요청하고 응답을 받습니다.
  • response.encoding = "utf-8": 응답의 인코딩을 UTF-8로 설정하여 한글 등의 문자가 깨지지 않도록 합니다.
  • html_content = response.text: 응답으로 받은 HTML 컨텐츠를 텍스트로 저장합니다.

Step 2

HTML 파싱
soup = BeautifulSoup(html_content, "html.parser")
  • BeautifulSoup 객체를 생성하여 HTML 컨텐츠를 파싱합니다. 이로써 HTML 요소에 쉽게 접근할 수 있게 됩니다.

Step 3

stock_table = soup.find("table", {"id": "stock-table"})
  • soup.find() 메서드를 사용해 HTML에서 주식 데이터가 담긴 테이블 요소(<table id="stock-table">)를 찾습니다.

Step 4

테이블 내 데이터 추출
for row in stock_table.find("tbody").find_all("tr"):
  • stock_table.find("tbody").find_all("tr"): 테이블의 <tbody> 섹션 내 모든 행(<tr>)을 순회합니다.

각 행에서 다음 데이터를 추출합니다:

  • 회사 이름: class="company-cell" 클래스를 가진 <td> 요소의 텍스트입니다.
  • 현재 가격: class="current-price-cell" 클래스를 가진 <td> 요소의 텍스트입니다.
  • 전일 대비 가격 변동: class="diff-cell" 클래스를 가진 <td> 요소의 텍스트입니다.
  • 등락률: class="fluct-cell" 클래스를 가진 <td> 요소의 텍스트입니다.

Step 5

출력
print(f"{company_name}: 현재가 {current_price}, 전일대비 {price_change}, 등락률 {change_percentage}")
  • 추출한 데이터를 포맷에 맞추어 출력합니다.

실습

화면 오른쪽 코드 실행 버튼을 누르고, 크롤링 결과를 확인하거나 코드를 수정해 보세요!

다음 내용이 궁금하다면?

코드프렌즈 PLUS 멤버십 가입 or 강의를 등록해 주세요!