이제 데이터 공부 안하는 블로그

[패스트캠퍼스 수강 후기] 파이썬 인강 100% 환급 챌린지 25회차 미션 본문

파이썬

[패스트캠퍼스 수강 후기] 파이썬 인강 100% 환급 챌린지 25회차 미션

공사노비 2020. 11. 26. 19:59

오늘 스크래핑은 네이버금융에 주가 페이지를 활용해 연습해 보았습니다.

시가 총액 순위를 200위까지 가져와서 데이타를 csv형태의 파일로 만들어서 엑셀로 열어 보는 것입니다.
import하는것은 앞에서와 마찬기자로 requests와 beautifulsoup그리고 여기에 하나더 csv 입니다.

먼저 url 변수를 선언해서 주소를 가져옵니다. 주식 시가총액을 검색해서 페이지로 들어가면 순위별로 주식회사의 이름이 뜹니다. 앞에서 배웠던것과 비슷하게 url에 page이후에 나오는 숫자를 변경하면 원하는 페이지로 갈수있습니다.

url = "https://finance.naver.com/sise/sise_market_sum.nhn?sosok=0&page="
page뒤에 숫자를 지우고 url에 넣어줍니다.

for반복문으로 page뒤에 숫자를 넣어서 1페이지부터 5페이지 까지 데이타를 가져올수 있도록 코딩해 줍니다.

for page in range(1, 5):

#res 변수에 앞에 가져왔던 url변수에 페이지넘버를 더해서 써줍니다.

res = requests.get(url + str(page))
res.raise_for_status()
soup = BeautifulSoup(res.text, "lxml")

for 반복문을 사용한거 말고는 앞에서 했던 내용과 아주 비슷합니다. 어느 정도 반복하고 나니 이제좀 쉬워보입니다. 쉽진 않겠지만요.ㅋㅋ

계속 코딩해 줍니다.
개발자 도구를 통해 시가총액 순위 페이지를 자세히 살펴보면 데이타가 테이블 형태로 되어있는것을 알수 있습니다. table안에 tbody와 tr, td등의 하위 태그들로 구성되어있습니다. 이부분을 가져오기 위한 코딩을 해줍니다.

#soup으로 가져온 beautifulsoup객체에서 우리가 필요한 부분을 가져옵니다.
#data_rows변수에 주식회사 이름 현재가 전일비 등락률등의 데이타를 가져옵니다.
data_rows = soup.find("table", attrs={"class":"type_2"}).find("tbody").find_all("tr")

#각 행의 정보들을 가져옵니다. 1위는 삼성전자, 2위는 하이닉스 식입니다.
for row in data_rows:
columns = row.find_all("td")

#여기서 if문을 추가해주는 이유는 처음에 if문없이 코딩했을때 페이지의 줄바꿈이라든지 하는 빈공간이 전부 출력되는 문제가 있어서 필요없는 부분을 지워주기 위해서 입니다. 태그의 내용이 1줄이하라면 생략하고 넘어가는 내용입니다.

if len(columns) <= 1:
continue
data = [column.get_text().strip() for column in columns]
print(data)

여기까지 하면 데이타를 잘 가져오는것을 알수있습니다. 이제 이 데이타를 csv파일로 쓰는부분을 계속 해보겠습니다.

url변수 아래에 파일을 만드는 부분을 작성합니다.
filename = "시가총액.csv"
f = open(filename, "w", encoding="utf-8", newline=“”)#newline에 빈칸을 해둠으로써 줄바꿈이 두번되는것을 방지합니다.
writer = csv.writer(f)

그리고 작성한 코드 마지막 줄에
writer.writerow(data)
시가종액.csv파일이 생선된것을 볼수있습니다.

파일을 열어보면 콤마로 구분된 데이타들이 쭉 써있습니다. 엑셀로 파일을 열어보면 행,열로 구분되어 잘 들어가있습니다. 여기서 좀더 완성도있는 파일을 위해서 타이틀을 붙여주겠습니다.

다시 네이버주식 페이지를 보면 각 순위내 회사들의 이름위에 제목이 붙어있습니다. N, 종목명, 현재가 등등 입니다. 이것들을 복사한다음에 csv파일을 만들어준 코드밑에 넣어주겠습니다.

title = "N 종목명 현재가 전일비 등락률 액면가 시가총액 상장주식수 외국인비율 거래량 PER ROE".split("\t")
보면 복사한 제목의 내용들이 탭 띄어쓰기로 구분되어 있는데 csv는 콤마로 데이타들을 구분합니다. 그래서 split(“\t”)이부분을 넣어주었습니다. 그리고 바로 밑에 다시 행을 써주면됩니다.

writer.writerow(title)

여기 까지 완료하고 다시 실행해보면 엑셀파일에서 타이틀을 갖춘 200위까지의 시가총액 리스트를 볼수있습니다. 엑셀파일로 데이타를 만드는 부분까지 학습하고 나니 정말 이게 실생활이나 회사업무에서 편리한 도구일것 같다는 생각이 듭니다. 업무의 많은 부분을 자동화 할수 있을것 같습니다.

강의소개 https://bit.ly/33a7nvc