실습 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 형태의 데이터 쓰기
'Software > Python' 카테고리의 다른 글
Selenium(셀레니움) 브라우저 꺼짐 현상 (4) | 2023.01.30 |
---|---|
[웹스크래핑] Selenium(셀레니움) 셋업 (0) | 2023.01.30 |
[웹스크래핑] Beautifulsoup4 활용 3 - 다음 영화 (0) | 2023.01.24 |
[웹스크래핑] Beautifulsoup4 활용 2 - 쿠팡 (0) | 2023.01.24 |
[웹스크래핑] HTTP Method - Get vs. Post (0) | 2023.01.18 |
댓글