Excelsior

[Crawling] Python을 활용한 네이버 주식 정보 크롤링 및 JSON 파일 생성 본문

Big Data

[Crawling] Python을 활용한 네이버 주식 정보 크롤링 및 JSON 파일 생성

Devsigner 2019. 5. 12. 21:00

- Used Info : 

    Python 3.7

    Pycharm (IDE)

    BeautifulSoup (Plugin)

    JSON

    MAC OS 10.14.4

 

파이썬이 생소하기도 하고 여러가지 연습차 팀원들과 간단한 네이버 주식정보를 크롤링 해보기로 했다.

 

내가 생각하기에 파이썬은 스크립트 형식으로 기존에 쓰던 언어인 자바와는 다르게 간단함을 추구하는 것 같아 '이미 아는 정보들' 때문에

이해하기 살짝 난해했던 것 같다.

 

먼저 이전에 포스팅했던 BeautifulSoup를 임포트해서 네이버 주식 정보를 가져왔다.

 

대상 소스 주소 : https://finance.naver.com/item/sise_day.nhn?code=215600

 

크롤링 대상 페이지

해당 페이지는 간단한 구조를 가지고 있었기 때문에 하드코딩으로 쉽게 페이지 정보를 가지고 올 수 있었다.

# 크롤링 하고자하는 페이지의 마지막 페이지를 찾기
    with urllib.request.urlopen("https://finance.naver.com/item/sise_day.nhn?code=215600") as response:
        html = response.read()
        soup = BeautifulSoup(html, 'html.parser')

        # 클래스가 .pgRR인 태그에 href 속성에 마지막 페이지의 정보가 들어있기 때문에 가져옴
        lastPageStr = soup.select('.pgRR > a')[0]['href']
        # 반목문을 위해 마지막 페이지를 찾아 정수형으로 형 변환하여 변수 선언
        lastPage = int(lastPageStr.split("page=")[1])

크롤링할 마지막 페이지를 찾았으니 본격적으로 태그를 찾아 찾고자하는 정보만 찾아 딕셔너리 타입에 인서트 시킨다.

# 페이지별로 주식정보를 크롤링 시작
    for pageIndex in range(1, lastPage):
        with urllib.request.urlopen("https://finance.naver.com/item/sise_day.nhn?code=215600&page=" + str(pageIndex)) as response:
            html = response.read()
            soup = BeautifulSoup(html, 'html.parser')

            # 해당 html 소스에 찾고자 하는 정보가 span 태그에 들어있으므로 해당 태그를 셀렉트
            rowArr = soup.select('span')

            stIdx = 1
            edIdx = 8
            fullStock = [[0] * 7 for i in range(10)]

            for i in range(0, 10):
                arrNum = 0
                for j in range(stIdx, edIdx):
                    fullStock[i][arrNum] = rowArr[j].text.strip()

                    arrNum += 1
                temp_dict[str(fullStock[i][0])] = {"종가" : fullStock[i][1], "전일비" : fullStock[i][2], "시가" : fullStock[i][3], "고가" : fullStock[i][4], "저가" : fullStock[i][5], "거래량" : fullStock[i][6]}
                stIdx += 7
                edIdx += 7

지식이 짧은 탓에 중간중간 하드코딩(...)이 있지만 이또한 연습이기 때문에! 간단히 넘어갔다.

 

해당 부분을 딕셔너리 타입으로 반환하는 함수를 작성

def naver_stock_crawling():
	...
    return dictionary

딕셔너리 타입을 JSON형식으로 변환해 파일로 만들어주는 함수 작성

def converToJson(dictionary):
    with open('naver_stock_info.json', 'w', encoding='utf-8') as file:
        json.dump(dictionary, file, ensure_ascii=False, indent='\t')

소스 실행 결과

{
	"2019.05.10": {
		"종가": "57,400",
		"전일비": "400",
		"시가": "57,500",
		"고가": "59,000",
		"저가": "56,300",
		"거래량": "861,478"
	},
	"2019.05.09": {
		"종가": "57,800",
		"전일비": "3,200",
		"시가": "60,900",
		"고가": "61,500",
		"저가": "57,700",
		"거래량": "1,237,743"
	},
	"2019.05.08": {
		"종가": "61,000",
		"전일비": "1,700",
		"시가": "62,000",
		"고가": "65,200",
		"저가": "60,300",
		"거래량": "1,625,296"
	},
	"2019.05.07": {
		"종가": "62,700",
		"전일비": "1,100",
		"시가": "63,000",
		"고가": "63,500",
		"저가": "62,700",
		"거래량": "414,906"
	}
    ...
}

 

결과값이 예쁘게 JSON형태로 잘 나왔다.

 

 

*해당 작업은 공부 목적이며 어떠한 상행위와 연관 없습니다.

Comments