PYTHON/Web Scraping

2.4 웹 스크래핑 - 불필요한 자료 지우기

  • -

 

지난 게시글
1.1 웹 스크래핑 - 방법 알아보기
1.2 웹 스크래핑 - urlopen과 beautifulsoup4 사용 방법 (1)
1.3 웹 스크래핑 - urlopen과 beautifulsoup4 사용 방법 (2)
1.4 웹 스크래핑 - requests 라이브러리도 사용해보기(1)
2.1 웹 스크래핑 - 원하는 자료 찾기 (1)
2.2 웹 스크래핑 - 원하는 자료 찾기 (2)
2.3 웹 스크래핑 - 원하는 자료 찾기 (3)

 

 

결과물 확인하기

지난 게시글에서 제작했던 코드가 만들어낸 결과물을 보면, 아래의 화면에서 찾아볼 수 있는 8개의 종목 외에도 더 많은 종목들이 출력되는 모습을 확인할 수 있다. 그 이유는 단순하다. 상한가 탭에 있는 8개의 종목에서 끝나지 않고 그 옆에 있는 하한가 탭, 상승 탭, 보합 탭, 하락 탭 모두에 접근하면서 종목명과 종목코드들을 불러오기 때문이다.

종목명: 세기상사
종목코드: 002420

종목명: 바른손
종목코드: 018700

종목명: 바른손이앤에이
종목코드: 035620

종목명: 지에스이
종목코드: 053050

종목명: KPX생명과학
종목코드: 114450

종목명: 코이즈
종목코드: 121850

종목명: 에스피시스템스
종목코드: 317830

종목명: 예스피치
종목코드: 403360

종목명: 비엔디생활건강
종목코드: 215050

종목명: 대성에너지
종목코드: 117580

종목명: 대한과학
종목코드: 131220

그렇다면 우리는 상한가 탭 내에 있는 종목만을 대상으로 자료를 뽑아내야 하는 절차가 필요하다. 다시 말해, 모든 데이터가 입력되어 있는   test_2  변수를 수정해야 하는 것이다.

 

 

태그 디테일하게 설정하기

다시 네이버 증권에 들어가서 사용하고자 하는 자료의 HTML 구조를 살펴보니 아래와 같이   <div class="box_type_l">  태그의 하단 부분에는 <table summary="탑종목 상한가 리스트"> 뿐만 아니라 "탑종목 하한가 리스트", "탑종목 상승 리스트" 등 많은 탭들이 모두 포함되어 있음을 확인할 수 있다.  

우리는 여기서 "탑종목 상한가 리스트" 하단부에 있는 데이터만 필요한 것이기 때문에, summary가 "탑종목 상한가 리스트"인 경우에만 데이터를 가져오도록 코드를 수정해주도록 하자. 다행히도, 위의 사진에서 파란색 부분을 보면 알 수 있듯이 "탑종목 상한가 리스트"에는 id="siselist_tab_0" 등과 같이 각각의 테이블마다 고유한 id 값이 부여되어 있다. 이 id값을 통해 그 안에 있는 내용을 불러와보자. id 값을 통해 해당 구간의 데이터를 찾는 방법은 아래 코드의 11번째 줄을 확인하도록 하자.

from bs4 import BeautifulSoup as bs
import requests

url = 'https://finance.naver.com/sise'
response = requests.get(url)

if response.status_code == 200:
	html = response.text
	bsObj = bs(html, 'html.parser')
	test = bsObj.select_one('div.box_type_l')
	test_1 = test.select_one('table', {'id':'siselist_tab_0'})
	print(test_1)

else:
	pass


>>>
[<table cellpadding="0" cellspacing="0" class="type_2" id="siselist_tab_0" summary="탑종목 상한가 리스트">
<caption>상한가</caption>
<col width="4%"/>
<col width="4%"/>
<col width="4%"/>
<col width="*"/>
<col width="7%"/>
<col width="9%"/>
<col width="7%"/>
(이하 생략)

 

 

다시 for문으로 원하는 데이터 찾아오기

여기서 사용할 for문은 앞전 게시글에서 제작했던 것과 동일한 방식으로 진행되니, 한 번 제작했었다면 큰 어려움 없이 제작할 수 있을 것이다. 아래의 >>> 부분 아래에 있는 결과물을 보면, 네이버 증권 사이트에서 확인할 수 있는 내용 그대로 확인할 수 있다.

from bs4 import BeautifulSoup as bs
import requests

url = 'https://finance.naver.com/sise'
response = requests.get(url)

if response.status_code == 200:
	html = response.text
	bsObj = bs(html, 'html.parser')
	test = bsObj.select_one('div.box_type_l')
	test_1 = test.select_one('table', {'id':'siselist_tab_0'})
	test_2 = test_1.select('td > a')

	for i in test_2:
		print("종목명:", i.get_text())
		print("종목코드:", i['href'][-6:])
		print("")

else:
	pass
   
   
   
>>>
종목명: 세기상사
종목코드: 002420

종목명: 바른손
종목코드: 018700

종목명: 바른손이앤에이
종목코드: 035620

종목명: 지에스이
종목코드: 053050

종목명: KPX생명과학
종목코드: 114450

종목명: 코이즈
종목코드: 121850

종목명: 에스피시스템스
종목코드: 317830

종목명: 예스피치
종목코드: 403360

네이버 증권 상에서의 정보

 

조금 첨언하자면, if문 하단에 test와 test_1, test_2로 구분되어 있는 부분은 아래와 같이 깔끔하게 정리할 수 있다. 여기서 수정 후의 코드와 같은 방식으로 수정하게 된다면 for문의 대상이 되는 변수 역시 test_2가 아닌 test_1으로 변경해주어야 한다.

## 기존 코드
test = bsObj.select_one('div.box_type_l')
test_1 = test.select_one('table', {'id':'siselist_tab_0'})
test_2 = test_1.select('td > a')

## 수정 코드
test = bsObj.select_one('div.box_type_l > table', {'id':'siselist_tab_0'})
test_1 = test.select('td > a')

 

 


728x90
반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.