정적인 주가 데이터를 크롤링하는 방법
만약 주식 데이터가 정적인 형태로 제공된다면, 실습 화면의 예시와 같이 requests
와 BeautifulSoup
라이브러리만으로도 웹 크롤링을 진행할 수 있습니다.
이번 수업에서는 이 링크와 같은 가상 주식 데이터 표 내부의 데이터를 크롤링하는 방법을 알아보겠습니다.
회사명 | 현재가 | 전일대비 | 등락률 |
---|---|---|---|
회사 A | 1064 | 26 | 2.44% |
회사 B | 1458 | -35 | -2.40% |
회사 C | 1991 | 49 | 2.46% |
회사 D | 2595 | 22 | 0.85% |
회사 E | 3074 | -36 | -1.17% |
회사 F | 598 | 2 | 0.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 강의를 등록해 주세요!