카테고리 없음

멋쟁이 사자처럼 al스쿨7기 3주차 웹스크레핑

monawa 2022. 9. 28.
728x90
0201

## FinanceDataReader 란?

설치방법 

!pip install -U finance-datareader
 
 
라이브러리
#이역시 
import pandas as pd,
import numpy as np 로 데이버분석을 위해 판다스 불러와야함

 

import FinanceDataReader as fdr 

한국거래소 상장종목 전체 가져오기

fdr.StockListing?? # 먼저 도움말 보기

 
df = fdr.StockListing("KRX") # 한국거래소 상장종목 전체 가져오기 , 해당값을 df로 지정
 
df.shape # 해당데이터프레임의 행열수 확인 , ()를 붙이지않는다!
(7890, 10)
 
 
df.info() # 전체 데이터프레임의 요약정보를 봅니다.

# 결측치가 많은 이유는? 금융상품들이 있어서

df.describe() # 기술통계 값을 요약합니다.

 


파일로 저장하기 / 불러오기

저장하기

df.to_csv("krx.csv", index=False, encoding="cp949") 
# to_csv로 Dataframe을 데이터 저장용 파일인 CSV 파일로 바꿀 수 있다!
# cp949 엑셀이나 한글에서 불러오기위해서 인코딩 
#   index = False 는 인덱스는뺴고 저장
 
불러오기
pd.read_csv("krx.csv",encoding= "cp949")
# CSV로 저장된 파일을 다시 DataFrame으로 읽어오기 
# 위에 저장시 cp949로 인코딩해서 불러올때도 동일하게
 
 
url = 'http://kind.krx.co.kr/corpgeneral/corpList.do?method=download&searchType=13'
pd.read_html(url)[0]
# url 뒤에 [0] 을 붙이는 이유는 list에서 indexing을 통해서 data를 데이터프레임형태로 가져오기위해

 


0202

네이버 금융 뉴스기사 수집

 

pandas만으로 데이터 수집하기

import pandas as pd # pandas 불러오기
import numpy as np #numpy 불러오기
 

검색값 설정하기 

웹사이트에서 검색한 url안에는 우리의 검색어가 들어잇다

이렇게 검색어를 url에 붙여서 넘기는 문구를 퀴리스티링이라고 한다

#쿼리스트링 : 쿼리 문자열은 지정된 매개변수에 값을 할당하는 Uniform Resource Locator의 일부입니다. 쿼리 문자열에는 일반적으로 웹 브라우저나 기타 클라이언트 응용 프로그램에서 기본 URL에 추가한 필드가 포함됩니다.

 

이에따라서 url 변수로 설정하기 

# 수집할 url을 가져옵니다.
 
item_code = "035720"
item_name = "카카오"
page_no = 1
# url
url = f"https://finance.naver.com/item/news_news.nhn?code={item_code}&page={page_no}&sm=title_entity_id.basic&clusterId="
# item_code 에 원하는 종목번호  
# item_name 에 원하는 종목이름
# page_no 에 원하는 페이지번호를 넣으면 
print(url) 
#변수처리되어 자동 변경된 url출력!

p.s

#데이터 프레임에서 종목이름 찾기

df[df["Name"] == "삼성전자 "]

 

read_html 로 수집하기

 

table = pd.read_html(url) # 네이버 금융의 기사를 read_html로 수징하여 수집결과 는 table이라는 변수에 담는다

len(table) #테이블에 글자수
 

데이터프레임으로 만들기

df = table[0] #위에 수집한 결과중 tanle 변수안에 잇는 0번쨰 인덱스 값을 df라는 변수에 담는다 
cols = df.columns # cols변수에 데이터프레임 컬럼을 담는다
cols

Index(['제목', '정보제공', '날짜'], dtype='object')

 

반복문으로 데이터 모두 가져오기

for문을 사용하여 table변수안에 값 가져오기! 

temp_list = []  # 테이블 정보를 저장할곳
for news in table[:-1]:
    # [:-1]하는 이유는 맨마지막은 페이징이라 날려버림
    news.columns = cols
    # 데이터프레임의 컬럼명들을 cols 변수에 리스트 형식으로 저장합니다
    temp_list.append(news) # 임시 리스트에 테이블 정보 추가한다
    display(news) # news를 출력한다
 

수집한 데이터 하나의 데이터프레임으로 합치기

  • concat :
    • axis=0 행을 기준으로 위아래로 같은 컬럼끼리 값을 이어 붙여 새로운 행을 만듦
    • axis=1 컬럼을 기준으로 인덱스가 같은 값을 옆으로 붙여 새로운 컬럼을 만듦
 
df_nwes = pd. concat(temp_list) #concat으로 리스트 병합하여 하나의 데이터프레임으로 만들기
df_nwes

 

df_nwes = df_nwes.reset_index(drop=True)
#인덱스 번호를 초기화 .reset_index()
# drop=True을 하는이유는 인덱스 column으로 생성되는걸 방지!
df_nwes

위에서 수집한 데이터에서 결측치를 제거합니다.

#결측치란? 데이터에 값이 없는 것을 뜻

 

#결측치 제거방법 dropna()

#중복값 제거 방법 drop_duplicates()

 

df_nwes = df_nwes.dropna() #결측치 제거 

df_nwes = df_nwes.drop_duplicates() # 중복된 데이터 제거
df_nwes 

네이버 수집한 기사에서 "제목"에 "연관기사"가 들어가는 데이터를 제거합니다.

# ~를 사용하면 조건을 반대로 뒤집을수있다 

ex)

~pd.Series([True,False])
0    False
1     True
dtype: bool
df_news = df_nwes[~df_nwes["정보제공"].str.contains("연관기사")].copy() 
#str.contains를 이용하여 ~로 조건의  반대를 표시하고 이를 이용하여 연관기사를 제거 
df_news

 

 

종합해서 뉴스 한 페이지를 수집하는 함수만들기 

 

# get_one_page_news 함수 만들기
 
목표 
    get_url 에 item_code, page_no 를 넘겨 url 을 받아오고
    뉴스 한 페이지를 수집하는 함수
    1) URL 을 받아옴
    2) read_html 로 테이블 정보를 받아옴
    3) 데이터프레임 컬럼명을 ["제목", "정보제공", "날짜"]로 변경
    4) temp_list 에 데이터프레임을 추가
    5) concat 으로 리스트 병합하여 하나의 데이터프레임으로 만들기
    6) 결측치 제거
    7) 연관기사 제거
    8) 데이터프레임 반환
 
def get_one_page_news(item_codepage_no):
    url = get_url(item_code, page_no) # URL을 받아옴
    table = pd.read_html(url) # URL을 통해 테이블 정보 가져옴

    df = table[0]
    cols = df.columns #컬럼명을 통일하게 만듬 
    cols

    temp_list = []
    for news in table[:-1]:
        news.columns = cols 
        temp_list.append(news)

    df_nwes = pd. concat(temp_list) #concat으로 리스트 병합하여 하나의 데이터프레임으로 만들기

    df_nwes = df_nwes.reset_index(drop=True#인덱스 번호 초기화 

    df_nwes = df_nwes.dropna() #결측치 삭제

    df_nwes = df_nwes.drop_duplicates() #중복데이터삭제

    df_news = df_nwes[~df_nwes["정보제공"].str.contains("연관기사")].copy() #연관기사제거
    
    return df_news #
 
item_code = "005930"  
page_no = 1 # 변수 2 페이지번호 지정
get_one_page_news(item_code,page_no) # 해당 변수에따라 함수실행 

 

#종목이름을 바꾸면 번호랑 바꾸게 설정하기
item_name = "카카오게임즈" 
item_code = df_krx.loc[df_krx["Name"] == item_name, "Symbol"].values[0]
#  Symbol이 종목번호다!
temp = get_one_page_news(item_code, page_no)
temp

#함수안에서는 import를 뺴주자

반복문을 사용해 10페이지까지 수집


news_list = []
for page_no in trange(111):  #10번 반복하기
 #  trang는 그냥 range와 다르게 tqdㅡ에서 제공하여 별고 설치가 필요하며 진행상태를 표시해준다!
    temp = get_one_page_news(item_code, page_no) #위에서 만든함수
    news_list.append(temp) 
    time.sleep(0.1)
 
    # print(".", end = ".") # .으로 진행상태 알려줌

위에서 수집한 데이터를 판다스를 활용하여 하나의 데이터 프레임으로

concat 

# axis=0 행을 기준으로 위아래로 같은 컬럼끼리 값을 이어 붙여 새로운 행을 만듦

# axis=1 컬럼을 기준으로 인덱스가 같은 값을 옆으로 붙여 새로운 컬럼을 만듦

 

df_news = pd.concat(news_list) #concat 을 사용한다!
df_news.shape

파일로 저장하기

file_name = f"news_{item_code}_{item_name}.csv" # 자동적으로 종목번호와 종목이름 변수로 파일이름 변수생성 
 
 
df_news.to_csv(file_name, index=False) # 파일저장 (위에 지정한 파일이름으로 ,  인덱스는 가져오지않는다)
# to_csv 저장
 

pd.read_csv(file_name) #파일 불러오기 

# read_csv 불러오기


범주형 기술통계 데이터 수집 퀴즈

변수의 유일값의 갯수를 구하는 기능

  • unique() #unique 값의 갯수를 출력해 줍니다.

 

판다스를 통해 두 개의 변수에 대한 빈도 수를 구할 수 없는 것은?

  • pivot() # 형태만 변경하고 연산기능 없음 연산을 하려면 pivot_table()을 사용

 

판다스의 describe 기능을 통해 범주형변수의 기술 통계값을 구했을 때 알 수 없는 값은?

  • mean #범주형 데이터의 평균은 구할 수 없다!

 

범주형 변수와 수치형 변수를 함께 표현하기에 적합하지 않은 시각화는?

  • scatterplot() 은 두 수치형 변수간의 관계를 표현하기에 적합합니다.
  • pointplot() , boxplot() , scatterplot() , violinplot() 은가능!

 

컬럼명이 같은 여러개의 데이터 프레임을 하나로 함칠떄 사용하는 함수는?

  • concat

 

df.to_csv(file_name, index=True)

  • df. #데이터프레임을 df라는 변수에 저장. 
  • to_csv(file_name) #CSV 파일로 저장  
  • index=True #인덱스 값은 제외

 

한글인코딩이 꺠지지 않기위해 설정하는 인코딩값은???

  • cp949 # 암기해두면 좋다!

 

판다스를 통해 1개의 변수에 대한 빈도수를 구하기에 적합한 기능은?

  • value_counts()  # 하나의 변수에 대한 빈도수를 구합니다. 

 

pivot_table과 관련된 설명

  • pivot과 pivot_table의 가장 큰 차이점은 연산을 할 수 있는지 여부다.
  • pivot_table의 aggfunc 의 기본값은 평균(mean)다.
  • pivot_table은 groupby 를 사용하기 쉽게 만든 기능이다.
  • crosstab은 pivot_table을 사용하기 쉽게 만든 기능이다.

groupby를 통해 여러 컬럼으로 그룹화하여 연산을 해서 생성한 멀티인덱스의 마지막 인덱스 값을 컬럼으로 만들고자 할 때 사용하는 것

unstack()

 

countplot 

  • countplot 은 x, y 둘 중 하나를 입력하면 나머지 축에 빈도수를 구해서 표현합니다. 
  • 따라서 x, y 축 둘 다 지정할 수 없으며 둘 중 하나만 지정해야 합니다.

 

범주형 변수를 산점도로 표현방법

  • stripplot()
  • swarmplot()
  • scatterplot은 수치형 변수를 표현하기에 적합하다
  • #범주형 변수를 표현시 점이 겹쳐쳐 보이기에 할순 있으나 빈도나 분포를 제대로 알아보기 힘들다!

 

.catplot 은 범주형 변수의 서브플롯을 그릴 때 사용합니다.catplot 을 통해 시각화 할 수 없는 그래프는 무엇일까요?

  • stripplot() , boxplot() , violinplot() - 시각화가능
  • histplot() 은 수치형 변수에 대한 도수 분포를 시각화한 것으로 catplot 으로는 시각화 할 수 없다

catplot이 다른 박스 ,바이올린등 다른플롯과 다른점음 서브플롯을 그려볼수있다 

 

라이브러리

  • FinanceDataReader #한 줄로 금융 데이터를 수집할 수 있는 라이브러리
  • pandas - 데이터 분석 라이브러리 
  • Beautifulsoup4 - Requests를 이용하여 http 통신을 통해 다양한 웹 데이터를 수집하고, 그렇게 수집한 HTML 데이터를 해석하는 라이브러리 
  • tqdm - 작업 진행 상태 확인 라이브러리 입니다.

 

데이터프레임 내에서 같은 값이 있으면 중복값 중 하나를 남기고 나머지를 삭제해주는 메서드는?

  • drop_duplicates
728x90

댓글