데이터 크롤링(3주차)
데이터를 시각화하고 분석을 진행함에 앞서 필요한 데이터들을 수집가능한지 어떤 문제점이 있는지 알아보기 위해 테스트를 진행해 보았다.
먼저 네이버 금융에 들어가 IT서비스 분야를 선택하면 다음과 같은 화면이 나타난다.
이 곳에서 필요한 데이터를 수집해 보기로 했다. 일단 종목명부터 수집해 보았다.
import requests
from pprint import pprint
from bs4 import BeautifulSoup
먼저 웹 크롤링을 하기 위해 필요한 패키지들을 불러왔다.
html = requests.get('https://finance.naver.com/sise/sise_group_detail.nhn?type=upjong&no=154') # 웹 페이지 요청
soup = BeautifulSoup(html.text, 'html.parser') # 다루기 좋게 파싱작업진행
data2 = soup.find_all('div', {'class':'name_area'}) # 회사 이름들을 추출한다.
len(data2) #66
66개의 모든 종목명을 추출했다.
name=[]
for i in range(len(data2)):
name.append(soup.find_all('div', {'class':'name_area'})[i].get_text())
print(name)
리스트로 만들어 좀 더 보기 쉽게 만들었다. 결과는 다음과 같다.
name1=[]
for i in range(len(name)):
name1.append(name[i].replace('*', '').replace(' ',''))
print(name1)
종목명에 특수문자와 공백을 제거했다. 결과는 다음과 같다.
이제 종목명 옆에 있는 다른 값들을 추출해 볼것이다.
이 곳에서 두가지의 문제점을 발견한다.
1.
name=[]
for i in range(len(data2)):
name.append(soup.find_all('div', {'class':'name_area'})[i].get_text())
for j in range(5,len(data2)*8+5):
name.append(soup.find_all('td', {'class':'number'})[j].get_text())
print(name)
두 번째 for 문에서 5로 설정한 이유는 위에 IT서비스 전체의 값들이 5개 있기 때문이다.
종목명 옆의 값들이 같은 클래스로 묶여있어 추출함에 있어 한꺼번에 추출된다.
위의 코드를 실행하면 다음과 같이 나타난다.
2.
표지 위의 체크박스에 값을 다른 것을 선택하면 초기값의 url이랑 달라지지 않기 때문에 다른 것들을 선택해도 초기값으로 크롤링이 된다.
그래서 다른 방법을 써 보기로 한다. 종목마다 각자 들어가서 그 곳에서 크롤링을 해보기로 한다. 각 종목마다 url이 코드 번호만 다르기 때문에 잘 설정한다면 가능하다고 생각했다.
FinanceDataReader라는 패키지를 사용해 IT서비스 분야의 종목들의 번호를 추출해보기로 했다.
import FinanceDataReader as fdr
# 한국거래소 상장종목 전체
df_krx = fdr.StockListing('KRX')
import re
df=[]
for i in range(df_krx.shape[0]):
for j in range(len(name1)):
if re.fullmatch(df_krx['Name'][i],name1[j]) != None:
df.append(re.fullmatch(df_krx['Name'][i],name1[j]))
df
전에 추출했던 회사명과 같은 데이터만 추출하였다. 그렇게 개수를 세 보았다.
len(df) #64
개수가 맞지 않았다. 그래서 또 다른 방법을 생각해봐야 할 것 같다.
댓글
댓글 쓰기