본문 바로가기
개발일지

파이썬 기초 1주차 정리

by 디지털뚜이 2022. 12. 13.

파이썬 데이터분석 공부시작 1주차 개발일지 작성

리스트형 변수(배열변수)

a_list=['사과','배','감']
print(a_list[0])
print(a_list[1])
print(a_list[2])
a_list.append('귤'# 리스트형 변수에 값 추가하기
print(a_list[3])

 

딕셔너리형 변수

a_dict={'name':'정현','age':21# (key:value 형태)
a_dict['height']=178 # 딕셔너리형에 키 추가
a_dict
# 리스트+딕셔너리 조합형 변수
a_list=[{'name':'정현','age':21},{'name':'민영','age':20}]
a_list[1]['name']
 

함수

def sum(a,b): # def는 함수를정의한다 sum은 함수이름(맘대로) 마지막엔 :로 끝낸다
  return a+b  #return은 ~로 변환시켜라
result=sum(1,2)
result
 

조건문

def is_adult(age):
  if age > 20:  
    print('성인입니다'
  else:   
    print('청소년이에요')
is_adult(30)
is_adult(20)
is_adult(10)
 

반복문

a_list=['사과','배','감'# 리스트형 변수와 같이 잘 쓰임
for fr in a_list: # a_list 리스트변수 안에서 리스트순으로 차례대로 반복한다
  print(fr)
 
ages=[18,19,20,21,22]
for age in ages: 
  is_adult(age)
 

스크래핑

# 스크래핑에 필요한 라이브러리 설치
!pip install bs4 requests # requests : 엔터를 치는 기능 # bs4 : 잘 솎아내는 기능
# 앞에 !표시는 없어도 되는데 표시한 이유는 파이썬 언어가 아니고 라이브러리를 설치하는 등 외부 언어임을 표시 (!을 안쓰면 계속 잘못쓴 문법이라고 빨간줄 표시됨)
 
# 크롤링 기본코드 (bs4라이브러리의 다큐먼트(document:사용설명서))
import requests 
from bs4 import BeautifulSoup

headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'}

soup = BeautifulSoup(data.text, 'html.parser')
# 태그정보 1개 가져오기
b = soup.select_one('#sp_nws1 > div.news_wrap.api_ani_send > div > a'
# select_one의 뜻 : selector로 가져 온 정보 1개만 태그로 넣기 
#''안의 내용은 크롬개발자모드에서 엘리멘트의 특정 태그 부분을 선택 후 Copy>selector 한 부분
# selector의 복사정보 분석 : id가 sp_nws1인 태그의 하위, div태그 중 news_wrap api_ani_send클래스가 있는 div태그의 하위, div태그의 하위, a태그

b.text # a변수의 태그 내에서 텍스트 부분만 출력
b['href'# 태그 내의 특정 옵션값만 출력
 
# 태그정보 여러개 가져오기 
lis = soup.select('#main_pack > section > div > div.group_news > ul > li')
# select의 뜻 : selector로 가져 온 정보 여러개를 태그로 넣기 (배열변수)
# selector의 복사정보 분석 : id가 main_pack인 태그의 하위, section태그의 하위, div태그의 하위, div태그 중 group_news클래스가 있는 div태그의 하위, ul태그
# > li는 직접 적음 (뉴스들이 위 경로의 ul태그안에 li태그들로 리스트로 이루어짐)(li태그들은 여러개 들어있음)

for li in lis: # lis의 배열값을 차례로 li에 넣어 반복하겠다. 즉, li는 lis[0]~lis[n]과 같다
  a = li.select_one('a.news_tit'# 각 배열값의 하위 태그 중 news_tit를 클래스로 가지고 있는 a태그 값을 b변수에 넣는다
  print(a.text, a['href'])
 
 

스크래핑을 함수화 하기

!pip install bs4 requests
 
import requests 
from bs4 import BeautifulSoup

def get_news(keyword): # 함수를 디파인한다 (함수이름:get_news, 함수내 변수이름: keyword)

# 그리고 함수에 넣을 부분 모두 선택 후 tab눌러서 띄어넣기한다
  headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'}
  data = requests.get(f'https://search.naver.com/search.naver?where=news&ie=utf8&sm=nws_hty&query={keyword}',headers=headers) #문자열 값 앞에 f를 넣는다(중요) #삼성전자 대신 {keyword}를 넣는다

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

  lis = soup.select('#main_pack > section > div > div.group_news > ul > li')

  for li in lis: 
    a = li.select_one('a.news_tit'
    print(a.text, a['href'])

get_news('현대자동차'# 함수의 변수를 현대자동차로 바꿔서 출력해봄
get_news('LG전자')

 

엑셀 다루기

# openpyxl 라이브러리 설치
!pip install openpyxl
 
# openpyxl 라이브러리의 다큐먼트 (기본코드)
# 엑셀을 내보내기
from openpyxl import Workbook

wb= Workbook()
sheet = wb.active

sheet['A1'] = '안녕하세요!'

wb.save("샘플파일.xlsx")
wb.close()
 
# 엑셀을 읽어오기 (엑셀을 강의예제에 맞게 직접 수정해서 넣음)

# NO 상품명 가격
# 1 사과 100
# 2 배 200
# 3 감 500
# 4 딸기 1000

import openpyxl
wb = openpyxl.load_workbook('과일.xlsx')
sheet = wb['Sheet'#시트이름

sheet['A1'].value #셀위치
rows = sheet.rows #rows의 배열변수에 sheet변수(엑셀시트)의 각 행들의 모든 열 값을 넣는다. ([0]은 1행의 모든열값, [1]은 2행의 모든열값)

for row in rows: #배열변수를 풀기
  print(row[0].value,row[1].value,row[2].value)
 
 

스크래핑 + 엑셀 (날짜,파일명바꾸기,압축)

!pip install bs4 requests
 
!pip install openpyxl #엑셀부분
 
#오늘 날짜 가져오기 문법 (밑에 넣기때문에 지워도됨)

from datetime import datetime

datetime.today().strftime("%Y-%m-%d")
#스크래핑 정보를 엑셀로 내보내는 함수 정의 (함수의 정의일뿐이라 나중에 함수를 입력해야 실행됨)

import requests 
from bs4 import BeautifulSoup

from openpyxl import Workbook #엑셀부분

from datetime import datetime #날짜부분

def get_news(keyword):

  wb= Workbook() #엑셀부분
  sheet = wb.active #엑셀부분

  headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'}
  data = requests.get(f'https://search.naver.com/search.naver?where=news&ie=utf8&sm=nws_hty&query={keyword}',headers=headers) #문자열 값 앞에 f를 넣는다(중요) #삼성전자 대신 {keyword}를 넣는다

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

  lis = soup.select('#main_pack > section > div > div.group_news > ul > li')

  for li in lis: 
    a = li.select_one('a.news_tit'
    row = [a.text, a['href']] #row라는 변수에 각 정보를 저장 #[]로 배열지정해서 1행,2행으로 입력됨
    sheet.append(row) #엑셀시트에 row값을 반복추가 
    #위는 다큐먼트에 지정되어 있는 기초문법

  today = datetime.today().strftime("%Y-%m-%d"#날짜부분

  wb.save(f"news/{today}_{keyword}.xlsx"#엑셀부분 
  #이름도 문자열 변수로 설정 #{}문자열 넣을려면 앞에 f필수 
  #news/는 news폴더안에 넣기 (폴더는 미리 만들어줘야함)
  wb.close() #엑셀부분
keywords = ['삼성전자','LG에너지솔루션','SK하이닉스','NAVER','삼성바이오로직스','삼성전자우','카카오','삼성SDI','현대차','LG화학','기아','POSCO홀딩스','KB금융','카카오뱅크','셀트리온','신한지주','삼성물산','현대모비스','SK이노베이션','LG전자','카카오페이','SK','한국전력','크래프톤','하나금융지주','LG생활건강','HMM','삼성생명','하이브','두산중공업','SK텔레콤','삼성전기','SK바이오사이언스','LG','S-Oil','고려아연','KT&G','우리금융지주','대한항공','삼성에스디에스','현대중공업','엔씨소프트','삼성화재','아모레퍼시픽','KT','포스코케미칼','넷마블','SK아이이테크놀로지','LG이노텍','기업은행']

for keyword in keywords: #여러 키워드 적용 방법
  get_news(keyword)
#파일명 바꾸기
import os

path = '/content/news' #경로 변수화
files = os.listdir(path) #해당 경로의 파일들을 배열변수화

for name in files:
  new_name = name.split('.')[0]+'(뉴스).xlsx'
  #split은 변수의 문자열을 특정 문자를 기준으로 나누어 배열변수 값으로 바꾸는 기능
  #name은 '2022-12-13_삼성전자.xlsx'
  #name.split('.')은 ['2022-12-13_삼성전자', 'xlsx']
  #name.split('.')[0]은 '2022-12-13_삼성전자'
  os.rename(f'/content/news/{name}',f'/content/news/{new_name}'#이름바꾸기
#압축하기
!zip -r /content/files.zip /content/news 
 
 
 

이미지 스크래핑

!pip install bs4 requests
 
!pip install openpyxl
 
import openpyxl

import urllib.request #이미지 다운받기 (1/3) : 기본설정

wb = openpyxl.load_workbook('관리종목.xlsx')
sheet = wb['종목']

rows = list(sheet.rows)[1:]

for row in rows:
  stockname = row[0].value #관리종목 파일의 1행이 주식이름
  stockcode = row[1].value #관리종목 파일의 2행이 주식코드
  url = f'https://ssl.pstatic.net/imgfinance/chart/item/area/year3/{stockcode}.png' #이미지 다운받기 (2/3) : 이미지 url 
  urllib.request.urlretrieve(url, f"stock/{stockname}.png"#이미지 다운받기 (3/3) : 이미지이름 및 다운위치
!zip -r /content/stockimages.zip /content/stock