반응형

* 주의. 비전공자가 공부하면서 대충 정리한 글이므로, 정확하지 않을 수 있으며 대략적인 느낌만 참고할 것

 

1. 컴퓨터 비전의 기반 기술

 

1) 영상의 필터링

- 영상에서 필요한 정보(신호)만 통과시키고 원치 않는 정보(노이즈)를 걸러내는 작업

- 목적에 따라서 영상을 흐리게 만들거나 더 선명하게 만들어 영상처리의 효율을 높일 수 있음

 

2) 기하학적 변환

- 영상을 이동, 회전, 반전, 확대, 축소

- 비스듬히 찍힌 명함이나 문서등을 마치 스캔한 듯이 변환할 때 활용 가능

 

3) 영상의 특징추출

- 배경과 객체, 또는 객체와 객체의 경계인 엣지(Edge)를 픽셀 값의 급격한 변화를 감지함으로써 검출

- 특정한 사물이나 사람의 얼굴을 인식하기 위해서 활용 가능

- 예를 들어 인체의 특징점을 추출함으로써 어떤 포즈를 취하고 있는지도 인식하는데에 응용  

 

4) 이진 영상 처리

- 관심 대상과 비관심 대상을 0과 255(흑과 백)으로 명확히 구분 짓기 위해서 하는 작업

- 임계값(treshold)를 기준으로 흑과 백을 나눔

- 관심 대상을 더욱 두드러지게 표현하여 영상처리의 효율을 높이기 위함

 

 

2. 컴퓨터 비전으로 무엇을 할 수 있을까?

 

1) 검출

- 원하는 대상의 위치와 크기 정보를 얻을 수 있으며,  더 나아가서 움직이는 영상에서 객체의 움직임을 추적 가능

- 아래의 이미지는 검출과 인식을 함께 구현한 것

 

2) 인식

- 개와 고양이의 이미지를 보고 '개'와 '고양이'라고 명확히 알려주는 것이 식별(identification)

- 개와 고양이의 이미지를 수 백장이 섞여있을 때, 이를 끼리끼리 나눠주는 것이 분류(classification)

- 인쇄체, 필기체 숫자 혹은 글자 인식, 얼굴 인식

 

 

3) 추적

- 검출을 동영상에서 계속 하면 추적이 됨 

- 보행자 추적, 자동차 추적


<참고 자료>

 

패스트 캠퍼스 강의_OpenCV를 활용한 컴퓨터비전과 딥러닝 올인원 패키지 Online

반응형
반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석 등의 다양한 패키지까지 초보자도 알기 쉽도록 내용을 정리해 놓았습니다.

업무는 물론 투자에도 도움이 될만한 전자공시시스템(DART) 텔레그램(Telegram) 관련 패키지도 배울 수 있으니 많은 관심 부탁드립니다.

 

 


 

1. 덧셈

 

이미지를 더해줄 때는 cv2.add( ) 함수를 사용해줍니다. 참고로 앞으로 src와 dst라는 파라미터를 많이 언급할텐데, srcsource의 약자, dstdestination의 약자로 각각 inputoutput으로 이해하시면 편하실거예요.

 

cv2.add(src1, src2, dst=None, mask=None, dtype=None)

 

이때 여러 파라미터들 중에서, 반드시 값을 넣어주어야 하는 2가지가 있는데 바로 src1과 src2입니다.

 

보통 src1은 이미지 파일, 정확히는 이미지 파일의 경로를 입력해주며,

src2에는 src1과 동일하게 이미지 파일을 입력해주거나, 스칼라 값(픽셀 값)을 숫자로 입력해줍니다.

 

두 가지 경우가 어떻게 다른지 천천히 알아보겠습니다.

 

 

1)  이미지 + 스칼라 값 (밝기 조절)

 

이미지에 스칼라 값을 넣어준다는 의미는 밝기를 조절한다는 것입니다. 흑백과 컬러 이미지에 대해서 어떻게 처리해는지 코드와 결과를 보면서 파악해 보세요.

 

<코드>

import cv2

# 흑백 이미지 불러오기
src = cv2.imread('cat.jpg', cv2.IMREAD_GRAYSCALE)
dst = cv2.add(src, 50)

cv2.imshow('src', src)
cv2.imshow('dst', dst)

cv2.waitKey()

# 컬러 이미지 불러오기
src = cv2.imread('cat.jpg')

#여기서 50, 50, 50, 0은 각각 B,G,R,alpha(투명도)를 나타냄
dst = cv2.add(src, (50, 50, 50, 0)) 

cv2.imshow('src', src)
cv2.imshow('dst', dst)
cv2.waitKey()

cv2.destroyAllWindows()

 

<실행 결과>

흑백
컬러

 

2) 이미지 + 이미지

 

이번에는 이미지끼리 더해보겠습니다. 완전 다른 이미지 두 개를 더해줄 수도 있지만 쉬운 이해를 위해서 흰색 바탕에 검은색 원의 이미지를 생성해서 더해줘보겠습니다. 

 

 

 

<코드>

import cv2

# 그레이스케일로 이미지 불러오기
src1 = cv2.imread('cat.jpg', cv2.IMREAD_GRAYSCALE)
src2 = cv2.imread('mask_circle.jpg', cv2.IMREAD_GRAYSCALE)

# 이미지 2개 더하기
dst = cv2.add(src1, src2)

cv2.imshow('dst', dst)

cv2.waitKey()

cv2.destroyAllWindows()

 

<실행 결과>

 

그레이스케일 영상에서 검은색은 0, 흰색은 255의 값을 가지므로, 검은색 원이 있던 부분은 원래의 고양이 사진을 그대로 출력하며, 흰색이었던 부분은 모두 흰색으로 출력되는 것을 확인 하실 수 있습니다. 참고로 두 이미지의 픽셀값을 더했을 때 255를 넘으면 모두 255(흰색)으로 출력됩니다.

src1 + src2

 

2. 가중치 덧셈

 

그렇다면 이미지를 각자 다른 비율로 더해주고 싶을 땐 어떻게 해야할까요? 그럴 땐 아래의 함수를 사용해주시면 됩니다.

 

cv2.addWeighted(src1, alpha, src2, beta, gamma, dst=None, dtype=None)

 

방금 전 코드에서 cv2.add( ) 부분의 코드를 아래의 코드로만 바꿔주면 되므로 전체 코드는 생략하도록 하겠습니다.

dst = cv2.addWeighted(src1, 0.5, src2, 0.5, 0)

 

<실행 결과>

 

 

3. 뺄셈

 

뺄셈은 덧셈과 개념이 매우 흡사하므로 이해하기 쉬우실 거예요.

 

 

이 것 역시 이전 덧셈 코드에서 cv2.add( ) 코드 한줄만 아래의 코드로 바꿔주시면 됩니다.

dst = cv2.subtract(src1, src2)

 

<실행 결과>

 

여기서도 0보다 작은 음수는 픽셀값이 0으로 자동으로 변환되어 검은색으로 표현되는 것에 주의해주세요.

 

4. 차이계산

 

차이 계산은 두 영상 사이에 차이가 생긴 부분만 나타내주는 연산입니다.

 

cv2.absdiff(src1, src2, dst=None)

 

CCTV로 주차장을 찍으며 실시간으로 차이계산을 하고, 변화가 생겼을 때만 알람을 띄워주는 알고리즘을 만든다면 효과적일 것 같네요.

 

출처. OpenCV를 활용한 컴퓨터비전과 딥러닝_패스트 캠퍼스 강의

 

오늘은 이러한 개념이 있다는 것만 알고 넘어가도록 하겠습니다.

 

오늘 준비한 내용은 여기까지입니다.

 

감사합니다.


<참고 자료>

 

패스트 캠퍼스 강의_OpenCV를 활용한 컴퓨터비전과 딥러닝 올인원 패키지 Online

 

 

반응형
반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석 등의 다양한 패키지까지 초보자도 알기 쉽도록 내용을 정리해 놓았습니다.

업무는 물론 투자에도 도움이 될만한 전자공시시스템(DART) 텔레그램(Telegram) 관련 패키지도 배울 수 있으니 많은 관심 부탁드립니다.

 

 

 

시작하기에 앞서, OpenCV 라이브러리는 쥬피터 노트북에서 한줄한줄 실행하기 보다는 그냥 파이썬 파일(.py)에서 전체 코드를 실행하시는 것을 추천드립니다. imshow( )로 창을 띄우고 종료할 때 자꾸 파이썬 인터프리터가 먹통이 되더라구요.

 

참고로 이번 시간에는 카메라가 내장된 노트북이나 별도의 웹캠이 없으시다면 실습이 어렵답니다.

 

일단은 여러분들이 노트북을 가지고 코딩공부를 하고 계신다는 가정 하에 글을 작성하겠습니다.


1. OpenCV로 내장 카메라 영상 출력하기

 

이번 시간 가장 처음배워볼 것은 카메라 영상을 받아서 모니터에 띄워보는 것입니다.

 

복잡한 설명 없이 바로 코드를 실행해보겠습니다.

 

<코드>

# step1.opencv 라이브러리 불러오기
import cv2

# step2.카메라 열기 - 0은 기본 카메라를 의미
cap = cv2.VideoCapture(0)

# step3.무한 반복
while True:
    # 카메라 연결 여부(True/False)와 현재 프레임 이미지를 읽음
    retval, frame = cap.read()
    
    # 만약 카메라가 연결되어 있지 않으면 while 반복문 종료
    if retval == False:
        break
    
    # 'frame'이란 창 이름으로 현재 프레임 출력
    cv2.imshow('frame', frame)

    # 10초가 지나거나, ESC 키가 입력되면 while 반복문 종료
    if cv2.waitKey(10) == 27:
        break

# step4.카메라 닫고 모든창 종료
cap.release()

cv2.destroyAllWindows()

 

<실행 결과>

부끄러워서 숨어서 화면 캡쳐함

 

OpenCV에서는 카메라 영상과 이어서 배울 동영상 파일로부터 프레임(frame)을 받아오는 작업을 cv2.VideoCapture 클래스 하나로 처리합니다.

 

위의 코드에서는 cap이라는 변수로 cv2.VideoCapture 클래스를 객체화 해서 while 반복문 안에서 사용하고 있는 것을 보실 수 있을거예요.

 

참고로 cv2.VideoCapture(0)의 0은 기본 카메라를 의미하기 때문에 카메라가 한 대라면 그냥 고민 없이 0을 넣어 주시면 되고, 카메라가 두 대 이상이라면 장치관리자 표시되는 순서대로 1, 2를 입력해주시면 됩니다.

 

 

2. OpenCV로 동영상 파일 재생하기

 

위에서 말씀드렸 듯이 OpenCV를 이용해서 동영상 파일을 열 때도  cv2.VideoCapture 클래스를 이용합니다.

 

차이점은 cv2.VideoCapture( ) 안에 0 대신에 파일명을 넣어주면 됩니다.

 

아무 영상이나 아래의 사이트에서 다운로드 받으신 후에 적당한 파일명으로 저장해주세요. 물론 저장위치는 현재 작업경로에 넣어주시면 코딩하기 제일 편합니다.

 

픽사베이: https://pixabay.com/ko/videos/

 

저는 귀여운 하이랜드 소의 영상을 다운로드 받았습니다. 

 

 

이번에도 코드를 먼저 보시겠습니다.

 

만약 동영상을 그대로 재생하고 싶으시다면 방금 전 봤던 코드에서 한 줄만 바꿔주면 됩니다. 실행결과는 생략하도록 하겠습니다.

 

<코드>

# step1.opencv 라이브러리 불러오기
import cv2

# step2.동영상 파일 열기
cap = cv2.VideoCapture('하이랜드 소.mp4')

# step3.무한 반복
while True:
    # 동영상 파일 존재 여부(True/False)와 현재 프레임 이미지를 읽음
    retval, frame = cap.read()
    
    # 만약 동영상 파일이 존재하지 않으면 while 반복문 종료
    if retval == False:
        break
    
    # 'frame'이란 창 이름으로 현재 프레임 출력
    cv2.imshow('frame', frame)

    # 10초가 지나거나, ESC 키가 입력되면 while 반복문 종료
    if cv2.waitKey(10) == 27:
        break

# step4.동영상 파일 닫고 모든창 종료
cap.release()

cv2.destroyAllWindows()

 

3. 영상의 기본 정보 가져오기

 

이번에는 영상의 정보(영상의 프레임 사이즈, 전체 프레임수, FPS 등)를 가져오는 것을 배워보겠습니다. 이 내용은 카메라 영상과 동영상 파일 모두 적용 가능하지만, 저는 동영상 파일을 가지고 진행해보겠습니다.

 

<코드>

# step1.opencv 라이브러리 불러오기
import cv2

# step2.영상 파일 열기
cap = cv2.VideoCapture('하이랜드 소.mp4')

# step3.영상의 가로, 세로 사이즈, 전체 프레임수, FPS 등을 출력
print('Frame width:', int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)))
print('Frame height:', int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))
print('Frame count:', int(cap.get(cv2.CAP_PROP_FRAME_COUNT)))
print('FPS:', cap.get(cv2.CAP_PROP_FPS))

# step4.영상 닫고 모든창 종료
cap.release()

 

<실행결과>

 

더 많은 영상 정보는 아래의 OpenCV 공식 사이트를 참고하셔서  get( ) 괄호 안만 바꿔주시면 됩니다.

 

https://docs.opencv.org/4.1.0/d4/d15/group__videoio__flags__base.html#gaeb8dd9c89c10a5c63c139bf7c4f5704d

 

OpenCV: Flags for video I/O

enum  cv::VideoCaptureAPIs {   cv::CAP_ANY = 0,   cv::CAP_VFW = 200,   cv::CAP_V4L = 200,   cv::CAP_V4L2 = CAP_V4L,   cv::CAP_FIREWIRE = 300,   cv::CAP_FIREWARE = CAP_FIREWIRE,   cv::CAP_IEEE1394 = CAP_FIREWIRE,   cv::CAP_DC1394 = CAP_FIRE

docs.opencv.org

 

오늘 준비한 내용은 여기까지입니다.

 

감사합니다.


<참고 자료>

 

패스트 캠퍼스 강의_OpenCV를 활용한 컴퓨터비전과 딥러닝 올인원 패키지 Online

반응형
반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석 등의 다양한 패키지까지 초보자도 알기 쉽도록 내용을 정리해 놓았습니다.

업무는 물론 투자에도 도움이 될만한 전자공시시스템(DART) 텔레그램(Telegram) 관련 패키지도 배울 수 있으니 많은 관심 부탁드립니다.

 

 


 

1. OpenCV로 불러온 이미지의 속성 확인하기

 

OpenCV 라이브러리는 이미지를 numpy.ndarray로 표현하며, 이 배열의 각 요소값(픽셀값, 보통 0~255) 들이 모여서 이미지로 표현되는 방식입니다.

 

출처. OpenCV를 활용한 컴퓨터 비전과 딥러닝

 

따라서 cv2.imread( ) 함수로 어떤 이미지를 불러오면 컴퓨터는 numpy.ndarray로 표현하며, 불러온 이미지는 아래와 같은 4가지 속성을 가집니다.

 

1) ndim: 차원의 수

     - 그레이스케일 영상: 2

     - 컬러 영상: 3

 

2) shape: 각 차원의 크기

     - 그레이스케일 영상: (h, w)

     - 컬러 영상: (h, w, 3)

 

3) size: 전체 원소 개수 (전체 픽셀의 갯수)

     - 그레이스케일 영상: h x w

     - 컬러 영상: h x w x 3

 

 

4) dtype: 원소의 데이터 타입. 영상 데이터는 uint8

     - 그레이스케일 영상: cv2.CV_8UC1 numpy.uint8, shape = (h, w)

     - 컬러영상: cv2.CV_8UC3numpy.uint8,shape=(h,w,3)

 

 

코드로 이미지 하나를 흑백과 컬러로 불러와서 각 속성들이 어떤 값을 갖는지 확인해보세요.

 

# step1.OpenCV 라이브러리 불러오기
import cv2

# step2.고양이 이미지 흑백과 컬러로 가져오기 
img1 = cv2.imread('cat.bmp', cv2.IMREAD_GRAYSCALE)
img2 = cv2.imread('cat.bmp', cv2.IMREAD_COLOR)

# step3.이미지의 여러가지 속성들이 어떤 값을 가지는지 확인해보기 (size, shape, ndim, dtype)

print('#img1')
print('shape:', img1.shape)
print('size',img1.size)
print('ndim:',img1.ndim)
print('dtype:',img1.dtype)

print('#img2')
print('shape:', img2.shape)
print('size:',img2.size)
print('ndim:',img2.ndim)
print('dtype:',img2.dtype)

 

<출력 결과>

#img1
shape: (480, 640)
size 307200
ndim: 2
dtype: uint8
#img2
shape: (480, 640, 3)
size: 921600
ndim: 3
dtype: uint8

 

2. 원하는 사이즈의 이미지 생성하기 

 

OpenCV는 위에서 보셨 듯이 numpy 패키지의 ndarray로 이미지 표현합니다.

 

따라서 이미지를 새로 생성하기 위해서는 numpy 패키지를 이용해서 ndarray를 생성하고 배열의 요소에 값들을 채워넣어주어야 하죠.

 

이미지는 아래와 같은 방식으로 생성 가능합니다. 아직 어디 쓰일지는 모르겠으니 이런 것이 있다는 것 정도만 알고 넘어가겠습니다.

 

import cv2
import numpy as np

img1 = np.zeros((480, 640, 3), dtype=np.uint8)  # color image
img2 = np.ones((480, 640), dtype=np.uint8) * 255  # white
img3 = np.full((480, 640, 3), (0, 255, 0), dtype=np.uint8)  # green

cv2.imshow('image1', img1)
cv2.waitKey()
cv2.imshow('image2', img2)
cv2.waitKey()
cv2.imshow('image3', img3)
cv2.waitKey()

cv2.destroyAllWindows()

 

<실행 결과>

 

오늘 준비한 내용은 여기까지입니다.

 

감사합니다.


<참고 자료>

 

패스트 캠퍼스 강의_OpenCV를 활용한 컴퓨터비전과 딥러닝 올인원 패키지 Online

반응형
반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석 등의 다양한 패키지까지 초보자도 알기 쉽도록 내용을 정리해 놓았습니다.

업무는 물론 투자에도 도움이 될만한 전자공시시스템(DART) 텔레그램(Telegram) 관련 패키지도 배울 수 있으니 많은 관심 부탁드립니다.

 

 

오늘은 데이터 분석을 왜 하는지와 산업별로 데이터 분석이 어떻게 활용되는지에 대해서 알아보고 정리해보았습니다.

 

무엇을 공부할 때 지금 공부하는 것을 어디에 가치있게 사용할 수 있는지를 파악하는 것은 매우 중요하다고 생각하니까요.


1. 데이터 분석은 왜 하는가

 

1) Summary

- 데이터를 인식가능한 수준으로 요약 (시각화 포함)

 

2) Insight

- 방대한 데이터 속에서 인사이트 도출

- 데이터간의 유의미한 차이나 관계를 확인

 

3) Decision

- 요약된 정보와 인사이트를 토대로 효과적인 의사결정

 

2. 데이터 분석은 산업별로 어떻게 활용되는가

 

1) 제조

- 실시간으로 생산실적 시각화 및 모니터링

- 각종 센서들과 사물인터넷 기술을 활용하여 설비의 운전상황을 파악하고 고장을 예측하여 미리 수리

- 공정별 제품의 상태를 측정/기록하여, 불량이 발생한 원인을 찾고 개선

 

2) 금융

- 기존 고객의 신상, 신용, 서비스 이용 패턴을 기반으로 채무불이행 리스크 예측

- 지점별 매출, 고객 정보, 위치 등의 데이터를 분석하여 신규 지점 위치 선정

 

3) 유통업/e-커머스

- 상품 판매 테이터를 활용하여 소비자가 선호하는 상품을 선택

- 상품별 우선순위에 따른 재고 관리를 통하여 재고 비용 감소

- 연관 상품 추천 서비스를 통핸 매출증대

 

4) 컨텐츠

- 컨텐츠별 조회수, 체류 시간, 평점 등을 활용하여 시청자가 원하는 트랜트를 분석

- 댓글 내용을 분석하여 고객이 원하는 부분을 세부 키워드로 추출

 

5) 통신

- 고객 유치와 이탈 방지를 위한 마케팅 전략 수립

- 기지국 기반 위치 정보를 활용한 유동인구 분석

 

6) 교통

- 시간대별/정차역별 지하철 및 버스 이용객수 분석

 

7) 농업

- 날씨, 토양환경, 작물 이미지 등의 데이터를 분석해 수확량 증가와 품질 향상

- 분석을 통해 최적의 파종, 농약 살포, 수확 시점을 도출

 

3. 어떤 데이터를 분석에 활용하는가

 

1) 내부 데이터

- 사내 데이터베이스

- 기존 엑셀 데이터 등

 

2) 직접 수집한 데이터

- 설문/리서치 결과

- 센서를 통한 수집

 

3) 외부 데이터

- 정부 기관에서 제공하는 공공데이터

- 일부 업체가 공개한 민간 데이터

- 협의나 구매를 통해 얻은 타사 데이터

 


<참고 자료>

 

1. 한번에 끝내는 데이터 분석 툴 초격차 패키지 Online_패스트 캠퍼스 유료 강의

 

2. 빅데이터 활용 사례

https://www.finereport.com/kr/빅데이터-활용-사례/

반응형
반응형

오늘은 정말 오랜만에 생각정리를 해보려 한다.

 

대학교 4학년 2학기 취준생 시절, 현재의 회사로부터 합격 통보를 받고 너무 기쁜 마음에 기숙사에서 소리질렀던 기억이 난다.

 

 

정말 세상을 다 가진 것 같았다.

매일매일 출근이 너무 즐거웠고, 월급이 통장에 꽂히는 것을 보면서 내가 이렇게 큰 돈을 받는다는 것이 너무 감사했다.

 

그랬던 내가 점점 직장인으로써의 삶이 익숙해져갈수록 꿈이 생겼다. 퇴사라는 꿈!

왜 이렇게 되었을까 곰곰히 생각을 해봤는데 크게 두 가지인 것 같다.

 

1) 반복되는 일상과 익숙함에 직장의 소중함을 잊어버렸다.

2) 성공, 제태크 등의 자기계발서를 많이 읽으면서 생각이 많이 바뀌었다. (자본 소득의 중요성, 시간의 소중함 등등)

 

뭐 대충 이런 이유로 이런저런 노력을 하고 있는 와중에, 지난주에는 7일동안 정말 아무 노력도 안하고 지내보았다.

(자의로 한 것 같이 말했지만, 게으름에게 완벽하게 지배당했다.)

 

이 때 가장 크게 느낀점은 '나는 아직 회사를 벗어날 자격이 없다'였다.

 

흔히들 회사를 '9 to 6의 감옥'이라고도 부르고, 회사원들을 '자본의 노예'라고 폄하하기도 한다.

 

 

근데 가만히 생각해보면 회사를 다니는 것이 그렇게 나쁜 것만은 아니라는 생각이 들었다.

 

왜냐하면 보통사람들은 주어진 시간을 알차게 사용하지 못하기 때문이다. 퇴근 후나 주말에 빈둥빈둥거리며 TV나 유튜브 영상을 끝없이 보는 스스로의 모습을 떠올려보면 바로 이해가 될 것이다.

 

스스로 게으른 나 자신을 이기기 힘들다면, 외부의 강제력을 동원해서 나를 부지런하게 만드는 것도 괜찮은 방법인 것이다.

 

마치 운동을 하기 싫은데 비싼 돈을 내고 PT를 받는 것 처럼 말이다.

 

"나는 아직 스스로를 컨트롤 하는 능력이 부족하고, 나는 많은 돈을 받으면서 나를 통제할 수 있도록 회사가 도와준다"라고

생각을 전환하고나니깐 좀 더 마음이 편해졌다.

 

스스로를 월급의 노예라고, 나는 회사에 시간을 팔고 돈을 받고 있다고 비하하며 스트레스 받는 것 보다 내 인생에 훨씬 도움되는 생각이지 않을까?

 

물론 평생 회사원으로 살고 싶다는 말은 아니다.

 

나는 계속해서 나만의 가치를 제공하기 위해서 노력할 것이고, 유무형의 자산을 쌓아 갈 것이다.

그리고 무엇보다 내게 주어진 시간을 헛되이 사용하지 않고, 게으름에 정복당하지 않기 위해 노력할 것이다.

 

그날이 오기 전까지, 오늘부터는 긍정적인 마음으로 회사를 다니기로 했다.

 

반응형
반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석 등의 다양한 패키지까지 초보자도 알기 쉽도록 내용을 정리해 놓았습니다.

업무는 물론 투자에도 도움이 될만한 전자공시시스템(DART) 텔레그램(Telegram) 관련 패키지도 배울 수 있으니 많은 관심 부탁드립니다.

 

 

제가 지금까지 다루었던 프로젝트들은 리스트만으로 충분했으나, 최근 진행한 프로젝트에서는 리스트들끼리 짝을 맞추어서 저장하고, 꺼내어 사용해야 하는 경우가 생기니깐 어떻게 해야할지 잘 모르겠더라구요.

 

그래서 오늘은 길이가 같은 리스트들의 요소들을 차례대로 조합해서 새로운 리스트, 딕셔너리로 만드는 방법에 대해서 알아보고, 그것을 어떻게 다시 참조할 수 있는지 함께 알아보겠습니다.

 

 

1. 리스트 2개를 요소들끼리 묶어주는 법

 

보통 코드를 짜다보면, 요소들을 받아와서 리스트에 차곡차곡 쌓는 경우가 많습니다.

 

그런데 이 리스트들을 요소들끼리 순서대로 묶어주고 싶을 때가 있습니다.

 

 

[사과, 1000원], [딸기, 2000원], ... 이런 식으로 말이죠.

 

이럴 때는 파이썬 내장 라이브러리에 포함되어 있는 zip 함수를 사용합니다.

 

사용법은 간단합니다. 리스트명을 zip( ) 안에 순서대로 넣어주면 됩니다.

 

여기서 꼭 알아두실 점은 zip( )만 사용하면 그냥 리스트의 내용물이 분배된 상태로 zip object 로 저장된다는 것입니다.

 

product_names = ['사과','딸기','배','포도','키위']
product_prices = ['1000원','2000원','3000원','4000원','5000원']

zip_obj = zip(product_names, product_prices)

 

실제로 zip_obj를 print 함수로 출력해보면 <zip object at 0x0000019014B3A3C0>와 같은 형태로 출력됩니다.

 

우리는 이 zip_obj를 리스트로 만들어 줄 수도 있고, 딕셔너리로도 만들어 줄 수 있습니다.

(리스트로 만들 시, 각 요소들이 튜플로 묶여있음)

 

list(zip_obj)
>>> [('사과', '1000원'), ('딸기', '2000원'), ('배', '3000원'), ('포도', '4000원'), ('키위', '5000원')]

dict(zip_obj)
>>> {'사과': '1000원', '딸기': '2000원', '배': '3000원', '포도': '4000원', '키위': '5000원'}

 

<여기서 잠깐>

 

저도 글을 작성하면서 알게된 점은, zip_obj를 한 번 사용하면 해당 주소에 들어있는 값이 사라진다는 것입니다.

 

그래서 위와 같이 zip_obj로 만들고, list나 dict로 만들어주는 것보다는 아래와 같이 한번에 코딩해주는 것이 좋겠습니다.

 

list_zip = list(zip(product_names, product_prices))

dict_zip = dict(zip(product_names, product_prices))

 

 

2. 리스트 3개 이상을 요소들끼리 묶어주는 법

 

이번엔 리스트 3개 이상을 묶어주는 방법을 알아보겠습니다. 똑같이 적용하면 되지 뭐가 문제냐고 생각하실 수 있는데요.

 

리스트 형태로 만들어주는 것은 전혀 문제가 없지만, 딕셔너리 형태로 만들어 줄 때는 문제가 생깁니다.

 

왜냐하면 딕셔너리는 Key: Value와 같이 단 2개씩만 묶어줄 수 있기 때문입니다.

딕셔너리 기본 형태 = {Key1:Value1, Key2:Value2, ...}

dic = {'name':'손생', 'age':'31'}

 

그러면 어떻게 해줘야할까요?

 

정답은 리스트 하나를 Key로 사용하고, 나머지 리스트들을 묶어서 Value로 사용하는 것입니다.

 

Key는 중복을 허용하지 않으므로, 중복되지 않을만한 제품 링크 주소를 Key로 사용해줍시다.

이런 식으로 묶어주시면 됩니다.

product_links = ['링크1','링크2','링크3','링크4','링크 5']
product_prices = ['1000원','2000원','3000원','4000원','5000원']
product_names = ['사과','딸기','배','포도','키위']

dict_product = dict(zip(product_links, zip(product_prices, product_names)))

 

<dict_product 출력 결과>

{'링크1': ('1000원', '사과'),
 '링크2': ('2000원', '딸기'),
 '링크3': ('3000원', '배'),
 '링크4': ('4000원', '포도'),
 '링크 5': ('5000원', '키위')}

 

 

3. 만들어진 딕셔너리 사용 방법

 

위에서 리스트를 이용해서 딕셔너리를 만드는 방법을 알아보았다면, 이제는 만든 딕셔너리를 사용하는 방법을 배워야겠죠?

 

이 부분은 딕셔너리 기초를 안다면 쉽게 이해할 수 있는 부분이므로 그냥 넘어가겠습니다.

# 제품 링크
key

# 제품 이름
dict_product[key][0]

# 제품 가격
dict_product[key][1]

 

 

4. 딕셔너리 응용 방법

 

아래의 코드는 특정 스마트스토어에서 새로 업로드 되는 제품만 텔레그램으로 전송받고자 했을 때 사용했던 코드입니다.

 

key에 저장된 제품 링크를 비교해서 새제품의 key : value만 필터링하여 저장 및 사용하기 위해서 딕셔너리를 사용하였죠. (글을 작성하면서 굳이 딕셔너리가 아니어도 zip 함수로 리스트를 만들고 인덱싱을 잘해주면 되겠다는걸 깨달았지만 그냥 넘어가도록 하겠습니다ㅎㅎ..)

 

위에서 만들었던 dict_product를 아래와 같이 딕셔너리 컴프리헨션과 결합하여 사용할 수 있답니다. 딕셔너리 컴프리헨션은 리스트 컴프리헨션을 알고계시다면 아주 쉽게 이해하실 수 있습니다.

 

new_products = {key:value for key, value in dict_product.items() if key not in old_products}

 

여기서 new_products에 저장된 값들은 for문을 이용해서 아래와 같이 가져올 수 있습니다.

 

<실제 응용 코드>

    # 새로운 메시지가 있으면 링크 전송
    if new_products:
        for key in new_products:
            bot.sendMessage(chat_id=chat_id,
                            text= new_products[key][0] + 
                            '\n\n' + '가격:' + new_products[key][1] + '원' + 
                            '\n\n' + key)

 


 

 

반응형
반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석, 머신러닝 등의 다양한 패키지까지 초보자도 알기 쉽도록 내용을 정리해 놓았습니다.

업무는 물론 투자에도 도움이 될만한 전자공시시스템(DART) 텔레그램(Telegram) 관련 패키지도 배울 수 있으니 많은 관심 부탁드립니다.

 

 

오늘은 코딩유치원 학생분께서 요청하신 프로젝트를 완료해서 공유드리려고 해요.

 

이 프로젝트의 목적은 제목과 같이 특정 스마트스토어의 최신제품을 실시간 크롤링하고 제품명, 가격정보, 제품링크를 텔레그램으로 전송하는 것입니다.

 

아래의 프로젝트와 비슷했지만, 링크와 제품명, 가격을 묶어주고 전송해줘야해서 dictionary 문법을 사용해보았습니다. 

 

2021.04.05 - [파이썬 패키지/텔레그램(Telegram)] - [Python/Telegram] 원하는 주제의 네이버 뉴스 텔레그램으로 5분마다 전송 받기

 

코드는 마음 껏 사용하셔도 되며, 잘 이해가 가지 않으시면 댓글 달아주세요~!


 

<전체 코드>

#step1.라이브러리 불러오기
import requests
from bs4 import BeautifulSoup as bs
import telegram
import schedule
import time

#step2.새로운 네이버 뉴스 기사 링크를 받아오는 함수
def get_new_products(old_products={}):
    
    product_links = []
    product_prices = []
    product_names = []
    
    # step3.for문을 이용해서 원하는 페이지에 접근, 정보 추출 후 리스트에 담기
    for page_num in range(3): #여기서는 3번째 페이지까지만 크롤링 하도록 설정
        # range를 이용하면 0부터 인덱스가 시작되므로 page_num에 1을 더해준 url을 이용
        url = f'https://smartstore.naver.com/compuzone/category/ALL?st=RECENT&free=false&dt=IMAGE&page={page_num+1}&size=40'
        
        # html 정보 받아와서 파싱
        response = requests.get(url)
        soup = bs(response.text , 'html.parser')

        # css selector로 페이지 내의 원하는 정보 가져오기
        # html_product_links = soup.select('a._3BkKgDHq3l.N=a:lst.product.linkAnchor') --> 잘 작동하지 않음
        html_name = soup.select('strong.QNNliuiAk3')
        html_price = soup.select('span.nIAdxeTzhx')
        html_product_links = soup.select('li.-qHwcFXhj0 > a')
        

        # 제품 이름 추출해서 리스트에 저장
        for i in html_name:
            product_names.append(i.get_text())

        # 제품 가격 추출해서 리스트에 저장
        for i in html_price:
            product_prices.append(i.get_text())

        # 제품 링크 추출해서 리스트에 저장
        for i in html_product_links:
            product_links.append('https://smartstore.naver.com' + i.attrs['href'])

    # 제품 링크를 key, 제품이름과 가격을 value로 dictonary 만듦
    dict_product = dict(zip(product_links, zip(product_names, product_prices)))

    # 기존의 링크와 신규 링크를 비교해서 새로운 링크만 저장
    new_products = {key:info  for key, info in dict_product.items() if key not in old_products}

    return new_products


#step3.새로운 네이버 뉴스 기사가 있을 때 텔레그램으로 전송하는 함수
def send_products():
    
    # 함수 내에서 처리된 리스트를 함수 외부에서 참조하기 위함
    global old_products
    
    # 위에서 정의했던 함수 실행
    new_products = get_new_products(old_products)
    
    # 새로운 메시지가 있으면 링크 전송
    if new_products:
        for key in new_products:
            bot.sendMessage(chat_id=chat_id,
                            text= new_products[key][0] + 
                            '\n\n' + '가격:' + new_products[key][1] + '원' + 
                            '\n\n' + key)
            
    else:
        # bot.sendMessage(chat_id=chat_id, text="새로운 제품이 없습니다.")  --> 잘 실행되는지 확인하고 싶으면 pass 대신 활성화
        pass
    
    # 기존 제품 정보를 계속 축적하기 위함
    old_products.update(new_products)


# 실제 프로그램 구동
if __name__ == '__main__':

    #토큰을 변수에 저장
    bot_token ='자신의 텔레그램 봇 토큰 번호'

    bot = telegram.Bot(token = bot_token)

    # 자신의 봇의 chat_id
    chat_id = '1516137537'
    
    #위에서 얻은 chat id로 bot이 메세지를 보냄.
    bot.sendMessage(chat_id = chat_id, text="컴퓨존의 새제품 실시간 크롤링이 시작 되었습니다") 
    
    # #step5.기존에 보냈던 링크를 담아둘 리스트 만들기
    old_products = {}
    
    # 가장 처음 실행 시, 한 번만 old_products에 제품 링크들 저장
    old_products = get_new_products(old_products)

    # 주기적 실행과 관련된 코드 (hours는 시, minutes는 분, seconds는 초)
    job = schedule.every(10).seconds.do(send_products)
    
    while True:
        
        schedule.run_pending()
        time.sleep(1)

 

<실행 결과>

반응형
반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석 등의 다양한 패키지까지 초보자도 알기 쉽도록 내용을 정리해 놓았습니다.

업무는 물론 투자에도 도움이 될만한 전자공시시스템(DART) 텔레그램(Telegram) 관련 패키지도 배울 수 있으니 많은 관심 부탁드립니다.

 

 


 

1. 컴퓨터 비전 기초 of 기초

 

컴퓨터 비전에 대해서 모두 다루기엔 너무 방대한 학문이기 때문에, OpenCV를 다루기 위해서 필요한 지극히 기초적인 내용만 다루겠습니다.

추후에 OpenCV를 다루면서 필요한 이론이 있으면 그때 그때 추가적으로 공부하도록 하겠습니다. 

 

 

1) 컴퓨터 비전(Computer vision)이란?


컴퓨터를 이용하여 정지영상 또는 동영상으로부터 의미있는 정보를 추출하는 방법을 연구하는 학문
, 사람이 눈으로 사물을 보고 인지하는 작업을 컴퓨터가 수행


2) 영상(image)이란?

픽셀(pixel)이 바둑판 모양의 격자에 나열되어 있는 형태 (2차원행렬)

픽셀: 영상의 기본 단위, picture element, 화소

 

 

3) 그레이스케일(grayscale) 영상

그레이스케일 영상

흑백 사진이 바로 그레이스케일 영상입니다. 색상 정보(R,G,B) 없이 오직 밝기 정보만 가지고 있는 영상이죠. 참고로 컴퓨터 비전에서는 사진도 영상이라고 부른답니다.

그레이스케일 영상은 픽셀 하나를 0~255 범위의 정수로 표현합니다. (0이 검정, 255가 흰색)

 

 

4) 트루컬러(truecolor) 영상

트루컬러 영상

 

일반적인 컬러 사진으로 R, G, B 색 성분의 크기를 각각 0 ~ 255 범위의 정수로 표현한 영상입니다

 

 

 

2. OpenCV 기초

 

1) 설치하기

# 기본 모듈 패키지
pip install opencv-python

# 전체 패키지(주 모듈과 contrib/추가 모듈 모두 포함)
pip install opencv-contrib-python

 

2) 라이브러리 불러오기

import cv2

 

3) 사진 불러오기

 

cv2.imread( ) 함수는 인자를 2개 받는데, 첫번째는 가져오고자 하는 파일의 경로, 두번째는 파일을 어떤 컬러 옵션으로 가져올 것인지에 대한 내용입니다. 이때, 이미지(img)는 numpy.ndarray 형식으로 저장됩니다.

 

아래의 코드는 현재 작업경로와 이미지 파일이 존재할 때만 사용할 수 있다는 점 주의해주세요.

img = cv2.imread('파일명.확장자', cv2.IMREAD_COLOR)

<옵션>

cv2.IMREAD_COLOR (기본값)

cv2.IMREAD_GRAYSCALE

cv2.IMREAD_UNCHANGED

 

 

4) 사진 출력하기

 

위에서 사진을 불러온 것은 단지 img라는 이름의 변수에 저장해둔 상태입니다. 사진을 창에 띄워서 출력하기 위해서는 cv.imshow( ) 함수를 사용해줍니다. 

 

cv2.imshow('출력할 창 이름', img)

 

좀 더 제대로 하면 미리 창을 만들어주고, 창 옵션도 설정하고 해줄 수 있지만 생략하도록 하겠습니다. 안해줘도 출력은 되고 처음부터 많은 걸 배우면 혼란스럽기만 하니깐요.

 

5) 키보드 입력 대기

 

위에서 사진을 출력하면 순식간에 사진이 떴다가 사라집니다. 그래서 키보드 입력이 들어올 때 까지 사진을 띄워놓을 수 있도록 cv2.waitKey( ) 함수를 사용해줍니다.

 

cv2.waitKey()

 

함수의 인자로는 밀리세컨드(ms)가 들어가는데, 해당 시간동안 기다려 주겠다는 의미이며, 미입력시 무한히 기다립니다.

 

만약 특정키가 눌렸을 때만 반응하고 싶다면 아래와 같이 코딩해주시면 됩니다.

 

# 27(ESC), 13(ENTER), '알파벳'도 가능
while True:
    if cv2.waitKey() == ord(27):
        break

 

6) 창 닫기

 

위에서 키를 누른 후, 창이 닫히는 것이 목적이라면 아래의 코드를 넣어주어야 합니다.

 

특별한 목적이 없는 한, 그냥 심플하게 모두 닫는게 좋겠습니다.

# 창을 모두 닫고 싶을 때
cv2.destroyAllWindows()

# 원하는 창만 닫고 싶을 때
cv2.destroyWindow('특정 창 이름')

 

<전체 코드>

import cv2

img = cv2.imread('ch01/cat.bmp', cv2.IMREAD_GRAYSCALE)

cv2.imshow('image', img)

cv2.waitKey()

cv2.destroyAllWindows()

 

오늘 준비한 내용은 여기까지입니다.

 

감사합니다.


<참고 자료>

 

패스트 캠퍼스 강의_OpenCV를 활용한 컴퓨터비전과 딥러닝 올인원 패키지 Online

 

 

반응형
반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석 등의 다양한 패키지까지 초보자도 알기 쉽도록 내용을 정리해 놓았습니다.

업무는 물론 투자에도 도움이 될만한 전자공시시스템(DART) 텔레그램(Telegram) 관련 패키지도 배울 수 있으니 많은 관심 부탁드립니다.

 

 

예전에 파이썬의 장점인 간략한 코딩을 더욱 극대화하는 리스트 컴프리헨션에 대해서 알아보았는데요.

 

2021.11.21 - [파이썬 기초/중급 문법] - [파이썬 중급 문법] 리스트 컴프리헨션 간단 정리

 

오늘은 for 반복문 안에서 리스트 컴프리헨션을 사용할 때 주의할 점에 대해서 말씀드리려 합니다.


 

1. 리스트 컴프리헨션을 사용하는 이유

 

저는 리스트 컴프리헨션 문법을 웹크롤링을 하면서 자주 사용해 왔습니다. 어떤 값을 하나씩 리스트에 추가해줄 때 아주아주 유용하기 때문입니다.

 

<리스트 컴프리헨션을 사용하지 않은 코드>

new_contents=[]

for content in contents:
    if content not in old_contents:
        new_contents.append(content)

 

<리스트 컴프리헨션을 사용한 코드>

new_contents = [content for content in list_contents if content not in old_contents]

 

4줄의 코드가 이렇게 간단해 지니깐 안 쓸 이유가 없겠죠?

 

2. for문 안에서 리스트 컴프리헨션을 사용하지 않은 이유

 

하지만 최근 프로젝트에서 아래와 같이 리스트 컴프리헨션 문법을 사용하지 않았답니다.

 

그 이유는 for문을 돌 때 마다 리스트가 초기화 되어 버리기 때문이었습니다.

 

# 제품명을 담을 빈 리스트 선언
product_name = []

# for문을 이용해서 원하는 페이지에 접근, 정보 추출 후 리스트에 담기
for page_num in range(3):
    url = f'https://smartstore.naver.com/compuzone/category/ALL?st=RECENT&free=false&dt=IMAGE&page={page_num+1}&size=40'
    
    response = requests.get(url)
    soup = bs(response.text , 'html.parser')

    # css selector로 페이지 내의 원하는 정보 가져오기
    html_product = soup.select('strong.QNNliuiAk3')

    # 텍스트만 추출
    for i in html_product:
        product_name.append(i.get_text())

 

무슨 말인지 아직 감이 안오신다면 for문 밖에 product_name 리스트가 밖에서 선언된 것에 주목해보세요.

 

저의 목적은 for문을 돌면서 1, 2, 3페이지에 접속하고, 각 페이지에서 필요한 자료를 리스트에 계속 추가하는 것이었습니다.

 

하지만 아래와 같이 리스트 컴프리헨션 문법을 사용해버리면 product_name이라는 이름의 리스트를 for문 안에서 매번 새로 선언되어서 그 전에 쌓여있던 요소들이 모두 삭제되어 버립니다.

 

# for문을 이용해서 원하는 페이지에 접근, 정보 추출 후 리스트에 담기
for page_num in range(3):
    url = f'https://smartstore.naver.com/compuzone/category/ALL?st=RECENT&free=false&dt=IMAGE&page={page_num+1}&size=40'
    
    response = requests.get(url)
    soup = bs(response.text , 'html.parser')

    # css selector로 페이지 내의 원하는 정보 가져오기
    html_product = soup.select('strong.QNNliuiAk3')
	
    # 리스트 컴프리헨션 사용
    product_name = [i.get_text() for i in html_product]

 


글을 마치며,

 

이번 글은 누군가가에게는 당연한 이야기를 뭐 이렇게 길게 써놨는가 싶을 수 있겠지만, 코딩유치원의 취지에 잘 맞는 글이라고 생각이 듭니다.

 

아직 모르는 것이 많은 초보에게는 작은 돌뿌리도 큰 바위처럼 느껴지기 때문이죠.

 

코딩유치원생 여러분들은 코딩을 하시다가 모르는 부분이 생기시면 주저하지 마시고, 댓글 달아주세요.

 

제가 친절히 도와드릴테니까요~

반응형
반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석, 머신러닝 등의 다양한 패키지까지 초보자도 알기 쉽도록 내용을 정리해 놓았습니다.

업무는 물론 투자에도 도움이 될만한 전자공시시스템(DART) 텔레그램(Telegram) 관련 패키지도 배울 수 있으니 많은 관심 부탁드립니다.

 

 

오늘은 예전에 다루었던 글에 달린 댓글에 대한 답변을 위해 간단히 글을 작성해보려 합니다.

 

 

저는 아래의 글에서 네이버 뉴스 검색 첫페이지의 기사 10개를 주기적으로 확인하고, 새롭게 추가된 기사만을 텔레그램으로 보내주는 프로젝트를 해보았습니다.

 

2021.04.05 - [파이썬 패키지/텔레그램(Telegram)] - [Python/Telegram] 원하는 주제의 네이버 뉴스 텔레그램으로 5분마다 전송 받기

 

해당 프로젝트의 크롤링 방식은 Request와 beautifulsoup을 이용한 정적 크롤링이었죠. 저는 주로 페이지가 변경되는 경우는 selenium 패키지를 이용해서 페이지 번호를 직접 클릭하면서 페이지를 변경했었답니다.

 

댓글을 달아주신 분께서는 정적 크롤링 방식으로 페이지를 변경하면서 원하는 정보를 얻길 원하셨던 것이죠.

 

이번 시간에는 네이버 스마트스토어 한 곳의 상품 정보를 여러 페이지 크롤링하고 그 정보들을 엑셀로 저장해보겠습니다.

 

1. 컨셉

 

코딩을 들어가기 전에 대략적인 컨셉을 잡아봐야겠죠?

 

1) 원하는 스마트스토어 페이지의 url을 이용해 html을 받아온다

2) 제품명과 가격정보를 크롤링한다

3) 다음 페이지에서 같은 일을 반복한다

4) 원하는만큼 반복하며, 리스트에 계속 정보를 누적한다

5) 누적된 리스트를 엑셀에 저장한다.

 

2. 페이지 변경에 따른 url 변경 규칙 파악

 

이제 컨셉을 잡았으니 코딩에 필요한 재료를 구하러 가보겠습니다.

 

저는 컴퓨존에서 운영하는 스마트스토어 페이지에서 전체상품 탭을 클릭한 후, 누적판매순으로 출력되는 것을 최신등록순으로 바꾼 후의 페이지를 목표 url로 하였습니다.

 

여기서 페이지 번호를 1, 2, 3 바꿔가며 클릭하면 아래에 표시한 url에서 page=숫자 부분만 변경되는 것을 확인하실 수 있을거예요. 나중에 코딩에 들어가면 이 부분을 '문자열 포매팅''for 반복문' 개념을 이용해주면 될 것 같네요.

 

3. 제품명 & 가격정보 html 정보 파악

 

크롬에서 F12를 눌러서 목표로 하는 제품명과 가격정보의 html 정보, 정확히는 CSS Selector 정보를 파악합니다.

이 부분을 잘 모르시는 분들은 아래의 글을 참고해주세요.

 

2021.03.27 - [파이썬 패키지/웹 크롤링] - [Python/웹 크롤링] 파이썬 웹 크롤링을 위한 속성 HTML, CSS 요약 정리

 

제품명의 선택자
제품가격의 선택자

 

4. 전체 코드

# step1.라이브러리 불러오기
import requests
from bs4 import BeautifulSoup as bs
import telegram
import time
import pandas as pd

# step2.제품명과 제품가격정보를 담을 빈 리스트 선언
product_name = []
product_price = []

# step3.for문을 이용해서 원하는 페이지에 접근, 정보 추출 후 리스트에 담기
for page_num in range(3):
    # range를 이용하면 0부터 인덱스가 시작되므로 page_num에 1을 더해준 url을 이용
    url = f'https://smartstore.naver.com/compuzone/category/ALL?st=RECENT&free=false&dt=IMAGE&page={page_num+1}&size=40'
    
    # html 정보 받아와서 파싱
    response = requests.get(url)
    soup = bs(response.text , 'html.parser')

    # css selector로 페이지 내의 원하는 정보 가져오기
    html_product = soup.select('strong.QNNliuiAk3')
    html_price = soup.select('span.nIAdxeTzhx')

    # 텍스트만 추출
    for i in html_product:
        product_name.append(i.get_text())
        
    for i in html_price:
        product_price.append(i.get_text())

# step4.zip 모듈을 이용해서 list를 묶어주기        
list_sum = list(zip(product_name, product_price))


# step5.데이터프레임의 첫행에 들어갈 컬럼명
col = ['제품명','가격']

# step6.pandas 데이터 프레임 형태로 가공
df = pd.DataFrame(list_sum, columns=col)

# step7.엑셀에 저장
df.to_excel('컴퓨존 제품 목록.xlsx')

 

5. 실행 결과

 

한 페이지에 40개의 품목이 있으니, 정확히 3개의 페이지에서 모든 제품명과 가격 정보를 크롤링해서 엑셀로 저장한 것을 확인할 수 있습니다.

 

 


오늘 준비한 내용은 여기까지입니다.

 

감사합니다.

반응형
반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원을 운영하고 있는 손생입니다.

 

오늘은 작년 3월 1일에 시작한 '코딩유치원'의 2021년 한해동안의 방문횟수와 수익의 증가 추이를 기록하기 위해 글을 써보려 합니다.

 

그 전에 잠시 넋두리를 해보자면, 2019년 10월쯤 직장동료들과 '생존스터디'라는 이름으로 시작한 파이썬 공부가 이 블로그의 뿌리였던 것 같습니다. 그때까지만 해도 제가 이렇게까지 파이썬을 오래 공부하게 될 줄은 몰랐는데 신기하네요.

 

퇴근 후 시간과 주말을 이용해서 꽤 오랜시간을 공부한 것 같은데, 여전히 스스로가 너무 부족하고 공부해야할게 너무 많다고 느낍니다. 그래도 차근차근 공부하고 기록으로 남기면서, 하나씩 제 것으로 만들어 가는 기분은 꽤 좋습니다.

 

지난 번에 블로그를 시작하고 5개월차 방문횟수와 광고수익을 공개했었는데요. 평일 기준 4~500회 나온다고 좋아했던 기억이 나네요.

 

2021.08.08 - [블로그 운영 팁] - [블로그 수익] 5개월차 코딩 블로그 - 방문수&에드센스 수익 공개

 

10개월차인 지금은 평일기준 1400~1500회 정도 나오고 있습니다. 이 자리를 빌려서, 코딩유치원에 방문해주신 모든분들께 감사드리고, 많은 도움이 되었길 바래봅니다.

 

1. 티스토리 방문수 증가 추세

 

티스토리 방문횟수는 월간 방문 통계를 보았을 때, 아래와 같이 꾸준히 증가하고 있습니다. 꾸준한 업로드와 함께 점점 상위 노출되는 글이 많아진 덕분인 것 같습니다. 지금까지 해왔던대로만 한다면 올해는 목표했던 일간 방문횟수를 달성할 수 있을 것 같은 기대감이 드네요.

 

3월: 516회

4월: 1,262회

5월: 2,132회

6월: 3,750회

7월: 9,699회

8월: 13,611회

9월: 16,370회

10월: 20,526회

11월: 24,399회

12월: 31,035회

 

 

2. 구글 노출&클릭수  (구글 서치 콘솔)

 

다음으로는 구글 서치 콘솔에서 확인한 총 노출수와 총 클릭수 그래프입니다. 구글에서의 노출과 클릭 수도 계속해서 증가하고 있다는 걸 확인 할 수 있습니다.

 

 

3. 에드센스 수익

 

저의 블로그는 코딩 블로그인만큼 그 목적이 개인적인 공부와 퍼스널 브랜딩이 가장 크지만, 궁금해하실 분이 계실 것 같아서 공유드립니다.

 

지금까지 146달러 정도를 광고 수입으로 받았고, 월마다 광고 수익이 상승하고 있는 것을 볼 수 있습니다. 지난달에는 6만원정도를 벌었네요!ㅎㅎ

 

 

 

4. 앞으로의 블로그 운영 계획

 

올해는 1~2월까지 위키독스에 작성중인 '사장님 몰래 파이썬 업무자동화'를 마무리하기 위해서 실제 업무에 도움이 되는 업무자동화 프로젝트를 하고, 포스팅 할 예정입니다.

 

그리고 3월부터는 데이터 분석과 머신러닝/딥러닝 위주로 공부하고, kaggle의 데이터셋이나 공공데이터포털 데이터셋을 이용해서 데이터분석 프로젝트를 다루어 볼 것입니다.

 

동시에 OpenCV도 공부해서 이미지 딥러닝쪽도 공부해서 현업에도 적용해보는 것이 저의 큰 꿈인데 현실이 될 수 있도록 열심히 공부하고 포스팅하도록 하겠습니다.

 

올해도 작년처럼 코딩공부와 블로그를 꾸준히 해서 괄목상대할 수 있기를 기대하며 글을 마칩니다.

 

 

반응형
반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석, 머신러닝 등의 다양한 패키지까지 초보자도 알기 쉽도록 내용을 정리해 놓았습니다.

업무는 물론 투자에도 도움이 될만한 전자공시시스템(DART)나 텔레그램(Telegram) 관련 패키지도 배울 수 있으니 많은 관심 부탁드립니다.

 


저는 사용자 친화적인 프로그램을 만들기 위해서 지금까지 파이썬 GUI(Graphical User Interface) 라이브러리 중 가장 유명한 pyqt5를 사용해왔습니다.

 

<PyQT 관련 글>

 

2021.05.07 - [파이썬 패키지/GUI 프로그램] - [파이썬 GUI 프로그래밍] PyQt5 기초_1강.PyQt의 개념과 창 만들기 (창 이름, 사이즈, 변경 및 아이콘 삽입)

2021.05.08 - [파이썬 패키지/GUI 프로그램] - [파이썬 GUI 프로그래밍] PyQt5 기초_2강.위젯의 종류, 시그널과 슬롯, 이벤트 루프

2021.05.10 - [파이썬 패키지/GUI 프로그램] - [파이썬 GUI 프로그래밍] PyQt5 기초_3강.Qt Designer로 내마음대로 GUI 구성하기

2021.05.22 - [파이썬 패키지/GUI 프로그램] - [파이썬 GUI 프로그래밍] 잡플래닛 리뷰 정보 크롤링 GUI 프로그램

2021.12.06 - [파이썬 패키지/GUI 프로그램] - [Python/Pyqt5] QWidget, QMainWindow, Qdialog 차이 총정리 (ft. Modal과 Modeless)

 

하지만, 아주 유용하면서도 직관적인 PyQt이지만 중대한 단점이 존재합니다. (단점이 개인적인 의견일 수 있음)

 

1. PyQt의 단점

 

GPL 라이브러리, 즉 오픈소스 프로그램을 위한 라이선스라는 것입니다. 이 말이 무슨말이냐면 상업용으로 프로그램을 제작했을 때 그 코드를 공개하고 누구나 마음껏 사용할 수 있다는 말입니다. 만약 그러고 싶지 않다면 별도의 라이선스를 구매해야하죠.

 

아마 상업용 프로그램을 개발해서 판매/배포하는 분들에게 중요한 문제가 아닐까 싶습니다.

 

이런 문제를 해결해줄 수 있는 라이브러리가 바로 PySide입니다.

 

2. PySide6란?

 

PySide란 Qt의 공식적인 파이썬 바인딩, 즉 C++ 기반의 GUI 프로그램 프레임워크인 Qt를 Python에서 사용할 수 있도록 잘 포장(?)한 것입니다.

 

"어라? PyQT가 이름만 봐도 Qt의 공식 파이썬 바인딩인 아니었어?"라고 생각하셨을 것 같은데요.

 

사실 Qt를 제작한 회사(The Qt Company)가 아닌, 영국의 Riverbank Computing가 오픈 소스인 Qt를 이용해서 PyQt를 만들었던 것이라고 하네요.

 

GPL 기반의 PyQt를 Qt와 같은 LGPL로 변경할 것을 제안했으나 RC에서 거절함에 따라, 2016년 5월부로 원조인 Qt사에서 PySide를 공식 지원하겠다고 발표하였습니다. 여기서 Side란 핀란드어로 '바인딩'을 의미한다고 하네요.

 

PySide2까지만 해도 그 기능이 PyQt5에 비해서 뒤쳐졌지만 2020년 12월에 PySide6를 출시하면서, PyQt6와 거의 비슷한 수준까지 올라왔다고 합니다.

 

제가 아직 공부를 깊게 하진 못했지만 PyQt6와 거의 동일하며, 당연히 Qt Designer도 사용할 수 있습니다.

 

PySide2를 잘 정리해놓은 무료전자책이 있어 소개드립니다. 6는 아니지만 Pyside 개념을 잡는데에 많은 도움이 될 것 같아요.

 

https://wikidocs.net/book/2957

 

공학자를 위한 PySide2

이 책은 [공학자를 위한 Python](https://wikidocs.net/book/1704)의 자매책이다. #### History * 2019.5.13 : 1차 ...

wikidocs.net

 

3. GPL vs LGPL

 

위에서 언급했던 공개 소프트웨어 라이선스의 두 가지 종류에 대해서 조금 더 자세히 알아보겠습니다.

 

1) GPL

기본적으로 어떤 프로그램을 개발할 때, GPL 코드를 일부라도 사용하게 되면 그 프로그램은 GPL이 됩니다. GPL을 가진 프로그램을 유료로 판매하는 것은 가능하지만, 반드시 전체 소스코드는 무료로 공개해야 합니다.

 

GPL 코드를 사용한 SW를 내부적인(개인, 기관, 단체 등) 목적으로만 사용할 때에는 소스코드를 공개할 필요가 없지만 어떤 형태로든(유료든 무료든) 외부에 공표/배포할 때에는 전체 소스코드를 공개해야 합니다.

 

2) LGPL

LGPL(Lesser General Public License)는 GPL보다 훨 씬 완화된 라이선스 방식입니다.

 

가장 큰 차이점은 LGPL 코드를 정적(static) 또는 동적(dynamic) 라이브러리로 사용한 프로그램을 개발하여 판매/배포할 경우에 프로그램의 소스코드를 공개하지 않아도 된다는 점입니다. LGPL 코드를 사용했음을 명시만 하면 된다고 하는데 어떻게 명시해야하는지는 아직 잘 모르겠네요.

 

여기서 주의할 점은, LGPL 코드를 단순히 이용하는 것이 아니라 이를 수정한 또는 이로부터 파생된 라이브러리를 개발하여 배포하는 경우에는 전체 코드를 공개해야 한다는 것입니다.

 

 

4. 동적 로드 라이브러리 vs 정적 라이브러리

 

세상에.. 공부하면 할 수록 모르는 것 투성이네요. 위에서 LGPL을 설명하면서 나왔던 정적, 동적 라이브러리에 대해서 잠시 다루어보겠습니다. 여기서 말하는 라이브러리는 함수, 구조체, 클래스 등을 포함하고 있는 컴파일된 파일을 의미합니다.

 

1) 정적 라이브러리(Static Library)

프로그램 빌드 시, 라이브러리를 실행 코드에 넣는 방식을 의미합니다. 이 방식의 장점은 별도 외부 파일이 필요없이 단일 어플리케이션으로 사용가능하다는 것이며, 단점은 로딩하는데에 무겁다는 것입니다.

 

확장자는 윈도우에서는 .lib이며, 리눅스에서는 .a입니다.

 

2) 동적 로드 라이브러리(Dynamic Load Library)

동적 로드 라이브러리는 쉽게 말해서 외부에 라이브러리 파일을 두고, 그때 그때 그 안의 내용물을 불러와서 사용하는 방식입니다. 그렇기 때문에 정적 라이브러리와 반대로 로딩이 빠른 대신에, 반드시 라이브러리 파일을 함께 배포해야 하는 불편함이 있습니다.

 

확장자는 윈도우에서는 .dll이며, 리눅스에서는 .so입니다.

 

 


<참고 자료>

 

1. [Python] PyQt와 PySide에 대한 잡설

https://dev-overload.tistory.com/44

 

2. [Python] QT 지원 | PYQT5 vs PySide2

https://blog.naver.com/PostView.nhn?blogId=piwpiw&logNo=221997619201&parentCategoryNo=&categoryNo=&viewDate=&isShowPopularPosts=false&from=postView 

 

3. [Software] 공개 SW 라이센스(GPL, LGPL, BSD)

http://jinyongjeong.github.io/2016/06/01/software_license/

 

4. 정적 라이브러리와 동적 라이브러리(Static Library, Dynamic Library)

https://m.blog.naver.com/kr_dukie27/10175747579

 

 

반응형
반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

 

코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석 등의 다양한 패키지까지 초보자도 알기 쉽도록 내용을 정리해 놓았습니다.

 

업무는 물론 투자에도 도움이 될만한 전자공시시스템(DART)나 텔레그램(Telegram) 관련 패키지도 배울 수 있으니 많은 관심 부탁드립니다.

 

 

<Python-docx 관련 글>

 

2021.12.27 - [파이썬 패키지/Word] - [Python-docx] 파이썬으로 MS워드 문서 다루기 1편. 문서 생성, 저장, 불러오기, 글자 입력

2021.12.28 - [파이썬 패키지/Word] - [Python-docx] 파이썬으로 MS워드 문서 다루기 2편. 이미지 삽입, 표 삽입

2021.12.30 - [파이썬 패키지/Word] - [Python-docx] 파이썬으로 MS워드 문서 다루기 3편. 기존 양식의 내용 읽는 법 (ft. 문단, 표 인덱싱)

2022.01.01 - [파이썬 패키지/Word] - [Python-docx] 파이썬으로 MS워드 문서 다루기 4편. 글자 폰트, 크기, 색깔 변경하기


이번 시간에는 문단을 정렬하는 방법과 표의 셀 안의 내용을 정렬하는 방법에 대해서 공부해보겠습니다.

문단 정렬
셀 정렬

실습을 위해서 '파이썬으로 MS워드 문서 다루기 3편'에서 사용했던 예제 문서를 사용하도록 하겠습니다.

 

3편을 보지 않고 오신분은 아래의 코드를 실행하시면 예제 문서가 자동으로 생성될 거예요. 

 

from docx import Document

document = Document()

document.add_heading('코딩유치원 python-docx 강의', level = 0)

p = document.add_paragraph('안녕하세요, 코린이 여러분!')
p.add_run(' 코딩유치원에 오신 것을 환영합니다.').bold = True

document.add_paragraph('문장 추가 1')
document.add_paragraph('문장 추가 2')
document.add_paragraph('문장 추가 3')
document.add_paragraph('문장 추가 4')

records = (
    (1, '하나', 'one'),
    (2, '둘', 'two'),
    (3, '셋', 'three')
)

table = document.add_table(rows=1, cols=3)

# 만든 표의 스타일을 가장 기본 스타일인 'Table Grid'로 설정
table.style = document.styles['Table Grid']

hdr_cells = table.rows[0].cells
hdr_cells[0].text = 'No'
hdr_cells[1].text = '한국어'
hdr_cells[2].text = '영어'
for qty, id, desc in records:
    row_cells = table.add_row().cells
    row_cells[0].text = str(qty)
    row_cells[1].text = id
    row_cells[2].text = desc

document.save('예제 문서.docx')

 

 

1. 문단 정렬

 

가장 처음 배울 내용은 우리가 자주 사용하는 왼쪽, 오른쪽, 가운데, 양쪽 정렬을 적용하는 방법입니다.

 

적용 전과 적용 후의 문단 상태를 비교해보세요. 아시겠지만 paragraphs[0]이 첫번째 문단이므로 두번째 문단부터 적용한 것이랍니다.

 

from docx import Document
from docx.enum.text import WD_ALIGN_PARAGRAPH

document = Document('예제 문서.docx')

# 왼쪽 정렬
paragraph1 = document.paragraphs[1]
paragraph1.alignment = WD_ALIGN_PARAGRAPH.LEFT

# 가운데 정렬
paragraph2 = document.paragraphs[2]
paragraph2.alignment = WD_ALIGN_PARAGRAPH.CENTER

# 오른쪽 정렬
paragraph3 = document.paragraphs[3]
paragraph3.alignment = WD_ALIGN_PARAGRAPH.RIGHT

# 양쪽 정렬
paragraph4 = document.paragraphs[4]
paragraph4.alignment = WD_ALIGN_PARAGRAPH.JUSTIFY

# 텍스트 배분 (글자를 흩어서 배치)
paragraph_last = document.paragraphs[-1]  # 마지막 문단
paragraph_last.alignment = WD_ALIGN_PARAGRAPH.DISTRIBUTE

# 현재 작업경로에 저장
document.save('예제 문서.docx')

 

<기존 예제  문서>

 

<정렬 후 예제  문서>

 

 

2. 셀 정렬

 

워드에서 표, 정확히는 셀 안의 내용들을 정렬하는 방법을 공부해 보겠습니다.

 

셀 정렬은 크게 수평 정렬과 수직 정렬로 나뉩니다.

 

1) 수평 정렬

 

먼저 예제 문서의 첫번째 열에 수평 정렬(좌측, 가운데, 우측)을 적용해보겠습니다. 공식 문서에서는 table 객체에다가 .alignment를 하라고 되어 있지만 해본 결과 되지 않는 것을 확인했습니다.

 

꼭 paragraphs 객체에 정렬을 적용해주세요.

 

from docx.enum.table import WD_TABLE_ALIGNMENT

document = Document('예제 문서.docx')

# LEFT : 왼쪽 정렬, CENTER: 가운데 정렬, RIGHT: 오른쪽 정렬
document.tables[0].rows[0].cells[0].paragraphs[0].alignment = WD_TABLE_ALIGNMENT.LEFT
document.tables[0].rows[0].cells[1].paragraphs[0].alignment = WD_TABLE_ALIGNMENT.CENTER
document.tables[0].rows[0].cells[2].paragraphs[0].alignment = WD_TABLE_ALIGNMENT.RIGHT

# 현재 작업경로에 저장
document.save('예제 문서.docx')

 

<실행 결과>

 

2) 수직 정렬

 

수직 정렬은 위에서 배운 수평 정렬이 paragraphs 객체에 적용한 것과 다르게 cells 객체에 적용해야 합니다.

(이 부분도 공식문서에 틀리게 작성되어 있어서 알아내느라 고생했네요ㅜㅜ)

 

from docx.enum.table import WD_CELL_VERTICAL_ALIGNMENT

document = Document('예제 문서.docx')

# LEFT : 위쪽 정렬, CENTER: 가운데 정렬, RIGHT: 아래쪽 정렬
document.tables[0].rows[0].cells[0].vertical_alignment = WD_CELL_VERTICAL_ALIGNMENT.TOP
document.tables[0].rows[0].cells[1].vertical_alignment = WD_CELL_VERTICAL_ALIGNMENT.CENTER
document.tables[0].rows[0].cells[2].vertical_alignment = WD_CELL_VERTICAL_ALIGNMENT.BOTTOM

# 현재 작업경로에 저장
document.save('예제 문서.docx')

 

<확인 결과>

수직 정렬 확인을 위해서 표 사이즈 크게 변경

 


<참고 자료>

 

1. python-docx 공식 문서

https://python-docx.readthedocs.io/en/latest/index.html

 

 

2 cell 정렬 관련 자료

https://programmerall.com/article/17671160550/

 

 

 

 

반응형
반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

 

코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석 등의 다양한 패키지까지 초보자도 알기 쉽도록 내용을 정리해 놓았습니다.

 

업무는 물론 투자에도 도움이 될만한 전자공시시스템(DART)나 텔레그램(Telegram) 관련 패키지도 배울 수 있으니 많은 관심 부탁드립니다.

 

 

<Python-docx 관련 글>

 

2021.12.27 - [파이썬 패키지/Word] - [Python-docx] 파이썬으로 MS워드 문서 다루기 1편. 문서 생성, 저장, 불러오기, 글자 입력

2021.12.28 - [파이썬 패키지/Word] - [Python-docx] 파이썬으로 MS워드 문서 다루기 2편. 이미지 삽입, 표 삽입

2021.12.30 - [파이썬 패키지/Word] - [Python-docx] 파이썬으로 MS워드 문서 다루기 3편. 기존 양식의 내용 읽는 법 (ft. 문단, 표 인덱싱)


이번 시간에는 글자의 스타일(폰트,크기,색상)을 적용하는 방법을 공부해보겠습니다.

 

 

1. 폰트

 

우선 폰트를 적용할 때에는 추가적인 import 필요하지 않습니다

 

<선 스타일 적용, 후 문단 추가 방법>

from docx import Document

# 새로운 문서 만들기
doc = Document()

#스타일 적용하기
style = document.styles['Normal']
font = style.font
font.name = 'Arial'

para = doc.add_paragraph('Some text\n')

 

위의 방법은 add_paragraph에도 적용할 수 있고, 위와 아래의 방법모두 add_run으로 쓰인 문장에 적용 가능합니다.

 

<선 문단 입력, 후 스타일 적용>

 

para.add_run('코딩유치원에 오신 것을 환영합니다.').bold = True

run = doc.paragraphs[0].runs[0]

run.font.name = 'Arial'

 

여기서 조금 불편한 점은 한글은 위의 방식으로 폰트 적용이 안되어서 다른 방법을 사용해야한다는 것입니다.

 

doc = Document('test.docx')

from docx.oxml.ns import qn

style = doc.styles['Normal']
style._element.rPr.rFonts.set(qn('w:eastAsia'), '맑은 고딕')
style.font.name = '맑은 고딕'
style.font.size = Pt(8)

para = doc.add_paragraph('맑은 고딕체 테스트')

# 저장
doc.save('test.docx')

 

 

2. 크기

 

문자 크기를 변경하기 위해서는 우선 아래와 같이 폰트 크기와 관련된 클래스를 import 해주어야 합니다.

from docx.shared import Pt

 

다음으로는 run 객체를 지정해주어야 하는데요. 저는 문단(paragraphs) 안의 모든 run 객체를 바꿔주는 코드를 짜보았습니다.

 

# 첫번째 문단의 문장(run)들을 리스트로 받기
para1 = doc.paragraphs[0].runs

# for 문을 이용해서 
for run in para1:
    run.font.size = Pt(20)

 

<동작 확인용 샘플코드>

from docx import Document
from docx.shared import Pt

doc = Document()

para = doc.add_paragraph('이 글자의 크기를 바꿔봅시다')

# 첫번째 문단의 문장(run)들을 리스트로 받기
para = doc.paragraphs[0].runs

# for 문을 이용해서 
for run in para:
    run.font.size = Pt(20)

# 저장
doc.save('test.docx')

 

<실행 결과>

 

3. 색깔

 

문자 색깔을 변경하기 위해서는 RGBColor 클래스를 import 해주어야 합니다.

 

from docx.shared import RGBColor

 

그 다음엔 문단을 하나 추가하고, 추가한 문단의 첫 문장을 run 객체로 선언해줍니다.

 

사실 paragraph를 생성하면 자동으로 run 객체를 생성하고 그것으로 문장을 써주는 개념이랍니다. 그래서 아래와 같이 add_run( )으로 문장을 써준 것이 아님에도 para2가 runs[0]를 가질 수 있는 것이죠.

para2 = doc.add_paragraph('글자 색깔을 바꿔봅시다')
run = para2.runs[0]
font = run.font

# RGB 컬러를 각각 16진수로 표현 (R, G, B)
font.color.rgb = RGBColor(0xFF, 0x24, 0xE9)

# 저장
doc.save('test.docx')

 

 

오늘 준비한 내용은 여기까지입니다.

 

오늘도 코딩유치원을 찾아주셔서 감사합니다.


<참고자료>

 

1.Python-docx을 이용한 워드 문서 자동 생성 - 3. 스타일 변경, Head

https://daaam11.tistory.com/12

 

2.[워드 문서 스타일 적용하기] python-docx 모듈 활용 - 네이버 블로그

https://m.blog.naver.com/sangja84/221530974938

반응형

+ Recent posts