DATA ANALYSIS/TIL

[Day22] 데이터 핸들링(5)

yel1nk 2023. 5. 27. 02:33

Crawling

웹 상의 데이터 수집하기 위해 크롤링 사용

  • 클라이언트 - 요청 (Request)
  • 서버 - 응답 (Response)

POST vs. GET

Requests : 요청 라이브러리

  • HTTP 요청을 보내는 데 사용하는 라이브러리
  • 클라이언트의 요청
# GET 요청
import requests

url = 'http://www.paullab.co.kr/stock.html'
html = requests.get(url)
# POST 요청
import json

body = {'id': 'aaa', 'pw': 1234}
html = requests.post(url, data=json.dumps(body))

BeautifulSoup : HTML 변환 라이브러리

  • html을 나타내는 객체로 바꿔줌
  • 태그로 접근 가능
from bs4 import BeautifulSoup

text = html.text
soup = BeautifulSoup(text, 'html.parser')

find / find_all

<태그 속성 = '값'></태그>

id='stock': 페이지 당 한개 -> selector
class='2022': 페이지 당 여러개 -> selector

# find
soup.find('title') # soup.title
soup.find(id='update')

# find_all
soup.find_all(id='update')
soup.find_all('table', class_='table')[0] # list형 반환

select

  • id: #id명
  • class: .class명
soup.select('#update')  # soup.find(id='update')

soup.select('.table')  # list형 반환 
soup.select('.table > tbody')
soup.select('.table > tbody > tr')
# soup.select('.table > tr') # table 바로 아래에는 tbody가 존재하므로 tr에 바로 접근 불가
# 여러 번 접근하기 
one = soup.select('.main')[2]
two = one.select('tbody > tr')
  • find -> select_one
  • find_all -> select

이렇게 대응되는 값으로 비슷한 단일, 복수 값을 가져오게 되는데요.

find로 하위 경로를 접근할 때는soup.find(‘div’).find(‘table’) 이런 식으로 접근해야하고

select로 하위 경로에 접근할 때는soup.select(‘div > table’) 이렇게 접근할 수 있습니다.
(find에서는 > 연산자를 사용할 수 없습니다.)

FinanceDataReader : 금융 데이터 크롤링 라이브러리

  • 주식 가격, 지수, 환율, 암호 화폐 가격
  • 시계열 데이터 수집
  • 거래소별, 종목(코드)별, 단축(코드)별, 데이터 수집
!pip install finance-datareader
import FinanceDataReader as fdr

StockListing

  • KRX 한국 거래소
  • KOSPI 코스피 
  • KODAQ 코스닥
  • NASDAQ 나스닥
  • NYSE 뉴욕 증권 거래소
df_krx = fdr.StockListing('krx')

DataReader

코드 번호 → 단일 종목의 주식 데이터

# fdf.DataReader('코드', '시작연도 or 연-월-일', '종료연도 or 연-월-일')
samsung_df = fdr.DataReader('005930')
samsung_df_2022 = fdr.DataReader('005930', '2022-01-03', '2022-03-31')

# 003497 상장 폐지 -> krx에는 데이터가 없음
del_stock = fdr.DataReader('003497', exchange='krx-delisting')

samsung_df_2022['Close'].plot() # 종가 그래프

# 환율 데이터
ex_us_kw_df = fdr.DataReader('USD/KRW', '2023')
'''
EUR/USD (유로당 달러)
CNY/KRW (위엔당 원)
JPY/KRW (엔당 원)
USD/JPY (달러당 엔)
'''

# 암호화폐 데이터
btc_krw_df = fdr.DataReader('BTC/KRW', '2023')
'''
BTC/KRW (비트코인당 원)
ETH/KRW (이더리움당 원)
XRP/KRW (리플당 원)
BTC/USD (비트코인당 달러)
'''

파일 데이터

한글(hwp) 파일 크롤링

# !pip install ole-py

import os
import pandas as pd
import ole

dir_path = 'data_hwp/'  # 경로 설정
hwp_name = '예제.hwp'  # 파일 이름 설정

hwp_path = os.path.join(dir_path, hwp_name)  # 경로 + 파일
f = ole.open(hwp_path)  # 불러오기

content = f.get_stream('PrvText').read().decode('utf-16le')

# excel 파일로 변환하기
columns = ['Name', 'Company', 'Phone', 'e-mail', 'why', 'experience']
df = pd.DataFrame(columns=columns)

# 읽어온 값을 hwp 분리해서 딕셔너리
word_list = content.split('><')
target_list = ['성    명', '소    속', '연 락 처', 'E-mail', '지원 동기', '연 령 대']

info_dict = {} # 데이터 추출 후 저장할 빈 딕셔너리

# 데이터 프레임으로 만들기
for n, target in enumerate(target_list):
    info = word_list[word_list.index(target) + 1]
    info_dict[columns[n]] = info

df = pd.DataFrame(data=info_dict, index=[0], columns=columns)

df.to_exel('예제.xlsx')  # 엑셀 파일로 추출

https://cdn.hancom.com/link/docs/%ED%95%9C%EA%B8%80%EB%AC%B8%EC%84%9C%ED%8C%8C%EC%9D%BC%ED%98%95%EC%8B%9D_5.0_revision1.2.pdf

 

Weaponized MS Office 97-2003 legacy/binary formats (doc, xls, ppt, ...) | Decalage

This article describes the Microsoft Office 97-2003 legacy/binary file formats (doc, xls, ppt), related security issues and useful resources. The original location of this page is http://www.decalage.info/file_formats_security/office. Last update: 2014-11-

www.decalage.info

 

[텀즈] OLE (Object Linking and Embedding)

OLE["올레" 또는 "오엘이"]는 복합문서 기술에 대한 마이크로소프트의 기반 기술이다. 복합문서는 가시적이고 모든 종류의 정보 객체 - 문서, 달력, 동영상, 소리, 만화, 3D, 계속 갱신되는 뉴스, 콘

www.terms.co.kr

pdf 파일 크롤링

# !pip install pdfminer

from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from pdfminer.pdfpage import PDFPage
from io import StringIO

def pdf2txt(pdf_file):
    rsrcmgr = PDFResourceManager()
   
    retstr = StringIO()
    codec = 'utf-8'
    laparams = LAParams()
    device = TextConverter(rsrcmgr, retstr, codec=codec, laparams=laparams)
    fp = open(pdf_file, 'rb')
    interpreter = PDFPageInterpreter(rsrcmgr, device)
    password = ""
    maxpages = 0
    caching = True
    pagenos = set()
    
    for page in PDFPage.get_pages(fp, pagenos, maxpages=maxpages, password=password,
                                 caching=caching, check_extractable=True):
        interpreter.process_page(page)
    
    text = retstr.getvalue()
    
    fp.close()
    device.close()
    retstr.close()
    return text
    
# pdf 파일 불러오기
import os

os.chdir('C:\workspace')
os.listdir('sample/')
pdf_path='sample/「인공지능 업무자동화교육」 참가신청서.pdf'

text = pdf2txt(pdf_path)
text # text 파일로 변환해줌

연습 문제

1. 'http://www.paullab.co.kr/stock.html' 데이터 중 main 클래스의 2번째 (1 인덱스) 값을 가져와주세요. 

import requests
from bs4 import BeautifulSoup

html = requests.get('http://www.paullab.co.kr/stock.html')
soup = BeautifulSoup(html.text, 'html.parser')
results = soup.select('.main')[1] # soup.find_all(class_='main')[1]

2. 제주코딩베이스캠프 연구원의 일별 시세 테이블을 가져와주세요.

soup.select('body > div:nth-child(3) > table')

one = soup.select('.main')[2]
two = one.select('table')

3. (주)캣네생선의 왼쪽 이미지를 불러온 뒤, 상하/좌우 반전 시켜주세요. http://paullab.synology.me/cats_stock.png

# !pip install Pillow
# !pip install Matplotlib

from PIL import Image
import matplotlib.pyplot as plt
import numpy as np

cat = Image.open('cats_stock.png')
pixel = np.array(cat)

plt.imshow(pixel[::-1]) # 상하 반전 
plt.imshow(pixel[:, ::-1]) # 좌우 반전 

# print(pixel.shape) # (2088, 3204, 4)

4. SK 하이닉스 2020년도 데이터를 출력하고 그 시가 데이터를 그래프를 나타내주세요.

import FinanceDataReader as fdr

# 한국주식거래소에서 sk하이닉스 코드 확인
df_krx = fdr.StockListing('krx')  # sk code = '000660'

# sk 하이닉스 단일 종목 조회
sk_df = fdr.DataReader('000660', '2020', '2021')

sk_df['Open'].plot()  # 시가 그래프

'DATA ANALYSIS > TIL' 카테고리의 다른 글

[Day24] EDA(2)  (0) 2023.06.01
[Day23] EDA(1)  (0) 2023.05.30
[Day21] 데이터 핸들링(4)  (0) 2023.05.25
[Day20] 데이터 핸들링(3)  (0) 2023.05.24
[Day19] 데이터 핸들링(2)  (0) 2023.05.24