어느덧 벌써 4장을 공부하고 있는 3주차가 되었다.

만날 일요일 밤에 벼락치기하고 있는 불량한 참가자 신세이지만....

이렇게라도 공부하려하는 스스로를 기특해 해야지 !!!!! 쓰담~ 쓰담~

 

 

04-1 로지스틱 회귀 (Logistic Regression)

- 분류 (Classifier) 모델

- vs. KNeighborClassifier

- 이진 분류 : 시그모이드(Sigmoid)

- 다중 분류 : 소프트맥스(Softmax), parameter C

 

04-2 확률적 경사 하강법 (Stochastic Gradient Descent)

- 점진적 학습 → 확률적 경사 하강법

- 손실함수 (loss function)

- 로지스틱 손실 함수 (logistic loss function, Binary Cross-Entropy loss function)

- partial_fit()

 

 

가제트 형사를 그려주신 것 같은데... MZ(GenZ?) 분들은 아시려나!? ㅋㅋㅋ

 

 

 

Homework

 

 

[기본 숙제]

 

 

- ① 시그모이드 함수(Sigmoid Function)

 

→ 기본적으로 선형 함수만 사용하는 경우 결과값이 너무 커지거나 너무 작아질 수 있으므로

     비선형 함수를 이용하여 값을 수렴하게 만드는 것이 계산하기에 용이해진다.

     이 때, 로지스틱 회귀에서 이진 분류를 사용하는 경우 시그모이드 함수를 이용하면

     0에서 1사이의 값으로 변환이 되며, 0.5를 기준으로 0과 1로 결과를 판단하기에 적합하다.

 

[추가 숙제]

반응형

 

고작 2주차인데, 뭔가 많다!

그런데, 여기서 끝이 아니라 뒤에 좀 더 있다!!!

 

다시 한 번 느꼈지만, 이 책은 절대 초보자를 위한 책이 아니다 !!!

 

03-1. K-최근접 이웃 회귀 (K-NN Regression)

- n_neighbors 파라미터를 이용하여 최근접 이웃과의 거리 평균을 이용하여 회귀

- 과대적합 vs. 과소적합

- n_neighbors 값 변경을 통해 과대적합, 과소적합 이슈 해결

 

03-2. 선형 회귀 (Linear Regression)

- coef_, intercept_

- 과대/과소 적합 이슈 → 다항 회귀

 

03-3. 특성공학과 규제

- 다항 특성 만들기 : PolynomialFeatures

- 규제 전에 표준화 : StadardScaler

- Ridge & Lasso

 

 

기본 숙제

동영상 강의에 얼추 나와있는 내용이라 어렵지 않다 ^^

 

n_neioghbors 값을 바꿔가면서 예측하고, 이것을 그래프로 표현하면 된다.

 

눈으로 봐도 얼추 5값이 적당하지 싶다~

 

추가 숙제

[ 모델 파라미터에 대해 설명하기 ]

 

파라미터는 머신러닝 및 딥러닝 모델의 핵심 요소로써,

모델이 데이터를 통해 학습하고 예측을 수행하는 데 필요한 내부 변수들을 의미한다.

이 값들을 적절히 조정하게 되면 모델은 주어진 문제를 효과적으로 해결할 수 있게 된다.

 

K-최근접 이웃 회귀(K-NN Regression) 챕터에서 n_neighbors 값을 조정하면서

과대적합이나 과소적합 문제를 완화하는 과정을 앞에서 살펴보았는데

여기에서 n_neighbors가 바로 모델 파라미터 중 하나이다.

 

 

반응형

첫 주는 조금 여유로울줄 알았는데, 공부할게 많다.

 

 

02-1. 훈련 세트와 테스트 세트

확인 문제를 통해 이 부분을 공부해보자.

 

1. 머신러닝 알고리즘의 한 종유로서 샘플의 입력과 타깃(정답)을 알고 있을 때 사용할 수 있는 학습방법은 무엇인가요?

- 머신러닝은 크게 지도학습과 비지도학습으로 구분할 수 있고, 정답을 알고 있는 경우 지도학습을 적용한다.

→ ① 지도학습

 

2. 훈련 세트와 테스트 세트가 잘못 만들어져 전체 데이터를 대표하지 못하는 현상을 무엇이라고 부르나요?

- 훈련 세트와 테스트 세트를 만들 때 전체적인 데이터 분포를 유지하는 것이 중요하며 그렇지 못한 경우 편향을 보인다.

→ ④ 샘플링 편향

 

3. 사이킷런은 입력 데이터(배열)가 어떻게 구성되어 있을 것으로 기대하나요?

- 문제 해석이 조금 오해의 여지가 있어 보이지만, 특성은 열(column)로 나열되어 있고 데이터의 구분은 행으로 된다.

→ ② 행: 샘플, 열: 특성

 

 

 

02-2. 데이터 전처리

이 책은 초보자를 위한 수준은 아닌 것 같고, 기본 지식이 좀 있어야 따라갈만한 것 같다.

어쩐지 처음 이 책으로 공부할 때 왠지 자괴감이 좀 들더라니..... ㅠㅠ

 

분산 = 기대값(평균)으로부터 얼마나 떨어진 곳에 분포하는지를 가늠하는 숫자

표준편차 = 분산의 제곱근

 

 

표준화(Standardization) = 평균을 0, 분산을 1로 만들어주는 스케일링 기법 (Z-Score 활용)

 

기본이 될만한 것들을 같이 정리하면서 공부해봐야겠다.

반응형

새해를 맞이하여 야심찬 목표를 세우고 힘차게 달리다가 ... 살짝 지치기도 하고 ... 번아웃도 오고 ...

그러던 와중 또 다시 심장을 뛰게 해주는 혼공학습단 12기 모집 공지를 발견했다 !!!

 

그리고, 정말 고맙게도 지원을 받아주셔서 12기로 활동(공부?)하게 되었다 !!!

 

이번에 공부할 책은 바로~ 바로~

"혼자 공부하는 머신러닝+딥러닝"

 

책을 구매한지는 정말 오래되었는데, 사실 완독하지는 못했었다.

예전에 무심코 지나갔던 책 안의 중요한 정보~!!!

 

이제서야 함께 합니다 !!!

 

 

6주 코스, 열심히 완주해야지 !!!

https://hongong.hanbit.co.kr/혼공-게시판/?uid=162&mod=document&pageid=1

 

개인적으로 너무나 존경하고 애정하는 "박해선"님의 서적인만큼,

책 자체의 퀄리티도 너무나 훌륭하고 예제 및 동영상 등 부수적인 부분들도 너무나 훌륭하다.

https://www.youtube.com/playlist?list=PLVsNizTWUw7HpqmdphX9hgyWl15nobgQX

 

저 동영상 녹화할 때 몇 번 라이브에 참여도 했었는데 ^^

 

 

우리를 공부시키기 위해 박해선님은 정말 많은 고민을 하시는 것 같다 ^^

 

챕터 구성에 대해서도 많은 고민의 흔적이 엿보인다.

 

 

 

뭔가 서론이 길었다!

이제 시작해보자.

 

 

Chapter 01. 나의 첫 머신러닝

 

 

01-1. 인공지능과 머신러닝, 딥러닝

박해선님은 직접 그린 그림과 글씨를 좋아하시는 것 같다 ^^

https://www.youtube.com/watch?v=J6wehCO_c58

 

 

 

01-2. 코랩과 주피터 노트북

이제는 이 책이 나온지도 조금 시간이 지나서

사용한 도구/패키지들의 버전들이 좀 옛날 것들이다.

 

Colab에 들어가서 기본적으로 설치된 Python 버전만 확인해봐도 좀 차이가 발생한다.

https://colab.research.google.com/

 

직접 실습들을 해보면서 버전 차이로 발생하는 것들이 있는지 확인해보면 재미있을 것 같다.

 

 

 

01-3. 마켓과 머신러닝

타이틀이 조금 웃기는데, 저런 제목이 나온이유는 다음과 같다.

https://www.youtube.com/watch?v=GOCVVSMeIf8

 

머신러닝을 공부하기 위해서 문제 상황을 다음과 같이 가정해보자.

- 생선을 파는 마켓이 있다.

- 생선의 크기나 무게를 가지고 그 생선이 무엇인지 맞추고 싶다.

 

동영상 강의 듣다보면 소음(?) 이슈가 있는데,

라이브로 참여했었을 때 마이크 켜 놓은 참석자가 한 명 있어서 조금 짜증났던 기억이 있다.

메시지로 그 사람한테 계속 뭐라했는데 강의를 듣지도 않았던 것 같고 메시지도 보지도 않았던 나쁜 사람 !!! ㅋㅋㅋ

 

첫 실습 내용인데,

첫번째 실습 내용부터 이렇게 쭉~ 진도를 나간다는 것이 조금 당황스럽기는 한데 ...

 

일단 Chapter01 진도는 여기까지!

반응형

Chapter 06

 

어느덧 6주차까지 왔다. 혼공 완주 !!!

스스로에게 칭찬해줘야지 !!! 쓰담~ 쓰담~

 

▶ 내용 요약

06-1 객체지향 API로 그래프 꾸미기

- pyplot 방식과 객체지향 API 방식

 

 

- 그래프에 한글 출력하기

  . 한글 폰트가 필요하기 때문에, 나눔폰트를 설치해야 한다.

  . 예제에서는 구글 코랩에 대해서만 설명되어 있지만, 일반적인 Ubuntu 환경에서도 적용된다.

 

 

  . 사용할 수 있는 폰트 목록을 확인해볼 수도 있다.

  . 사용할 폰트를 지정할 수도 있고, 크기도 정할 수 있다.

 

 

  . 잘 되는지 확인해보자.

 

 

- 출판사별 발행 도서 개수 산점도 그리기

  . 교재와는 다르게, 내가 이용하는 도서관의 데이터로 진행해봤다.

 

 

  . 모든 데이터가 아닌 Top 30 출판사를 뽑아서 사용한다.

 

 

  . 산점도를 그리면 된다!

 

 

  . Marker 크기를 확인하거나 설정을 할 수도 있다.

  . 그냥 점이 아니라 크기에 따라 의미를 부여해보자. (대출건수)

 

 

- 맷플롯립의 다양한 기능으로 그래프 개선하기

 

 

 

 

06-2 맷플롯립의 고급 기능 배우기

- 실습준비하기

  . 한글 폰트 설치 및 도서관 CSV 파일 읽어오기 (앞에서 진행했던 내용 활용)

 

- 하나의 피겨에 여러 개의 선 그래프 그리기

  . 대출건수 크기가 유사한 출판사 2개를 선택해서 그려보자

 

 

  . 레전드를 표현하거나 모든 출판사 정보를 그려보거나 해보자.

 

 

  . 피봇 테이블을 이용해서 데이터를 만들어서 stackplot으로 그려보자.

 

 

 

- 하나의 피겨에 여러 개의 막대 그래프 그리기

 

 

  . 나란히 나오도록 할 수도 있다.

 

 

  . 2개의 bar 그래프를 합쳐서 그리는 2가지 방법이 있다.

 

 

 

  . 데이터 값 누적한 것을 그려보기 위해서 데이터를 먼저 확인해보자

 

 

  . cumsum()을 이용해서 누적 데이터를 만들 수 있다.

 

 

- 원 그래프 그리기

  . 10개 출판사를 뽑아서 pie를 그리면 된다.

 

 

  . startangle 및 여러 옵션들을 줘서 멋진 원 그래프를 만들 수 있다.

 

 

- 여러 종류의 그래프가 있는 서브플롯 그리기

  . 앞에서 살펴본 것들의 종합판이다!

 

 

  . 한 방에 모두 그려진다!!!

 

 

- 판다스로 여러 개의 그래프 그리기

  . DataFrame에서 바로 그래프를 그릴 수도 있다.

 

 

 

 

▶ 기본 미션

p.344의 손코(맷플롯립의 컬러맵으로 산점도 그리기)를 코랩에서 그래프 출력하고 화면 캡쳐하기

 

→ 코랩이 아닌 로컬 환경에서 실행해봤다 ^^

 

 

 

 

▶ 선택 미션

p.356~359의 스택 영역 그래프를 그리는 과정을 정리하기

 

① 기본 데이터 준비

  - 작업 준비 과정이다.

 

 

② 그래프로 표현할 데이터 만들기

  - Top30 출판사 기준으로 "출판사 / 발행년도 / 대출건수"를 추출하고,

  - "출판사 / 발행년도" 기준으로 그룹핑을 하면서, 대출건수는 sum()을 했다.

  - 전체적으로 reset_index()까지 해줬다.

 

 

③ pivot_table()

  - 발행년도를 X축으로 하고, 출판사를 Y축으로 하고, 대출건수를 데이터로 하는 테이블을 만든다.

 

 

④ get_level_values()

  - pivot_table()을 사용했다보니, column이 다단으로 구성되어 있다.

  - 이런 경우 원하는 레벨의 값만 추출하기 위해 get_level_values()를 사용했다.

 

 

⑤ stackplot()

  - 이제 그래프를 그리면 된다.

 

 

우와~~~ 다했다!!!!

반응형

Chapter04. 데이터 요약하

 

정신없이 달리다보니 어느덧 반환점을 돌고 있다. 앗싸~!!!

 

▶ 내용 요약

04-1. 통계로 요약하기

- df.describe()
  . 25%/50%/75% 가 아닌 다른 범위를 알고 싶을 때 : df.describe(percentiles=[0.3, 06, 0.9])
  . object 컬럼의 값 통계를 보고 싶을 때 : df.describe(include='object')


- 일반적인 수학 함수
  . df.mean() / df.median() / df.max() / df.min()


- df.quantile() / sr.quantile() : 분위수
  . df.quantile(0.25)
  . df.quantile([0.25, 0.5, 0.75])


- df.var() : 분산
  . 평균을 먼저 구한 뒤, 평균과 각 데이터 차이를 제곱해서 더한 뒤 데이터 갯수로 나눔


- df.std() : 표준 편차
  . 분산에 루트를 씌운 값

 

import numpy as np

diff = df['대출건수'] - df['대출건수'].mean()
np.sqrt( np.sum(diff**2) / (len(df) - 1) )


- df.mode() : 최빈값. 제일 자주 나오는 값


04-2. 분포 요약하기

- 산점도 : plt.scatter(df['column1'], df['column2'], alpha=0.1)


- 히스토그램
  . plt.hist(df['column1'], bins=5) : y축 폭을 5로 해서 그려라
  . plt.historgram_bin_edge(df['column1'], bins=5)

 

- 상자 수염 그림
  . 상자에서부터 1.5배 IQR 거리 안에서 가장 멀리 떨어져 있는 것 까지 표시

 

plt.boxplot( df[ ['column1', 'column2'] ])
plt.yscale('column')
plt.show()

 

 

▶ 기본 미션

p. 279의 확인 문제 5번 풀고 인증하기

 

기본 미션

 

우와 문제 스케일이 좀 크다 ^^

 

① 데이터 확보

  - https://www.data4library.kr/ 접속해서 데이터를 확보하자.

  - '데이터 제공' 탭을 통해서 데이터를 내려 받을 수 있다.

 

도서관 정보나루

 

② 데이터 읽어들이기

  - 다운로드 받은 데이터를 불러들여서 기본 모양을 살펴보자.

  - 특히, encoding을 신경써야 한다 !!! (정부차원에서 이거 그냥 UTF-8 쓰도록 강제해야하는 것 아닌가)

pd.read_csv()

 

③ Column 상태 확인 및 수정

  - '발행년도'를 가지고 통계를 내야 하는데, 수치형이 맞는지 확인하고, 아니아면 변경을 해야한다.

 

astype()

 

  - 그런데, 위와 같이 에러가 발생한다.

  - 이유는 제일 밑에 나와 있다. "2022(2021)"처럼 입력되어 있는 데이터가 있다보니 casting이 안되는 것이다.

 

  - '("를 포함한 데이터가 얼마나 있는지 확인해보고, '(*)' 부분을 삭제하도록 하자.

 

replace()

 

  - 다시 casting 해보자.

 

error

 

  - 또 에러가 나온다. 숫자가 아닌 데이터가 많은 것 같다.

  - 확인해보자.

 

숫자가 아닌 데이터

 

  - 이거.... 쉽게 갈 수 있는 길을 너무 어렵게 가는 것 같은데....

  - 일단 '.'을 포함한 것들이 많아 보이니 이를 먼저 처리해보자.

 

replace()

 

  - 아직도 243개나 남았다.

  - 데이터를 한 번 더 확인해보고 처리해보자.

 

replace()

 

  - 이제 85개 밖에 안남았다.

  - 데이터 확인해보고, 숫자가 아닌 것들을 전부 날려버리자.

replace()

 

  - astype()을 적용하기 위해서는 ''(공백), NaN 값이 있으면 안된다.

  - ''(공백)을 NaN으로 변환하고, NaN을 모두 0으로 변환해 astype()을 돌리자.

 

astype()

 

  - 드디어 int64 dtype으로 변환되었다.

 

④ draw Histogram

  - 이제 Boolean Indexing을 이용해서 원하는 범위를 한정하고, histogram을 그리면 된다.

histogram

 

 

▶ 선택미션

Ch.04(04-1)에서 배운 8가지 기술통계량(평균, 중앙값, 최솟값, 최댓값, 분위수, 분산, 표준편차, 최빈값)의 개념을 정리하기

 

일반적인 개념 정의는 너무나 잘 정리된 내용이 여기 저기 많이 있으므로 ^^

앞에서 만든 데이터를 가지고 직접 확인해보면서 살펴보겠다.

 

발행년도에 따른 대출건수가 어떻게 되는지를 scatter() 로 표현해봤다.

 

scatter()

 

8가지 기술통계량을 직접 확인해보자.

 

기술통계량

 

① max / ② min : 해당 값의 최댓값 / 최솟값

③ mean / ④ median

    . 평균값은 전체 데이터의 합을 전체 갯수로 나눈값이고,

    . 중앙값은 데이터를 줄 세웠을 때 중간 위치에 해당하는 실제값을 의미한다.

⑤ quantile

    . 분위수를 알려주는 것인데, 일반적으로는 IQR(InterQuartile Range, 사분범위) 사용

    . 명시적으로 원하는 분위수를 확인할 수도 있다.

⑥ var / ⑦ std

    . 분산은 각 데이터와 평균의 차이의 제곱의 총합을 전체 데이터 갯수만큼 나눠준 값이다.

    . 표준편차는 분산에 루트를 씌운 값이다.

⑧ mode

    . 최빈값은 데이터 값 중에서 가장 많은 빈도로 나오는 것을 의미한다.

 

 

우리 모두 파이팅 !!!

반응형

Chapter 03

 

어느덧 3주차 스터디까지 왔다! 와아 ~~~~ !!!

2주차 우수혼공족에 선정되어 간식 선물까지 받았다 ~~~ !!! 꺄아 ~~~~ !!!

 

우수혼공족

 

▶ 요약

3-1. 불필요한 데이터 삭제하기
- *.loc[]
  . slicing(슬라이싱)
    ( *.loc[:, '번호':'등록일자'] )
  . boolean array(불리언 배열)
    ( df.loc[:, df.column != 'map'] )
- *.drop()
  . 지칭하는 column을 삭제
    ( *.drop(column_name, axis=1) )
  . 지칭하는 row를 삭제
    ( *.drop([0,1]) # 0행, 1행을 삭제 )
- *.dropna()
  . NaN 값을 1개라도 갖고 있으면 column 삭제
    ( *.dropna(axis=1) )
  . NaN 값을 모두 갖고 있으면 column 삭제
    ( *.dropna(axis=1, how='all') )
- *.duplicated()
  . 지정한 columns의 값이 동일하면 중복된 행의 값을 리턴
    ( *.duplicated(subset=['도서명','저자','ISBN'], keep=False) )
- *.groupby()
  . 지정한 columns의 값이 동일한 것들을 묶어줌
    ( *.groupby(by=['도서명', '저자', 'ISBN', '권'], dropna=False).sum() )

3-2. 잘못된 데이터 수정하기
- *.info()
  . DataFrame의 다양한 통계를 보여주는 유용한 method
- *.isna()
  . NaN 값을 갖고 있는 column을 보여줌
    ( *.isna().sum() )
- Nan
  . None
  . np.nan
- *.fillna()
  . NaN 값을 갖고 있는 columns에 지정한 값을 채움
    ( *.fillna('없음') )
    ( *['부가기호'].fillna('없음') )
    ( *.fillna( {'부가기호':'없음'} ) )
- *.replace()
  . 값 exchange
    ( *.replace(np.nan, '없음') )
    ( *.replace( [np.nan, '2021'], ['없음', '21']) )
    ( *.replace( {np.nan: '없음', '2021' : '21']) )
    ( *.replace( {'부가기호': np.nan}, '없음') )
    ( *.replace( {'부가기호': {np.nan : '없음'}, '발행년도': {'2021' : '21'}} ) )
  . 정규표현식
    ( *.replace( {'발행년도': {r'\d{2}(\d{2})' : r'\1'}}, regex=True) )

 

 

▶ 기본 미션

p. 182의 확인 문제 2번 풀고 인증하기

 

[문제]

1번 문제의 df1 데이터프레임에서 'col1' 열의 합을 계산하는 명령으로 올바르지 않은 것은 무엇인가요?

 

 

df1['col1'].sum()

df1[['col1']].sum()

df1.loc[:, df1.columns == 'col1'].sum()

df1.loc[:, [False,False,True]].sum()

 

 

※ 위 문제에서 bold 표기한 부분은 책에서 잘못된 부분을 수정한 내용입니다.

    - 문제에서 "것은" 부분이 빠져있었습니다.

    - 보기에서 "df"가 아니라 "df1"이라고 해야합니다.

 

[풀이]

④ 에서 boolean으로 표기된 내역을 보면 [False,False,True]로 되어있기에 'col1'이 아니라 'col3'의 합계가 출력된다.

 

그러면, 이것을 검증해보자.

 

일단, 데이터를 준비해봤다.

NaN 값을 처리하기 위해 Numpy의 np.nan을 사용했다.

 

 

각 보기의 값을 확인해보자.

 

 

확인 끝~

 

 

▶ 선택 미션

p. 219의 확인 문제 5번 풀고 인증하기

 

[문제]

다음과 같은 df 데이터프레임에서 df.replace(r'ba.*', 'new', regex=True)의 결과는 무엇인가요?

 

보기는 생략.

 

※ 위 문제에서 bold 표기한 부분은 책에서 잘못된 부분을 수정한 내용입니다.

    - 문제에서 "같은" 부분이 빠져있었습니다.

 

[풀이]

정규식을 이용한 replace() 문제이다.

정규식을 보면 r'ba.*' 부분을 살펴보면 'ba'로 시작하는 문자열을 지칭하고 있다.

그래서 'ba'로 시작하는 문자열을 'new'로 바꿔치기하면 된다.

 

교재(책) 보기로 보면 ③ 번에 해당하는 결과가 정답이 된다.

 

이것을 검증해보자.

 

 

 

이번 Chapter는 비교적 수월했다.

남은 기간 스스로에게 파이팅 !!!

 

반응형

Chapter 02

 

▶ 요약

2-1 API 사용하기
https://www.youtube.com/watch?v=s_-VvTLb3gs&ab_channel=한빛미디어

JSON (Javascript Object Notation)
- JSON ≒ Dictionay + List
- import json
  . json.dumps()
  . json.loads()
- import pandas as pd
  . pd.read_json()

XML (eXtensible Markup Language)
- import xml.etree.ElementTree as et
  . et.fromstring()
  . *.findtext()
  . *.findall()

API (Application Programming Interface)
- import requests
  . r = requests.get(url)
  . data = r.json()

2-2 웹 스크래핑 사용하기
https://www.youtube.com/watch?v=Il6L8OtNFpc&ab_channel=한빛미디어

BeautifulSoup()
- find()
- find_all()

DataFrame의 행과 열
- loc()
  . *.loc[[0,1], ['bookname':'authors']]
  . *.loc[0:1, 'bookname':'authors']
    : DataFrame에서의 slicing은 마지막 값을 포함한다. (일반적으로는 포함하지 않는다)

 

 

▶ 기본 미션

p150의 확인 문제 1번 풀고 인증하기

 

□ 다음과 같은 데이터  프레임 df가 있을 때 loc 메서드의 결과가 다른 하나는 무엇인가요?

 

 

① df.loc[[0, 1, 2], ['col1', 'col2']]

② df.loc[0:2, 'col1':'col2']

③ df.loc[:2, [True, True]]

④ df.loc[::2, 'col1':'col2']

 

 

보기를 잘 살펴보면 ①, ②는 그냥 보면(?) 되고 ^^ 답은 ③, ④ 중 하나가 될 것이라는 것을 직감적으로 알 수 있다 !!!

③번을 실제 해보면 다음과 같이 출력이 된다.

 

 

응?! 'True' 가 도대체 어떻게 반응한다는 거지!? 해당 Column을 포함할지 안할지를 지정하는 것인가!?

그러면 조금 다른 사례를 확인해보자 !!!

 

 

그렇다!!! 가설이 맞았다. 3개의 Columns에 대해서 [참, 거짓, 참]으로 했더니 정말로 그렇게 출력이 되었다.

 

그러면, 정답은 ④이어야 하는데, 한 번 살펴보자.

 

 

'::2'라고 했기 때문에 하나씩 건너뛰라고 했기 때문에 0번행, 2번행만 출력이 되고 있다.

 

 

▶ 선택 미션

p. 137 ~ 138 손코딩 실습으로 원하는 도서의 페이지 수를 추출하고 화면 캡쳐하기.

 

① 온라인 서점의 검색 결과 페이지 URL을 만듭니다.

② requests.get() 함수로 검색 결과 페이지의 HTML을 가져옵니다.

③ BeautifulSoup로 HTML을 파싱합니다.

BeautifulSoup의 find() 메서드로 <a> 태그를 찾아 상세 페이지 URL을 추출합니다.

⑤ requests.get() 함수로 다시 도서 상세 페이지의 HTML을 가져옵니다.

⑥ BeautifulSoup로 HTML을 파싱합니다.

⑦ BeautifulSoup의 find() 메서드로 '품목정보' <div> 태그를 찾습니다.

⑧ BeautifulSoup의 find_all() 메서드로 '쪽수'가 들어있는 <tr> 태그를 찾습니다.

⑨ 앞에서 찾은 테이블의 행에서 get_text() 메서드로 <td> 태그에 들어있는 '쪽수'를 가져옵니다.

 

 

개인적으로 최근에 주로 사용하는 온라인서점이 알라딘이라서 이번 미션을 알라딘으로 해보고자 한다 ^^

 

 

URL 부분을 더 자세히 살펴보자.

 

 

응?! isbn이 아니라 Item-ID 으로 구성이 되네!?

혹시... isbn으로도 되지 않을까!?

 

 

된다 !!! ^^

어!? 그런데, 책을 다시 한 번 잘 살펴보니... 검색으로 조회 후에 상세 페이지 주소를 얻어서 진행하는 것이네...

다시 !!!

 

 

어짜피 검색에 isbn을 사용한다면

실무에서는 바로 상세페이지로 접근을 하겠지만, 우리는 공부중이니 일단 검색부터 진행해보겠다.

 

앞에서 확인한 URL을 가지고 시작했다.

 

상세 페이지 링크가 책 제목 부분에 붙어 있으므로 아래와 같은 HTML Tag 부분을 잡아내면 된다.

 

<a href="https://www.aladin.co.kr/shop/wproduct.aspx?ItemId=329721455" class="bo3"><b>재미있는 게임 제작 프로세스</b></a>

 

아래와 같이 코딩해봤다.

 

 

여기에 있는 href 값을 이용해서 다음 웹페이지를 읽어오면 된다.

 

 

여기에서 잡아내야 하는 것은 페이지 정보이니 아래와 같은 HTML Tag 부분을 잡아내면 된다.

 

<div class="conts_info_list1"><ul><li>432쪽</li><li>188*257mm (B5)</li><li>821g</li><li>ISBN : 9788931469721</li></ul></div>

 

 

잘 살펴보면 <li> 태그 부분이 보일 것이다.

 

 

쪽 정보까지 잘 뽑아냈다~!!!

 

우리 모두 파이팅 !!!

반응형

+ Recent posts