활용3. 웹스크래핑(0825-0829)/requests

스크래핑 2-3 네이버 주식 (csv 모듈 )

나도초딩 2022. 8. 28.

네이버 주식 (테이블->csv 모듈)

  1. import csv --> csv.writer(f) , writer.writerow(title)
  2. writer.writerow(리스트형데이터)
  3. 파일쓰기 : filename = "시가총액1-200.csv"
    f = open(filename, "w", encoding="utf-8-sig", newline="")
    writer = csv.writer(f)
  4. 엑셀에서 한글 깨질 때, utf-8-sig 로
  5. newline="" 이 없으면, row 마다 빈 줄이 추가됨.
  6. 탭 기준으로 split :: title .split('\t")
  7. 빈 줄 skip( td colspan="10" 같은..의미없는 줄은 출력X ) --> if len(columns) <= 1: continue
  8. .strip() 으로 공백처리. trim
  9. 표데이터 추출 data_rows 와 column
    1) soup.find 로 table->tbody->find_all("tr") ---->data_rows 배열객체
    2) column = row.find_all("td")
  10. 한 줄 for 문
    data = [column.get_text().strip() for column in columns]
import csv
import requests
from bs4 import BeautifulSoup

# url = "https://finance.naver.com/sise/sise_market_sum.naver?&page=1"
url = "https://finance.naver.com/sise/sise_market_sum.naver?&page=" # 바로 +1,+2

filename = "시가총액 1-200.csv"
f = open(filename, "w", encoding="utf-8-sig", newline="") # 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")
    # print(soup.text)

    data_rows = soup.find("table",{"class":"type_2"}).find("tbody").find_all("tr")
    for row in data_rows:
        columns = row.find_all("td")
        # <tr></tr> 중에 <td>가 한 개만 있는 <tr>은 skip. ex) td colspan="10"
        if len(columns) <= 1: # columns (<tr>)안에 td가 1개 이하면, 컬럼 보여주지 말고 다음 줄로
            continue
        #한 줄 for 문:리스트로 [i for i in data]
        data = [col.get_text().strip() for col in columns]
        print(data)
        writer.writerow(data) # 리스트형 data

    #     if len(columns):
    #         continue
    #     data = [col.get_text().strip() for col in columns]
    #     print(data)

댓글