지금은마라톤중

멋사 AI스쿨 WIL - (8) 본문

멋쟁이사자처럼/Python

멋사 AI스쿨 WIL - (8)

달리는중 2023. 1. 12. 17:34

2023.01.09 ~ 2023.01.11

멋쟁이사자처럼 4주차

 


2023.01.09

 

● 데이터베이스

• 데이터베이스 :  주로 실시간으로 관리할 데이터를 저장
     => 예) 회원정보, 장바구니 정보, 위시리스트, 게시판, 댓글, 캐릭터 정보, 인벤토리 정보, Status 관리가 필요한 정보
 파일로 저장을 할 때는 주로 로그데이터 등을 저장하게 됩니다. 데이터베이스에도 로그성 데이터를 저장하기도 합니다.
    한 시간에 1G이상씩 쌓이는 로그성 데이터라면 보통 파일로 저장하는 편입니다.
    => 예) 어떤 페이지를 누가 언제 방문했었는지, 게임에서 서버에 접속해서 어떤 액션을 취했는지 작은 액션 단위로 로그를 저장할 때
 
* 데이터분석가와 데이터엔지니어, 개발자, 기획자가 모여서 회의를 하면 어떤 데이터를 데이터베이스에 저장할지 어떤 데이터를 파일로 저장할지 의견을 나누고 결정, 그리고 어떤 데이터를 저장해서 관리할지 등을 결정

 

ETL과 ELT 

 ETL => 데이터 웨어하우스

 ELT => 데이터 레이크

 

* 공공데이터 사이트 추천

   - 비정형데이터 => AI Hub

   - 정형데이터 => 공공데이터 포털, 통합데이터지도

 

🙋🏻‍♂️질문: 파이썬은 접착제 언어라는 특징이 있습니다. 접착제 언어가 의미하는건 무엇일까요?
 
• Numpy 대표적인 접착제 언어의 특징을 갖는 라이브러리
• 생태계가 다양한 특징이 있음.
• 내부가 파이썬이 아니고 인터페이스만 파이썬으로 되어 있는 라이브러리, 대표적으로 XGBoost, LightGBM, KoNLPy 등
 
• 다른 언어로 만들어졌고 파이썬으로 구동하기 위해서는 해당 언어(예, JAVA, C, C++)를 실행할 수 있는 환경이 필요• 아나콘다로 접착제 언어의 특징을 갖는 라이브러리를 설치하게 되면 이런 복잡한 환경에서 구동하는 도구들을 비교적 오류 없이 설치
    →  그래서 나는 아나콘다로 주피터 노트북을 설치했다!!

 

● Pandas의 뜻

• Pandas : Panel Data System, Python Data Analysis 를 의미

• Panel 계량경제에서 다차원데이터를 의미

 

● Null 은 데이터베이스에서 없는 값을 의미합니다.

     넘파이에서는 nan 으로 결측치 없는 값으로 표현합니다

     엑셀에서는 N/A 로 표현합니다.
 
 
🙋🏻‍♂️질문: df["약품명"] == df.약품명 <= 두 번째 방법을 사용하면 동작하지 않을 때가 있습니다. 어떤 경우 일까요?
컬럼명에 특수문자, 띄어쓰기 등이 들어갈 때, 메서드, 프로퍼티, 어트리뷰트 명과 동일할 때
 
● at, iat 는 single value 가져올 때 사용 => 앞으로 판다스에서 없어질 예정입니다.
-> loc, iloc로 가능
 
내용정리
  • Series는 1차원으로 표현, DataFrame은 표 형태로 2차원 표현
  • ? : 사용법, ?? : 소스코드
    - ex) df.drop?, df.drop??
  • 소스코드 보는 경우 : 동료가 짠 코드가 오류가 났을 때
  • pandas에서 널값 존재시 dtype 주의
    - ex)3500 : 숫자만 있을 때 dtype이 int64, 널값이 있으면 float64
  • df.drop(행, 열),
  • axis가 0 이면 행 인덱스가 삭제 행, 1 = 열
  • print 와 display 차이
    - print : 파이썬으로 출력, 문자열로 출력
    - display : 프론트엔드로 출력, 데이터프레임으로 더 이쁘게 그림으로 출력
  • df.info() : df라는 변수의 정보를 보여준다.
  • df.describe() : df의 수치형 데이터의 기술통계값을 보여준다.
    - count' => 결측치를 제외한 빈도수,
    - 'mean' => 평균,
    - 'std; => 표준편차,
    - 'min' => 최솟값, ' max' => ''최댓값’
  • 사분위수(IQR) : 1열로 세웠을 때 상위 25%, 50%
  • '25%', '50%', '75%' => 값을 순차정렬 했을 때 앞에서부터 '25%', '50%', '75%' 위치에 있는 값
     => 사분위수 , 1사분위수, 2사분위수( 중앙값, 중간값, mdian), 3사분위수
  • 1등 부터 100등까지 있다고 가정했을 때
         제4 사분위수(Q4) - 1등 ,제3 사분위수(Q3) - 25등, 제2 사분위수(Q2) - 50등, 제1 사분위수(Q1) - 75등
  • 데이터프레임으로 가려오려면 ex) df[[”가격”]] 처럼 대괄호를 2개 써야한다.
  • 행을 가져올 때 loc[행,열] 사용
    - 리스트 슬라이스처럼 :을 사용 가능
    - but, 리스트 슬라이스와는 다르게 [0:2] ⇒ 0,1,2를 나타냄
    - ex) df.loc[0, '약품명']
  • loc과 iloc의 차이
    - .loc => 인덱스, 컬럼명으로 가져옵니다.
    - .iloc => 순서대로 값을 가져옵니다.
    - loc은 컬럼명을 써줘야하고 iloc은 인덱스번호로 가능
  • 파이썬의 정규표현식에서는 |는 or를 &는 and를 의미합니다.
  • str.contains : 해당 열에서 포함된 내용만 출력
    - ex) df['약품명'].str.contains(' 비타|vita')
  • sort_values : 지정 컬럼 기준으로 정렬
    - ex) df.sort_values(by=['약품명_소문자','가격'], ascending=[False,True])
      → 먼저 약품명_소문자 내림차순 한 후, 같은 약품명_소문자 가격에서 오름차순한다
  • ascending=[False,True] : False : 내림차순, True : 오름차순
  • to_csv : csv로 파일로 저장
  • to_excel : excel 파일로 저장
    - encoding = cp494 : 깨질 때 인코딩으로 사용
  • pd.read_csv : csv의 파일을 데이터프레임으로 읽어온다.

 
2023.01.10
 
 
● 웹 크롤링과 웹 스크랩핑
-웹 크롤링 : 웹상의 정보들을 탐색하고 수집하는 작업
-웹 스크랩핑 : 특정 웹 사이트나 페이지에서 필요한 데이터를 자동으로 추출해 내는 것을 의미
 
크롤링 스크랭핑
웹에서 페이지 및 링크 다운
(웹을 기반으로 작동)
웹을 포함한 다양한 소스에서 데이터 추출
(반드시 웹과 관련된 것은 아님)
동일한 콘텐츠가 여러 페이지에 업로드 된 것을
인식하지 못하므로 중복제거는 필수적
특정 데이터를 추출하는 것이므로
중복 제거가 반드시 필요한 것은 아님
 
● 크롤링 분쟁 : 영업침해 행위, 저작권 위반이 될 수도 있습니다. 어떻게 해석하냐는 법률 전문가의 조언이 필요
● 웹스크랩핑 하기 전에 알아야 할 것:
   -API를 통하지 않은 데이터 수집은 데이터베이스권에 대한 침해행위
   -서비스 제공자의 허락 없이 얻은 정보를 상업적으로 이용하여 서비스 제공자에게 피해가 생길 경우, 데이터베이스권의 침해와 더불어 민사적인 책임
 
● 같은 데이터 임에도  API를 별도로 제공하는 이유 :
   1) 허락된 사람에게만 정보를 제공하고 누가 수집해 갔는지 알기 위해
   2) 유료로 데이터를 판매하고 있는 사이트는 데이터 용량 등에 따라 과금
   3) 공공데이터는 실시간성으로 제공하고자 하는 데이터의 경우 예) 부동산실거래가 정보 등
   4) 특정 사이트에 무리하게 네트워크 요청을 보내면 서버에 무리                                             
     예) 만약에 50명이 특정 카페24의 작은 쇼핑몰에 요청을 한번에 보내면 서버를 다운시킴
   - API용 서버를 따로 두게 되면 데이터를 무리하게 읽어 갔을 때 운영하고 있는 서비스의 서버에 무리가 가지 않게 분리해서 운영가능,
      네이버, 카카오, 유튜브 등은 API를 따로 제공
   - API를 제공할 때 제공할 수 있는 데이터에 한해서 제공합니다.
      예를들어 페이스북에서는 자기계정에 대한 데이만 가져갈 수 있게 API를 제공
 
 
● 경로에서 /의 의미 : 가장 상위의 위치
 1)  / 가장 상위       2)   ./ 해당 위치    3)  ../ 상위 위치
- Disallow: / 의미 : 크롤러가 모든 경로의 데이터를 가져가지 말라는 의미
- Allow : /$. : $(첫페이지) 가장 상위의 페이지만 허용
 
 
● 데이터 수집시 주의할점
   - 영업침해와 저작권의 문제점 
   - 악성코드를 받지 않는지
   - 서버에 부담이 되지 않도록
   - 라이센스 확인
   - API를 별도 제공 여부
 
 
 
● 과학적 표기법, e notation, 과학적기수법 : 10이 곱해진 횟수

    5.806200e+04 => * 10^4

 

● pd.read_html() 의 기능

1) URL, HTML 소스코드를 넣어주게 되면 테이블 태그를 찾아서 반환

2) URL 을 넣어주면 특정 URL 에 접근해서 HTML 페이지의 table 태그를 읽어옴.

3) HTML 페이지의 table 태그는 <table></table> 로 구성.

4) 해당 HTML 의 모든 table을 가져와서 리스트 형태로 반환.

5) 반환된 리스트를 인덱싱하게 되면 데이터프레임으로 되어 있음.

 

* 서버측에서 요청이 너무 많거나 봇이 너무 많이 접근하면 서버에 부담이 되기 때문에 referer 라든지, bot, IP Address 등을 막음

 

●셀레니움

: 주로 웹앱을 테스트하는 웹 프레임워크

• 셀레니움 사용하는 이유

 - BeautifulSoup의 한계 : "자바스크립트로 동적으로 생성된 정보는 가져올 수 없다!

 - BeautifulSoup를 극복하기 위해

 

 셀레니움을 사용해야 할 때는

  => 로그인이 필요할 때, URL 만으로는 수집이 불가할 때 셀레니움을 추천하지 않는 이유

  => 셀레니움은 원래 브라우저를 테스트하기 위한 목적으로 만듬. 무겁고 리소스를 많이 사용합니다.

  - requests 를 사용할 수 있다면 requests 를 사용하는 것이 더 효율적

  - 사이트가 변경되거나 서버 정책이 변경되면 잘 동작하던 수집코드가 동작하지 않게 되는 경우가 종종 있음

 

🙋🏻‍♂️질문: 뷰티풀숲은 데이터 수집 도구가 아닙니다. 뷰티풀숲은 어떤 도구일까요?
HTML, XML 등에서 원하는 값을 얻기 위해 사용합니다. parsing 도구 입니다.

 

● HTML 태그

• HTML 태그에서 id 로 되어있는 것들은 CSS에서 다음과 같이 #으로 표현합니다.

• HTML 태그에서 class 로 되어 있는 것들은 CSS 에서 다음과 같이 .으로 표현합니다.

   => CSS 스타일은 데이터 수집과는 상관 없지만 id, class 값을 통해 해당 태그에 접근할 수 있습니다.

 

 

🙋🏻‍♂️질문: 수집할 수 없는 사이트일 때 어떻게 대응해야 하는지?
사이트마다 다 다릅니다. 헤더, 리퍼러, 파라미터 설정, 로그인 등 서버에서 막을 수 있는 한 막아놓은 사이트는 왜 막혔는지 이유를 리버스엔지니어링을 해서 찾아야 합니다.

 

내용정리

  • pip install : 파이썬 설치 패키지
  • .__version__ : 라이브러리의 version을 확인
  • FinanceDataReader : 한국 주식 가격, 미국주식 가격, 지수, 환율, 암호화폐 가격, 종목 리스팅 등 금융 데이터 수집 라이브러리,
                                         알아서 크롤링해서와서 우리가 볼 수 있게 해줌. as fdr
    - ex) df = fdr.StockListing("KRX")
    - 종목 종류
        KRX : KRX 종목 전체
        KOSPI : KOSPI 종목
        KOSDAQ : KOSDAQ 종목
        KONEX : KONEX 종목
        NASDAQ : 나스닥 종목
        NYSE : 뉴욕증권거래소 종목
        SP500 : S&P500 종목
  • pip install : 파이썬 설치 패키지
  • .__version__ : 라이브러리의 version을 확인

 


2023.01.11

 

● url

- ? :  쿼리 스트링 시작부분으로  ?에서 끊는게 좋다 

- url 구조를 보고 파악할 수 있음

# 종목 URL 만들기
# f-string을 이용하여 url을 수정해주어 변수에 따라 바뀔 수 있게 설정했다.
url = f"https://finance.naver.com/item/sise_day.naver"
url = f"{url}?code={stock_item['삼성전자']}&page={page_no}"
print(url)

 

 

● 데이터 프라이버시 관련되서 조금 부연설명

1) 개인정보는 보안규정에 따라 아무나 접근할  없음. (DB담당자 소수만 접근 가능). 

    개인을 식별할  없게 키값 등으로 계정을 구분합니다. 연락처, 주소, 이메일, 민감한 정보 등은 절대보안을 지킵니다

2) 예시 : 특정 데이팅앱 스타트업에서  대표가 회원의 정보를 열람해서 처벌을 받음, 회사 대표라고 해서개인정보를 열람 x

3) 특정 개인을 비식별화 하고 개인의 민감한 연락처,주소, 이메일 등의 정보를 제외한 플레이정보, 구매정보, 게임내에서 발생한 모든 정보를 분석

4) 개인정보는 보안규정에 따라 다루게 되고 지키지 않으면 처벌대상

 

 

 

🙋🏻‍♂️질문:. 분석가에게 라이브 권한을 주지 않는 이유는?
(DB 권한을 부여할  분석가에게는 라이브DB 열람권한을 주는 곳도 거의 없어요. 복제DB 읽기권한만을부여하는 )
: 라이브DB 잘못된 쿼리를 실행하게 되면 서버 장애로 이어질 수도 있습니다. 서비스에 영향이 없는복제DB 읽기권한만 줍니다

 

🙋🏻‍♂️질문: pd.read_html() 불러와야할지, requests 불러와야할지   있는 방법이 있을까요?
- pd.read_html() 노테이블오류가 나오면 requests 불러옴.
- requests  통해 요청을 보내고 오류메시지를 보고 하나씩 리버스 엔지니어링을 하면서 해결
보통 서버설정에 따라다른데 브라우저의 네트워크 정보만으로는 서버 설정을  알기어렵
- table 태그가 있는지 확인이 우선, 하나씩 찔러보는 리버스엔지니어링 과정이 필요
   찔러보는 방법은 브라우저의 네트워크 정보를 활용하는 것을 추천

 

🙋🏻‍♂️질문: page 설정하는 파라미터와  페이지에 보여지는 분량을 표시하는 파라미터는 무엇일까요?
: pageIndex  페이지를 나타내고, pageUnit  분량을 나타냄.

 


내용정리

  • concat() : 데이터프레임을 합칠 때 사용
    - axis=0 행을 기준으로 위아래로 같은 컬럼끼리 값을 이어 붙여 새로운 행을 만듦
    - axis=1 컬럼을 기준으로 인덱스가 같은 값을 옆으로 붙여 새로운 컬럼을 만듦
  • dropna()  : 데이터프레임 안의 결측치를 제거
  • .str.contains 를 사용하며 조건의 반대에는 앞에 ~ 표시로 표현
    df_one_page = df[~df['제목'].str.contains('연관기사')]
  • drop_duplicates() : 데이터프레임 안의 중복 데이터를 제거
  • tgdm : 진행 상태를 표시해주는 라이브러리
    - tgdm(range())로 묶거나 range() -> trange()로 표현
    - ex) 
    from tqdm import trange
              for page_no in trange(1,11) :
  • .reset_index(drop=True) : 전체 인텍스를 다시 부여하고자 할 때 사용
    - drop =True : 기존 인덱스를 제거
  • html.select() : 웹페이지 개발자도구에서 원하는 위치의 코드에 우클릭하여 copy > selector 를 통해 구함.
    ex) html.select("table > tr > td > span.p10")
  • columns의 위치를 바꿀 때는 컬럼들의 이름이 있는 리스트에서 위치를 바꾸고 변수에 컬럼 재설정
  • http 요청 
    - get : 필요한 데이터를 Query String 에 담아 전송
    - post : 전송할 데이터를 HTTP 메시지의 Body의 Form Data에 담아 전송
    - get 과 post 여부는 브라우저의 네트워크 탭의 Headers > Request Method 를 통해 확인

 


WIL 마무리

이번주는 웹크롤링에 대해 실습을 통해 익힐 수 있었다.

많은 내용들이 있었지만 실습과 함께하니 습득하는데 좋았다. 

복습할 시간이 없어서 조금 힘들었지만 다음주부터 틈틈이 정리하면 복습할 때 더 수월할 것 같다.

힘들지만 배우는게 많아 좋다.


출처 :

- https://blog.codef.io/crawling_vs_scraping/.

- https://wikidocs.net/91474

 

 

 

 

 

 

'멋쟁이사자처럼 > Python' 카테고리의 다른 글

멋사 AI스쿨 TIL - (10)  (0) 2023.01.31
멋사 AI스쿨 WIL - (9)  (0) 2023.01.19
멋사 AI스쿨 TIL - (7)  (0) 2023.01.06
멋사 AI스쿨 TIL - (6)  (2) 2023.01.05
멋사 AI스쿨 TIL - (5)  (0) 2023.01.04
Comments