본문 바로가기
Python/크롤링&스크래핑

[웹스크래핑] BS4 활용 + CSV 기본 - 네이버 증권

by 리미와감자 2023. 1. 26.

실습 1 : 네이버 증권 웹페이지에서 시가총액 1 ~ 200위 종목과 정보 가져오기

 


 

 

import csv
import requests
from bs4 import BeautifulSoup

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

 

스크래핑한 정보를 저장하기 위해 csv 모듈을 사용한다.

 

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

 

url 맨 뒤 page= 다음에 숫자가 오는데 숫자가 빠져있다. 페이지 숫자는 for문을 사용하여 접근할 것이다.

 

예를 들어,

page=1 : 첫 번째 페이지

page=2 : 두 번째 페이지

 

 

 

 


filename = "시가총액1-200.csv"

f = open(filename, "w", encoding="utf-8-sig", newline="") #utf-8-sig : 엑셀파일에서 한글이 깨지는 경우 사용, newline="" : 자동줄바꿈 제거
writer = csv.writer(f)

title = "N 종목명    현재가    전일비    등락률    액면가    시가총액   상장주식수  외국인비율  거래량    PER    ROE    ".split("\t") # 탭으로 구분한뒤 리스트 반환
writer.writerow(title)

 

filename : 저장할 파일

encoding="utf-8-sig" : 엑셀 파일에서 한글이 깨지는 경우 사용

newline="" : 자동줄바꿈하지 않음

 

writer = csv.writer(f) : csv 모듈의 인스턴스 정의. 정의 후에 writer 인스턴스를 사용하여 엑셀에 텍스트를 쓸 수 있다.

 

 

writer.writerow(title) : 행 방향으로 제목을 쓴다(리스트 형태).

 


for page in range(1, 5):
    res = requests.get(url + str(page))
    res.raise_for_status()
    soup = BeautifulSoup(res.text, "lxml")

1 ~ 4 페이지의 종목들을 스크래핑하기 위해서 for문을 사용한다. url에 페이지 번호를 붙여 1 ~ 4 페이지에 접근한다.

 

 

 


data_rows = soup.find("table", attrs={"class":"type_2"}).find("tbody").find_all("tr")
for row in data_rows:
    columns = row.find_all("td")
    if len(columns) <= 1: # 의미없는 데이터 skip(공백 제거)
        continue
    data = [column.get_text().strip() for column in columns]
    # print(data)
    writer.writerow(data) # list 형태의 데이터 쓰기

 

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

웹페이지에서 table 태그 아래의 tbody 아래의 tr 태그들을 가져온다.

 

 

 

for row in data_rows:
    columns = row.find_all("td")

tr 태그 안의 td 태그들을 가져온다.

ex) 삼성전자    63,400    1,600    +2.58% ...

 

 

 

 

if len(columns) <= 1: # 의미없는 데이터 skip(공백 제거)
    continue

종목 시세 정보 사이의 공백들은 필요없는 정보이므로 가져오지 않는다. td가 0 또는 1인 경우 공백이기 때문에 가져오지 않는다.

 

 

 

 

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

for문을 사용하여 리스트 형태로 저장한다.

 

 

 

writer.writerow(data) # list 형태의 데이터 쓰기

가져온 리스트 형태의 데이터를 엑셀에 쓴다.

 

 

 

 

결과

 

전체 코드

import csv
import requests
from bs4 import BeautifulSoup

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

filename = "시가총액1-200.csv"

f = open(filename, "w", encoding="utf-8-sig", newline="") #utf-8-sig : 엑셀파일에서 한글이 깨지는 경우 사용, newline="" : 자동줄바꿈 제거
writer = csv.writer(f)

title = "N 종목명    현재가    전일비    등락률    액면가    시가총액   상장주식수  외국인비율  거래량    PER    ROE    ".split("\t") # 탭으로 구분한뒤 리스트 반환
writer.writerow(title)

for page in range(1, 5):
    res = requests.get(url + str(page))
    res.raise_for_status()
    soup = BeautifulSoup(res.text, "lxml")

    data_rows = soup.find("table", attrs={"class":"type_2"}).find("tbody").find_all("tr")
    for row in data_rows:
        columns = row.find_all("td")
        if len(columns) <= 1: # 의미없는 데이터 skip(공백 제거)
            continue
        data = [column.get_text().strip() for column in columns]
        # print(data)
        writer.writerow(data) # list 형태의 데이터 쓰기

댓글