본문 바로가기

파이썬

[파이썬] 네이버증권 테마종목 크롤링 (3) List → DataFrame → Excel

첫 글에서 설정한 목적은 아래와 같은 엑셀 파일을 얻는 것이다.

 

 

지난 과정을 통해 저장한 데이터는 다음과 같다.

  • name[j] : 테마명 리스트
  • comp_t[j][i] : 회사명 리스트
  • info_t[j][i] : 설명 리스트

j개의 테마가 있고, 각각의 테마명에는 i개의 리스트가 있다.

애초에 df를 만들고 거기에 넣으면 편할 것 같은데 그걸 못 해서 우선 list에 받고 그걸 dict에 옮기고, 그걸 다시 df로 바꾸는 끔찍한 과정을 거쳤다.

사실 이 페이지에는 맨 마지막 줄인 df1.to_excel()만 있으면 끝이지만 그걸 못 해서 돌아갔다.

list → dict

import os
import pandas as pd

data = dict()
data['테마명'] = []
data['사명'] = []
data['설명'] = []

for j in range(len(comp_t)):
    for i in range(1,len(comp_t[j])):
        data['테마명'].append(name[j])
        data['사명'].append(comp_t[j][i])
        data['설명'].append(info_t[j][i])

#print(data)
  • 1번은 테마명과, 테마에 대한 설명이기 때문에 빼고 range(1~끝)까지 loop

dict→df

df1 = pd.DataFrame.from_dict(data)

df → excel

xl_dir = os.path.join(r"C:\\Users", "df.xlsx")
df1.to_excel(xl_dir)

path에 r을 붙이는 이유는 “\U”가 특수문자(?)로 유니코드로 인식되기 때문에 이를 방지하기 위함이다.

 

그 외에는 별다른 설명이 필요없는 코드다.

 

지정한 경로에 df.xlsx라는 이름으로 깔끔한 엑셀 파일이 생성되었다.

 

코드 통합본

import pandas as pd
import numpy as np
import math
import requests
from bs4 import BeautifulSoup as bs
import csv
import time
import re
import random
import openpyxl
import os

url = "<https://finance.naver.com/sise/theme.naver>"

page_url = "<https://finance.naver.com/sise/theme.naver?&page=>"
detail_url = "<https://finance.naver.com/sise/sise_group_detail.naver?type=theme&no=>"

# res = requests.get(url)
# print(res.raise_for_status())
# soup = bs(res.text, "lxml")

num = []
urls = []
name = []

for j in range(1,9):
    now = page_url+str(j)
    res = requests.get(now)
    soup = bs(res.text, 'lxml')

    theme_name_s = soup.find_all('td', attrs={"class": "col_type1"})
    #theme_name = theme_name_s.find_all('a')

    for i in theme_name_s:
        front = 'amp;no='
        a = str(i)
        
        theme_num = str(a[a.find(front)+len(front):a.find(front)+len(front)+4])

        theme_num = re.sub(r'[^0-9]', '', theme_num)

        front = 'no=' + str(theme_num) + '">'
        end = ''

        theme_name = str(a[a.find(front)+len(front):a.find(end)])
        #print(theme_num)
        num.append(theme_num)
        name.append(theme_name)

    time.sleep(1)
    print(j, ": done")
print("--------------------------------")

for i in num:
    urls.append(detail_url+str(i))

#print(name)

#print(len(num))
#print(urls[1])
# 테마 번호 추출 완료

#######################################
# # 데이터 추출 시작
#######################################

# print(len(company))
# print(info[1])
# print(company[1])

print("url finish")
print("url cnt : " + str(len(urls)))
cnt =0;

info_t = []
comp_t = []

for j in urls:
    now = j
    res = requests.get(now)
    soup = bs(res.text, 'lxml')

    info = soup.find_all('p', attrs={"class": "info_txt"})
    company = soup.find_all('strong', attrs={"class": "info_title"})

    for i in range(len(company)):
        name = str(company[i])

        front = name.find('info_title">') + len('info_title">')

        end = name.find("")

        company[i] = name[front:end]

        #print(company[1])

        inf = str(info[i])

        front = inf.find('"info_txt">') + len('"info_txt">')
        end = inf.find('')

        info[i] = inf[front:end]

        #print(info[1])

    info_t.append(info)
    comp_t.append(company)
    time.sleep(random.random()+0.1)

    if cnt%50 == 0:
        print(cnt, ": done")
    cnt +=1

# ====================== 크롤링 끝

#== DF로 땡겨오기 시작

data = dict()
data['테마명'] = []
data['사명'] = []
data['설명'] = []

cnt=0

for j in range(len(comp_t)):
    for i in range(1,len(comp_t[j])):
        data['테마명'].append(name[j])
        data['사명'].append(comp_t[j][i])
        data['설명'].append(info_t[j][i])

#print(data)

df1 = pd.DataFrame.from_dict(data)

xl_dir = os.path.join(r"C:\\Users", "data_fin.xlsx")
df1.to_excel(xl_dir)

 

 

 

그리고 결과물을 조금 다듬은 excel file

data_fin.xlsx
0.73MB

 

 

다 모르겠고 관심이 없으면 위 코드를 복붙해서 돌리면 되고

 

그것도 다 모르겠고 코드도 관심 없고 데이터만 원하면 위 엑셀 파일을 받으면 된다.