본문 바로가기
프로그래밍/파이썬

[python] 웹 스크래핑을 통해 시가총액 정보를 csv파일로 가져오기

by 홍삼절편 2021. 9. 10.

오늘은 웹 스크래핑으로 웹 페이지의 정보를 한번에 가져와서 csv파일로 만들어볼 것이다.

(사실은 유튜브의 나도코딩 웹스크래핑에 있는 강의를 공부하며 작성하는 것임 ㅎ)

 

url = https://finance.naver.com/sise/sise_market_sum.nhn?sosok=0&page=1

네이버 주식 페이지로 들어가면 위와 같이 각 기업의 시가총액, 상장주식수, 외국인비율, 거래량, per 등의 정보를 한 눈에 볼 수 있다.

이 정보들을 한번에 csv 파일로 만들어보자!

 

먼저 필요한 것은 

csv파일을 만들 것이므로 import csv를 해주고

beautifulsoup을 사용할 것이므로 import requestsimport BeautifulSoup을 해준다

그리고 사용할 url을 추가해준다

여기서 url이 page=1로 끝나는데, 1페이지를 넘어서 2페이지, 3페이지 더 넘어서 사용하기 위해서는 page= 까지만 작성하고,

후에 for 반복문을 사용해서 url = 'https ~~~ page=' + i 형식으로 해서 계속 페이지를 넘어가게 할 수 있을 것이다.

 

그렇다면, 일단 1페이지에서 4페이지까지의 정보를 얻어오기 위해 for문을 사용하자

for page in range(1, 5):

     res = requests.get(url + str(page))

     res.raise_for_status()

     soup = BeautifulSoup(res.text, 'lxml')

의 과정을 통해서 각 페이지 마다 beautifulsoup을 사용할 준비를 마친다.

 

다음 과정은 저장되는 파일의 형식을 저장해주어야 한다.

filename = '시가총액.csv'

f = open(filename, 'w', encoding='utf-8-sig', newline='')

writer = csv.writer(f)

을 해주면 저장되는 파일의 형식을 지정해줄 수 있다.

 

크롬 브라우저의 검사 탭을 이용하면 해당 페이지의 html 구조를 볼 수 있다.

크롬에서 '검사'를 통해 html 구조를 볼 수 있다.

위 표를 분석한 결과, 가장 큰 표는 table이라는 태그를 가지고, type_2라는 클래스를 가지고 있다.

하위에는 tbody 태그 내에서, 또 하위에 각각 tr, 그 밑에 td라는 태그에서 각 기업의 정보를 가지고 있다.

기업마다의 정보들을 가져오기 위해서는 tr에 대한 정보를 가져오면 된다.

그 후 tr 하위에 있는 td의 값을 가져오면 된다.

 

 

각 기업들의 정보를 모두 가져오기 위해

data_rows = soup.find('table', attrs={'class':'type_2'}).find('tbody').find_all('tr')

의 식을 쓸 수 있다. 

 

후에 for문을 통해 각 tr안의 기업들의 데이터 값, 즉 td들을 가공해줄 것이다.

일단 각 열의 정보들을 모두 가져와야 하므로 columns라는 변수들을 만들고

columns = row.find_all('td')를 통해 이를 수행해준다.

 

그런데 위의 html에서 볼 수 있듯이 아무 정보가 들어있지 않은 tr도 존재한다. 이것은 위 column의 length을 측정함으로써 필터링할 수 있을 것이다.

이는 if len(columns) <= 1:

           continue                     의 수식으로 나타낼 수 있다.

 

이제 columns를 통해 추출한 정보들을 가공하여 data로 넣어주면 된다.

이 과정에서는 a for a in b 라는 공식을 사용해볼 것이다. 각 column에서 text만 추출하기 위해서 get_text를 사용하고, 추출한 텍스트에서 공백을 없애기 위해 strip()을 사용할 것이다.

data = [column.get_text().strip() for column in columns]

이렇게 하면 data라는 변수에 for 반복문을 통해서 각 열의 기업정보들을 넣을 수 있다.

이것을 파일에 write하기 위해서

writer.writerow(data)를 해주면 된다.

 

이렇게 하면, 제일 윗 행에 항목들에 대한 정보를 제외 된 채로 나오게 된다.

마지막 과정으로, url에서 위 항목들을 복사 한 후,

title = 'N종목명 현재가 전일비 등락률 액면가 시가총액 상장주식수 외국인비율 거래량 PER ROE'.split('\t')

writer.writerow(title)

을 상단에 해주면 복사한 항목들이 리스트 형태로 되어, 가장 윗 행에 항목 정보가 들어가게 된다.

 

이 과정을 거친 후 실행을 해주면,

시가총액.csv라는 파일이 생성된다.