멋쟁이 사자처럼 AI 스쿨 TIL-8.2

김영민·2022년 9월 29일
0

복습2

Pandas만으로 데이터 수집하기

수집하는 순서

1) URL 을 받아옴
2) read_html 로 테이블 정보를 받아옴
3) 데이터프레임 컬럼명을 ["제목", "정보제공", "날짜"]로 변경
4) temp_list 에 데이터프레임을 추가
5) concat 으로 리스트 병합하여 하나의 데이터프레임으로 만들기
6) 결측치 제거
7) 연관기사 제거
8) 데이터프레임 반환

Pandas 불러오기

# pandas 불러오기
import pandas as pd
import numpy as np
import FinanceDataReader as fdr
df_krx = fdr.StockListing("KRX")
a=[df.values]

수집할 url 가져오기

item_code = "263750"
item_name = "펄어비스"

page_no = 1

url = f"https://finance.naver.com/item/news_news.nhn?code={item_code}&page={page_no}&sm=title_entity_id.basic&clusterId="

read_html로 수집하기

table = pd.read_html(url, encoding="cp949")

데이터프레임으로 만들기

df = table[0]
cols = df.columns

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

temp_list = []
cols = table[0].columns

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

수집한 데이터 하나로 합치기

#concat :

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

df_news = pd.concat(temp_list)

위에서 수집한 데이터에서 결측치를 제거하기

df_news = df_news.dropna()

인덱스 번호 초기화

df_news = df_news.reset_index(drop=True)

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

#.str.contains 를 사용하며 조건의 반대에는 앞에 ~ 표시로 표현
df_news = df_news[~df_news["정보제공"].str.contains("연관기사")].copy()

중복된 데이터 제거

df_news = df_news.drop_duplicates()

함수로 만들기

# get_url item_code, page_no 를 넘기면 url 을 반환하는 함수
def get_url(item_code, page_no):
    """
    item_code, page_no 를 넘기면 url 을 반환하는 함수
    """
    url = f"https://finance.naver.com/item/news_news.naver?code={item_code}&page={page_no}&sm=title_entity_id.basic&clusterId="
    return url
get_url("035720",1)

# get_one_page_news 함수 만들기
def get_one_page_news(item_code, page_no):
    """
    get_url 에 item_code, page_no 를 넘겨 url 을 받아오고
    뉴스 한 페이지를 수집하는 함수
    1) URL 을 받아옴
    2) read_html 로 테이블 정보를 받아옴
    3) 데이터프레임 컬럼명을 ["제목", "정보제공", "날짜"]로 변경
    4) temp_list 에 데이터프레임을 추가
    5) concat 으로 리스트 병합하여 하나의 데이터프레임으로 만들기
    6) 결측치 제거
    7) 연관기사 제거
    8) 데이터프레임 반환
    """
    url = get_url(item_code,page_no)
    table = pd.read_html(url)
    df = table[0]
    cols = df.columns
    temp_list = []
    for news in table[:-1]:
        news.columns = cols
        temp_list.append(news)
    df_news = pd.concat(temp_list)
    df_news = df_news.dropna()
    df_news = df_news.drop_duplicates()
    df_news = df_news.reset_index(drop=True)
    df_news = df_news[~df_news["정보제공"].str.contains("연관기사")].copy()
    
    return df_news

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

# time.sleep() 을 통해 데이터를 쉬었다 가져옵니다.
import time
from tqdm import trange

item_code = df_krx.loc[df_krx["Name"] == "삼성전자", "Symbol"].values[0]


news_list = []
for page_no in trange(1,11):
    temp = get_one_page_news(item_code, page_no)
    news_list.append(temp)
    time.sleep(0.01)
profile
배운걸 다 흡수하는 제로민

0개의 댓글