본문 바로가기
멋쟁이사자처럼 AI스쿨

네이버 증권 종목토론실수집(과제)

by 헬푸밍 2023. 1. 13.

 

이번주에 이것저것 배웠는데요...

 

이번주 배운것들... 입니다...

2023.01.12 - [멋쟁이사자처럼 AI스쿨] - 멋쟁이사자처럼 4주차 회고

 

멋쟁이사자처럼 4주차 회고

이번 주는 기본적인 데이터 수집에 대해 배웠다. 데이터를 수집하면서 많은 어려움이 있었지만... 무사히 수업을 마쳤다는 것에... 뿌듯하다! 가장 먼저 실습한 데이터 수집은... FinanceDataReader라

helpming.tistory.com

여기서 배운 지식을 가지고

 

좀 더 어려운 네이버 증권 종목토론실수집 과제를 해봅시다!

크게 4단계로 과제를 할 예정입니다!

 

1. 종목별 끝 페이지 번호를 얻는 함수 만들기(종목토론실정보를 끝페이지까지 모두 수집하기위해서)

2. 종목별 첫 페이지부터 끝 페이지까지의 정보를 얻는 함수만들기(1번 함수 사용)

3. 한 페이지 각 글의 내용링크를 얻어보기

4. 2번과 3번을합친 함수 만들기

 

대략 이정도로 단계를 나누고 시작합니다!

 

1. 종목별 끝 페이지 정보를 얻는 함수 만들기

 

먼저 필요할 것 같은 라이브러리를 import하고...

url(첫페이지의 url)을 가져옵니다...

import pandas as pd
import requests
from bs4 import BeautifulSoup as bs

item_code = '005930'  # 삼성전자의 item_code

url_for_end = 'https://finance.naver.com/item/board.naver?code={item_code}'

요정도로 하고...

 

요청 메서드가 get인것과...

 

headers에 넣을 것을 확인해 준 뒤...

 

코드에 추가해주고 BeautifulSoup를 사용해 html정보를 불러옵니다!

import pandas as pd
import requests
from bs4 import BeautifulSoup as bs

item_code = '005930'

url_for_end = f'https://finance.naver.com/item/board.naver?code={item_code}'
response = requests.get(url_for_end, headers = {'User-Agent':'Mozilla/5.0'})
html = bs(response.text)

그럼 이렇게 어지러운데...

 

여기서 마지막 페이지의 정보를 찾아야하니...

 

마지막 페이지로 갈 수 있는 링크가 걸려있는...

맨뒤 에서 마우스 오른쪽 클릭 후

검사를 클릭하면...

이렇게 파랗게 선택이되어 나옵니다.

 

그 다음 파란 부분에서 마우스 오른쪽 클릭 후 복사에서 셀렉터 복사를 클릭하면...

경로를 알 수 있고...

 

붙여넣기하면...

#content > div.section.inner_sub > table:nth-child(3) > tbody > tr > td:nth-child(2) > table > tbody > tr > td.pgRR > a

이렇게 나옵니다...

 

이제 이것을 이용해 #content를 빼고 필요없을 것 같은 부분은 빼서...

tbody > tr > td > table > tbody > tr > td > a

요정도로 이용해 봅시다!

 

select()를 이용해서 먼저 1단계를 출력해보면..

step1 = html.select('tbody > tr > td > table > tbody > tr > td > a')
step1

리스트의 마지막 부분에 마지막 페이지 번호가 있네여...

 

그럼 이제 이제 이것을 추출하는 코드를 만들어보면...

step2 = step1[-1]['href'].split('=')[-1]
step2

잘나오네여...

 

실제로도 아래처럼 마지막페이지는 88803입니다!

이제 코드를 합치고 함수를 만들고 실행해보면...

import pandas as pd
import requests
from bs4 import BeautifulSoup as bs

item_code = '005930'

def get_end_page(item_code):
    url_for_end = f'https://finance.naver.com/item/board.naver?code={item_code}'
    response = requests.get(url_for_end, headers = {'User-Agent':'Mozilla/5.0'})
    html = bs(response.text)
    step1 = html.select('tbody > tr > td > table > tbody > tr > td > a')
    step2 = step1[-1]['href'].split('=')[-1]
    end_page = int(step2)
    return end_page

get_end_page('005930')

함수가 잘 작동합니다!

 

2. 종목별 첫 페이지부터 끝 페이지까지의 정보를 얻는 함수만들기

함수를 바로 만들어버리면...

import pandas as pd
import requests


def get_pages(item_code, item_name):
    pages = []
    for page_no in range(1, get_end_page(item_code)+1):
        url = f'https://finance.naver.com/item/board.naver?'
        url = f'{url}code={item_code}&page={page_no}'
        headers = {'User-Agent':'Mozilla/5.0'}
        response = requests.get(url, headers = headers)
        page = pd.read_html(response.text)[1]
        page = page.drop('Unnamed: 6', axis=1)
        page = page.dropna()
        pages.append(page)
    pages = pd.concat(pages)
    
    pages['종목코드'] = item_code
    pages['종목이름'] = item_name
    pages['조회'] = pages['조회'].astype(int)
    pages['공감'] = pages['공감'].astype(int)
    pages['비공감'] = pages['비공감'].astype(int)
    cols = ['종목코드', '종목이름', '제목', '글쓴이',
            '조회', '공감', '비공감']
    pages = pages[cols]
    pages = pages.drop_duplicates()
    return pages

get_pages('206950', '볼빅')

이렇게 만들 수 있습니다...

 

간단히 설명해보면...

페이지 정보를 1페이지부터 마지막 페이지까지 for문을 사용해서 얻어오고...

얻어온 정보(데이터프레임)로를 리스트에 추가한 뒤 하나의 데이터프레임으로 만들어주고...

좀 깨끗하게 처리한 것입니다.

 

실행 결과는...

위와 같은데 종목토론실의 끝 페이지가 3이라 금방 불러와집니다!

처음에는 삼성전자로 시도했지만...

팔만대장경급 페이지수로인해... 40분이 넘도록 안불러와져서 취소했습니다...

 

어려우시다면...

2023.01.12 - [멋쟁이사자처럼 AI스쿨] - 멋쟁이사자처럼 4주차 회고

 

멋쟁이사자처럼 4주차 회고

이번 주는 기본적인 데이터 수집에 대해 배웠다. 데이터를 수집하면서 많은 어려움이 있었지만... 무사히 수업을 마쳤다는 것에... 뿌듯하다! 가장 먼저 실습한 데이터 수집은... FinanceDataReader라

helpming.tistory.com

여기를 참조하시면 만드실 수 있을겁니다!

 

3. 한 페이지 각 글의 내용링크를 얻어보기

1번 함수 만들때 처럼 내용이 들어가지는 링크에서...

마우스 오른쪽버튼 클릭 후 셀렉터경로를 복사하면...

#content > div.section.inner_sub > table.type2 > tbody > tr:nth-child(3) > td.title > a 이렇습니다!

쓸부분만 대충 추리면...

div > table.type2 > tbody > tr > td > a 이정도겠네여ㅎㅎ

 

그럼 한 페이지의 내용 링크가 포함된 정보를 모두 뽑아오는 코드를 만들고...

import pandas as pd
import requests
from bs4 import BeautifulSoup as bs

url = f'https://finance.naver.com/item/board.naver?code={item_code}'
response = requests.get(url, headers = {'User-Agent':'Mozilla/5.0'})
html = bs(response.text)
links = html.select('div > table.type2 > tbody > tr > td > a')
links

실행결과를 보면...

빨간 밑줄 부분에 링크정보가 들어있는 것을 볼 수 있습니다.

 

리스트 형식이라서 for문을 사용해서 모든 링크를 리스트 형식으로 반환하는 함수를 만들면...

import pandas as pd
import requests
from bs4 import BeautifulSoup as bs

url = f'https://finance.naver.com/item/board.naver?code={item_code}'
response = requests.get(url, headers = {'User-Agent':'Mozilla/5.0'})
html = bs(response.text)
links = html.select('div > table.type2 > tbody > tr > td > a')

links_list = []
for link in range(len(links)):
    links_list.append('https://finance.naver.com/'+links[link]['href']) 
links_list

이렇습니다...

 

링크가 포함된 정보에서'https://finance.naver.com/'가 빠져있어 추가했습니다...

 

실행결과는 다음과 같네여...

 

4. 2번과 3번을합친 함수 만들기

2번함수와 3번을 오류가 나지않게 합치고...

파일로 저장하고 다시 읽어오는 함수를 만들었습니다...

합치는 과정에서 3번 코드를 2번함수의 for문에 넣어줘야 모든 페이지의 내용링크를 얻을 수 있습니다!

def get_pages(item_code, item_name):
    pages = []
    for page_no in range(1, get_end_page(item_code)+1):
        url = f'https://finance.naver.com/item/board.naver?'
        url = f'{url}code={item_code}&page={page_no}'
        headers = {'User-Agent':'Mozilla/5.0'}
        response = requests.get(url, headers = headers)
        page = pd.read_html(response.text)[1]
        page = page.drop('Unnamed: 6', axis=1)
        page = page.dropna()
        html = bs(response.text)
        links = html.select('div > table.type2 > tbody > tr > td > a')
        links_list = []
        for link in range(len(links)):
            links_list.append('https://finance.naver.com/'+links[link]['href'])
        page['내용링크'] = links_list
        pages.append(page)

    pages = pd.concat(pages)
    
    pages['종목코드'] = item_code
    pages['종목이름'] = item_name
    pages['조회'] = pages['조회'].astype(int)
    pages['공감'] = pages['공감'].astype(int)
    pages['비공감'] = pages['비공감'].astype(int)
    cols = ['종목코드', '종목이름', '제목', '글쓴이','내용링크',
            '조회', '공감', '비공감']
    pages = pages[cols]
    pages = pages.drop_duplicates()
    
    file_name = f'{item_name}-{item_code}.csv'
    pages.to_csv(file_name, index=False)
    return pd.read_csv(file_name)

이렇게 합쳐서 하나의 함수로 만들 수 있습니다!

 

그럼 전체 코드를 실행시켜서 파일로 저장하고 다시 읽어와봅시다...

 

종목은... SK네트웍스우로 하겠습니다.(끝 페이지가 너무 길지 않음....)

import pandas as pd
import requests
from bs4 import BeautifulSoup as bs

def get_end_page(item_code):
        url_for_end = 'https://finance.naver.com'
        url_for_end = f'{url_for_end}/item/board.naver?code={item_code}'
        response = requests.get(url_for_end,
                                headers = {'User-Agent':'Mozilla/5.0'})
        html = bs(response.text)
        step1 = html.select('tbody > tr > td > table > tbody > tr > td > a')
        step2 = step1[-1]['href'].split('=')[-1]
        end_page = int(step2)
        return end_page

def get_pages(item_code, item_name):
    pages = []
    for page_no in range(1, get_end_page(item_code)+1):
        url = f'https://finance.naver.com/item/board.naver?'
        url = f'{url}code={item_code}&page={page_no}'
        headers = {'User-Agent':'Mozilla/5.0'}
        response = requests.get(url, headers = headers)
        page = pd.read_html(response.text)[1]
        page = page.drop('Unnamed: 6', axis=1)
        page = page.dropna()
        html = bs(response.text)
        links = html.select('div > table.type2 > tbody > tr > td > a')
        links_list = []
        for link in range(len(links)):
            links_list.append('https://finance.naver.com/'+links[link]['href'])
        page['내용링크'] = links_list
        pages.append(page)

    pages = pd.concat(pages)
    
    pages['종목코드'] = item_code
    pages['종목이름'] = item_name
    pages['조회'] = pages['조회'].astype(int)
    pages['공감'] = pages['공감'].astype(int)
    pages['비공감'] = pages['비공감'].astype(int)
    cols = ['종목코드', '종목이름', '제목', '글쓴이','내용링크',
            '조회', '공감', '비공감']
    pages = pages[cols]
    pages = pages.drop_duplicates()
    
    file_name = f'{item_name}-{item_code}.csv'
    pages.to_csv(file_name, index=False)
    return pd.read_csv(file_name)

    
display(get_pages('001745', 'SK네트웍스우'))

500페이지 정도 되면... 7분정도 걸리는 군요...

 

아무튼 데이터가 잘 불러와진 것 같네여!

 

내용정보까지 수집은... 주말에 알아봐야겠습니다...

 

그럼 안녕!

댓글