2022년 7월 19일 화요일

SKKU |Python |Day. 02 | 파이썬 기본 문법 총 정리II, Pandas 크롤링

 

SKKU |Python |Day. 02 |
파이썬 기본 문법 총 정리II, Pandas 크롤링I

[구글 코랩 (Google colab)과 Python으로 구현 // Day. 02]

파이썬 기본 문법 총 정리II 및 Pandas 크롤링I 학습

#09DaysOfCode _ 20220719




해당 게시물은 성균관대에서 주관하는 격-파이썬 프로그램을 
수강 후 학습한 내용을 토대로 작성된 단순 학습 결과물임을 알려드립니다.

#09DaysOfCode #Day02




[02일 차 학습]
[라이브러리]
다른 사람이 만들어 놓은 프로그램이다
Pandas, NumPy, ‎TensorFlow 등의 라이브러리들이 유명하다


calendar 라이브러리 년도 출력
> 코드
import calendar
print(calendar.calendar(2025)) #calendar. 라이브러리 안의 함수 실행

> 출력
2025 January February March Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su 1 2 3 4 5 1 2 1 2 6 7 8 9 10 11 12 3 4 5 6 7 8 9 3 4 5 6 7 8 9 13 14 15 16 17 18 19 10 11 12 13 14 15 16 10 11 12 13 14 15 16 20 21 22 23 24 25 26 17 18 19 20 21 22 23 17 18 19 20 21 22 23 27 28 29 30 31 24 25 26 27 28 24 25 26 27 28 29 30 31 April May June Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su 1 2 3 4 5 6 1 2 3 4 1 7 8 9 10 11 12 13 5 6 7 8 9 10 11 2 3 4 5 6 7 8 14 15 16 17 18 19 20 12 13 14 15 16 17 18 9 10 11 12 13 14 15 21 22 23 24 25 26 27 19 20 21 22 23 24 25 16 17 18 19 20 21 22 28 29 30 26 27 28 29 30 31 23 24 25 26 27 28 29 30 July August September Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su 1 2 3 4 5 6 1 2 3 1 2 3 4 5 6 7 7 8 9 10 11 12 13 4 5 6 7 8 9 10 8 9 10 11 12 13 14 14 15 16 17 18 19 20 11 12 13 14 15 16 17 15 16 17 18 19 20 21 21 22 23 24 25 26 27 18 19 20 21 22 23 24 22 23 24 25 26 27 28 28 29 30 31 25 26 27 28 29 30 31 29 30 October November December Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su 1 2 3 4 5 1 2 1 2 3 4 5 6 7 6 7 8 9 10 11 12 3 4 5 6 7 8 9 8 9 10 11 12 13 14 13 14 15 16 17 18 19 10 11 12 13 14 15 16 15 16 17 18 19 20 21 20 21 22 23 24 25 26 17 18 19 20 21 22 23 22 23 24 25 26 27 28 27 28 29 30 31 24 25 26 27 28 29 30 29 30 31


- calendar 라이브러리 년도에 따른 월 출력
> 코드
import calendar
calendar.prmonth(2025, 12)

> 출력
December 2025 Mo Tu We Th Fr Sa Su 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31


- 요일을 알려주는 코드
> 코드
calendar.weekday(2015,12,31) #0==월요일을 뜻 함

> 출력
3


- 객체 저장(컴퓨터가 껐다 켜도 저장되게)
> 코드
import pickle 

a =[1,3,5,4,2]
f=open("my_data.dat",'wb')
pickle.dump(a,f) #쏟아버리다 == 저장하다
f.close()


- 읽기
> 코드
f = open('my_data.dat','rb') #읽기

data = pickle.load(f)
f.close()


- 데이터 값 확인
> 코드

data
> 출력
[1, 3, 5, 4, 2]


- time 라이브러리 time 함수
> 코드
import time
time.time() #초단위 표기 / 1970년1월1일 오전 0시 부터

> 출력
1658213970.284239
#코드 실행 시간에 따라 상이함


- time 라이브러리 sleep 함수
> 코드
for i in range(10):
    print(i)
    time.sleep(1) #대기

> 출력
0 1 2 3 4 5 6 7 8 9


- time 라이브러리 ctime 함수
> 코드
time.ctime()

> 출력
'Tue Jul 19 07:01:16 2022'


- time 라이브러리 지연함수 설정
> 코드
#import time 사용의 경우, 모든 함수를 다 바꿔버린다

from time import sleep #타임 함수 안에 슬립만 바꾼다
for i in range(10):

    print(i)
    sleep(1)


> 출력
0 1 2 3 4 5 6 7 8 9


- time 라이브러리 슬립함수 sp설정
> 코드
from time import sleep as sp #타임 함수 안에 슬립을 sp로만 쓰겠다 (?)추가공부요망
for i in range(10):

    print(i)
    sleep(1)

> 출력
0 1 2 3 4 5 6 7 8 9


- random 라이브러리 shuffle 함수
> 코드
import random

box=[1,3,5,4,2]
random.shuffle(box)
box #섞어준다

> 출력
[4, 1, 5, 2, 3]


- random 라이브러리 random 함수
> 코드
random.random() #0~1 사이 아무 숫자나 가져옴

> 출력
0.1510404439855888


- random 라이브러리 random 함수
> 코드
random.randint(0,10) #0~10 사이 정수 가져옴

> 출력
5


- random 라이브러리 sample 함수
> 코드
random.sample(box,3)

> 출력
[3, 14, 27, 32, 39, 40]




[판다스 크롤링]
== Pandas
파이썬 데이터 처리를 위한 라이브러리이
파이썬을 이용한 데이터 분석과 같은 작업에서 필수 라이브러리로 알려져 있다

Ctrl + Shift + i == 개발자 도구 열기 단축키




- 로또 당첨번호 크롤링 
#역대 로또 당첨번호 크롤링 
#인터넷에서 데이터를 수집하는 기술
#처리 순서: 로또 페이지 요청>전송>페이지 출력 크게 3단계


- 크롤링 페이지 요청
> 코드
import requests #페이지 요청
url = requests.get("https://search.naver.com/search.naver?where=nexearch&sm=top_hty&fbm=1&ie=utf8&query=%EB%A1%9C%EB%98%90")
url

> 출력
<Response [200]>
#200 = 정상
#400번대 = 존재하지 않는 페이지의 요청
#500번대 = 거절/로그인처리가 필요한 페이지


- 크롤링 페이지 요청 결과 출력
> 코드
url.text #크롤링 한 결과들

> 출력
'<!doctype html> <html lang="ko"> <head> <meta charset="utf-8"> <meta name="referrer" content="always"> <meta name="format-detection" content="telephone=no,address=no,email=no"> <meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale=2.0"> <meta property="og:title" content="로또 : 네이버 통합검색"/> <meta property="og:image" content="https://ssl.pstatic.net/sstatic/search/common/og_v3.png"> <meta property="og:description" content="\'로또\'의 네이버 통합검색 결과입니다."> <meta name="description" lang="ko" content="\'로또\'의 네이버 통합검색 결과입니다."> <title>로또 : 네이버 통합검색</title> <link rel="shortcut icon" href="https://ssl.pstatic.net/sstatic/search/favicon/favicon_191118_pc.ico"> <link rel="search" type="application/opensearchdescription+xml" href="https://ssl.pstatic.net/sstatic/search/opensearch-description.https.xml" title="Naver" /><link rel="stylesheet" type="text/css" href="https://ssl.pstatic.net/sstatic/search/pc/css/search1_220714.css"> <link rel="stylesheet" type="text/css" href="htt...'


- bs4 라이브러리 BeautifulSoup
> 코드
from bs4 import BeautifulSoup #파이썬으로 HTML을 다루는 기능

import requests #페이지 요청
url = requests.get("https://search.naver.com/search.naver?where=nexearch&sm=top_hty&fbm=1&ie=utf8&query=%EB%A1%9C%EB%98%90")
url

> 출력
<Response [200]>


- 요청 받은 페이지 url정리
> 코드
html= BeautifulSoup(url.text)
html

> 출력
<!DOCTYPE html> <html lang="ko"> <head> <meta charset="utf-8"/> <meta content="always" name="referrer"/> <meta content="telephone=no,address=no,email=no" name="format-detection"/> <meta content="width=device-width,initial-scale=1.0,maximum-scale=2.0" name="viewport"/> <meta content="로또 : 네이버 통합검색" property="og:title"/> <meta content="https://ssl.pstatic.net/sstatic/search/common/og_v3.png" property="og:image"/> <meta content="'로또'의 네이버 통합검색 결과입니다." property="og:description"/> <meta content="'로또'의 네이버 통합검색 결과입니다." lang="ko" name="description"/> <title>로또 : 네이버 통합검색</title> <link href="https://ssl.pstatic.net/sstatic/search/favicon/favicon_191118_pc.ico" rel="shortcut icon"/> <link href="https://ssl.pstatic.net/sstatic/search/opensearch-description.https.xml" rel="search" title="Naver" type="application/opensearchdescription+xml"/><link href="https://ssl.pstatic.net/sstatic/search/pc/css/search1_220714.css" rel="stylesheet" type="text/css"/> <link href="https://ssl.pstatic.net/sstatic/search/pc/css/search2_220714.css" rel="stylesheet" type="text/css"/> <link href="https://ssl.pstatic.net/sstatic/search/pc/css/sp_autocomplete_220526.css" rel="stylesheet" type="text/css"/><script type="text/javascript"> if (!String.prototype.trim) { String.prototype.trim = function () { return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, ''); }; } if (!Array.prototype.indexOf) { Array.prototype.indexOf = function(searchElement, fromIndex) { var k; if (this == null) { throw new TypeError('"this" is null or not defined'); } var o = Object(this); var len = o.length >>> 0; if (len === 0) { return -1; } var n = fromIndex | 0; if (n >= len) { return -1; } k = Math.max(n >= 0 ? n : len - Math.abs(n), 0); while (k < len) { if (k in o && o[k] === searchElement) { return k; } k++; } return -1; }; } if (!Array.prototype.filter) { Array.prototype.filter = function(func, thisArg) { 'use strict'; if (!((typeof func === 'Function' || typeof func === 'function') && this)) throw new TypeError(); var len = this.length >>> 0, res = new Array(len), t = this, c = 0, i = -1; var kValue; if (thisArg === undefined) { while (++i !== len) { if (i in this) { kValue = t[i]; if (func(t[i], i, t)) { res[c++] = kValue; } } } } else { while (++i !== len) { if (i in this) { kValue = t[i]; if (func.call(thisArg, t[i], i, t)) { res[c++] = kValue; } } } } res.length = c; return res; }; } if (typeof(encodeURIComponent) != "function") { encodeURIComponent = function (s) { function toHex (n) { var hexchars = "0123456789ABCDEF" ; return "%%" + hexchars.charAt(n>>4) + hexchars.charAt(n&0xF) ; } var es = "" ; for (var i = 0; i < s.length;) { var c = s.charCodeAt(i++) ; if ((c&0xF800) == 0xD800) { var sc = s.charCodeAt(i++) ; c = ((c-0xD800)<<10) + (sc-0xDC00) + 0x10000 ; } if (!(c&~0x7F)) { if ((c>=65&&c<=90) || (c>=97&&c<=122) || (c>=48&&c<=57) || (c>=45&&c<=46) || c==95 || c==33 || c==126 || (c>=39&&c<=42)) es += String.fromCharCode(c) ; else es += toHex(c) ; } else if (!(c&~0x7FF)) es += toHex(0xC0+(c>>6)) + toHex(c&0x3F) ; else if (!(c&~0xFFFF)) es += toHex(0xE0+(c>>12)) + toHex(0x80+(c>>6&0x3F)) + toHex(0x80+(c&0x3F)) ; else es += toHex(0xF0+(c>>18)) + toHex(0x80+(c>>12&0x3F)) + toHex(0x80+(c>>6&0x3F)) + toHex(0x80+(c&0x3F)) ; } return es ; } } naver = window.naver || {}; naver.search = naver.search || {}; naver.search.abt_param = ""; var g_D = 0 ; naver.search.error = (function () { var errorList = Array() ; return { add : function (s) { errorList.push(s) ; }, clear : function () { delete errorList ; }, get : function (s) { return errorList ; }, getString : function (d) { if (typeof d === 'undefined') d = '|' ; return errorList.join(d) ; } } })(); naver.search.cookie = (function () { return { set : function (key, value, expire, domain) { var cookie = key + "=" + escape(value); if (typeof expire !== 'undefined') { if (expire instanceof Date) { cookie = cookie + "; expires=" + expire.toUTCString(); } else { var exdate = new Date((new Date()).getTime() + expire*1000); cookie = cookie + "; expires=" + exdate.toUTCString(); } } cookie = cookie + "; path=/"; if (domain != null) { cookie = cookie + "; domain=" + domain; } document.cookie = cookie; }, get : function (key) { var cookie_list = document.cookie.split(/\s*;\s*/); for (var i = 0; i < cookie_list.length; i++) { var tmp_list = cookie_list[i].split("="); var c_key = tmp_list[0].trim(); var c_value = tmp_list[1]; if (key == c_key) { return unescape(c_value); } } return null; } } })(); naver.search.https = window.location.protocol == "https:"; naver.sea ...


- 회차 정보 가져오기
> 코드
html.find("div",class_="select_tab").find('a').text.split()[0]

> 출력
'1024회차'


- 회차 정보 숫자만 가져오기
> 코드
current=int(html.find("div",class_="select_tab").find('a').text.split()[0].replace("회차",""))
current

> 출력
1024


- 로또 숫자 가져오기(첫글자)
> 코드
current=int(html.find("div",class_="winning_number").find('span').text.split()[0])
current

> 출력
9


- 로또 숫자 리스트에 정리 (전부)
> 코드
box = [] #bin.box
for i in html.find("div",class_="winning_number").find_all('span'):
    box.append(int(i.text))

box

> 출력
[9, 18, 20, 22, 38, 44]


- 로또 데이터 전체 회차 정리
> 코드
total = []
for n in range(1,101): #커렌트 더하기 1 이 실제로는 맞음 + 숫자는 임의설정
    url = requests.get("https://search.naver.com/search.naver?sm=tab_hty.top&where=nexearch&query=%EB%A1%9C%EB%98%90+999%ED%9A%8C&oquery=%EB%A1%9C%EB%98%90&tqi=hWihXlprvhGssUl78EwssssstOG-425991".format(n))
    html = BeautifulSoup(url.text)


    box = [] #bin.box
    for i in html.find("div",class_="winning_number").find_all('span'):
        box.append(int(i.text))

    total.append(box)

    print("{}회 로또 데이터 저장완료...{}".format(n,box))
    #네이버 내 정보 오류로 다음으로 재 코딩 필요 +코드는 맞음

> 출력
1회 로또 데이터 저장완료...[1, 3, 9, 14, 18, 28] 2회 로또 데이터 저장완료...[1, 3, 9, 14, 18, 28] 3회 로또 데이터 저장완료...[1, 3, 9, 14, 18, 28] 4회 로또 데이터 저장완료...[1, 3, 9, 14, 18, 28] 5회 로또 데이터 저장완료...[1, 3, 9, 14, 18, 28] 6회 로또 데이터 저장완료...[1, 3, 9, 14, 18, 28] 7회 로또 데이터 저장완료...[1, 3, 9, 14, 18, 28] 8회 로또 데이터 저장완료...[1, 3, 9, 14, 18, 28] 9회 로또 데이터 저장완료...[1, 3, 9, 14, 18, 28] 10회 로또 데이터 저장완료...[1, 3, 9, 14, 18, 28] 11회 로또 데이터 저장완료...[1, 3, 9, 14, 18, 28]
...


- 다음사이트 로또 데이터 전체 회차 정리
> 코드
from bs4 import BeautifulSoup #파이썬으로 HTML을 다루는 기능
import requests 
import time

url = requests.get("https://search.daum.net/search?nil_suggest=btn&w=tot&DA=SBC&q=%EB%A1%9C%EB%98%90")
html = BeautifulSoup(url.text)

current=int(html.find("span",class_='f_red').text[:-1])

total=[]
for n in range(1,101):
    url = requests.get(f"https://search.daum.net/search?w=tot&DA=LOT&rtmaxcoll=LOT&&q={n}%ED%9A%8C%EC%B0%A8%20%EB%A1%9C%EB%98%90")
    html = BeautifulSoup(url.text)

    numbers = html.find("div",class_="lottonum").text.split()
    del numbers [-2]
    numbers = list(map(int,numbers))

    total.append(numbers)
    print(f"{n}회 로또 데이터 저장완료 ... {numbers}")

    time.sleep(1)

> 출력
1회 로또 데이터 저장완료 ... [10, 23, 29, 33, 37, 40, 16] 2회 로또 데이터 저장완료 ... [9, 13, 21, 25, 32, 42, 2] 3회 로또 데이터 저장완료 ... [11, 16, 19, 21, 27, 31, 30] 4회 로또 데이터 저장완료 ... [14, 27, 30, 31, 40, 42, 2] 5회 로또 데이터 저장완료 ... [16, 24, 29, 40, 41, 42, 3] 6회 로또 데이터 저장완료 ... [14, 15, 26, 27, 40, 42, 34] 7회 로또 데이터 저장완료 ... [2, 9, 16, 25, 26, 40, 42] 8회 로또 데이터 저장완료 ... [8, 19, 25, 34, 37, 39, 9] 9회 로또 데이터 저장완료 ... [2, 4, 16, 17, 36, 39, 14] 10회 로또 데이터 저장완료 ... [9, 25, 30, 33, 41, 44, 6] 11회 로또 데이터 저장완료 ... [1, 7, 36, 37, 41, 42, 14] 12회 로또 데이터 저장완료 ... [2, 11, 21, 25, 39, 45, 44] 13회 로또 데이터 저장완료 ... [22, 23, 25, 37, 38, 42, 26] 14회 로또 데이터 저장완료 ... [2, 6, 12, 31, 33, 40, 15] 15회 로또 데이터 저장완료 ... [3, 4, 16, 30, 31, 37, 13] 16회 로또 데이터 저장완료 ... [6, 7, 24, 37, 38, 40, 33] 17회 로또 데이터 저장완료 ... [3, 4, 9, 17, 32, 37, 1] 18회 로또 데이터 저장완료 ... [3, 12, 13, 19, 32, 35, 29] 19회 로또 데이터 저장완료 ... [6, 30, 38, 39, 40, 43, 26] 20회 로또 데이터 저장완료 ... [10, 14, 18, 20, 23, 30, 41]
...




[Pandas]
== 판다스


- 데이터 수집 표 제작
> 코드
import pandas as pd

df = pd.DataFrame(total)
df
#데이터 수집한 표 나옴

> 출력





















- 데이터 수집 표 엑셀 제작 및 칼럼제시
> 코드
import pandas as pd

df = pd.DataFrame(total, columns= ['1번째', '2번째', '3번째', '4번째', '5번째', '6번째', '보너스'])

df.index= range (1, len(df)+1)
df.to_excel("lotto.xlsx")
df

> 출력





















댓글 1개:

  1. 날이 갈수록 발전해가는 모습이 확연히 보여서 너무 부럽네요~ 오늘 하루도 고생하셧습니다!

    답글삭제