181026_TodayWhatILearned

181026 TWIL

오늘 한 일은 무엇인가

  1. Xpath, Scrapy 를 활용한 Crawling 공부
  2. DataScience 와 DataEngineering 의 차이점 찾아보기

내일 할 일은 무엇인가

  1. 확률분포 공부
  2. Scrapy 활용해보기

무엇을 느꼈는가

  • DataScience 와 DataEngineering 의 공통점과 차이점에 대해 알아보았는데, 아직은 현업에서 각
    분야가 하고 있는 일이 어떻게 다른지 확실한 감이 오지 않는 것 같다. 내가 명확히 재밌어하는 것은 아직까지는
    어떤 디테일한 분야가 아니라, 수학적인 것, 프로그래밍 적인 것들을 배운 것을 적용해보고 응용하는 것에
    흥미를 느끼는 것 같은데 이보다 더 앞서 생각해보고 결정하려고 하니 감이 잘 오지 않는 것 같다.
  • 지금 현재로서는, 다양한 기계학습 알고리즘과 머신러닝 등을 이용하여 prediction 등을 통해 새로운 Insight
    를 얻어내는 것에 관심이 있는 것 같다. 이 분야를 공부하고 배워 나가면서 엔지니어링 분야를 필요에 의해 점차
    공부해 나가는 방향으로 삼고 싶다.

Pillow

Pillow

공부한 내용을 스스로 보기 쉽게 정리한 글입니다.

  • Pillow 는 Python에서 이미지를 핸들링 하기위한 라이브러리이다. 스크린 샷, 이미지 크롭, 썸네일
    등을 만들 수 있다.
  • 또한, 다양한 이미지 확장자를 다룰수 있다. (예, jpg, png)

Pillow install

1
pip install Pillow

1. Import Convention

  • Pillow 를 사용하기에 앞서, Import 해야한다.
    1
    from PIL import Image

2. Pillow 메소드

(1) open()

  • 이름 그대로, 경로와 파일 이름을 적어주면, 해당 이미지리턴하여 Variable 에 할당한다.
    1
    image = Image.open("imagefile_name")

(2) crop()

  • 이름 그대로, image 를 잘라준다. 이 때 Parameter 는 box형태로 들어가게 된다.
  • box 는 (left, upper, right, lower) 로 들어가게 된든데, pixel 단위로 들어가면 된다
  • 이미지의 가장 왼쪽과 위쪽 라인을 기준으로,
    • left px 만큼
    • upper px 만큼
    • (왼쪽을 기준으로) right px 만큼
    • (위쪽을 기준으로) bottom px 만큼

      잘라, box 로 만들어 준다.
      1
      2
      3
      box = (10, 10, 110, 110)
      image.crop(box)
      ### 이렇게 되면 가로세로 100px 만큼의 이미지가 만들어진다.

(3) thumbnail()

  • 썸네일을 만들어준다.
  • 썸네일의 활용 방안은 한 가지 사진을 어플리케이션 곳곳에서 사용한다고 할 때, 데이터 사이즈가 큰 원본 사진을 계속 해서 들고 다니며 사용하면 어플리케이션에 따라 메모리 낭비, 서버용량 낭비, 트래픽 낭비 등으로 이어질 수 있다. 따라서, 이미지의 데이터 크기와 해상도를 낮춰 사용할 수 있다.
    1
    2
    image.thumbnail((pixel, pixel))
    #thumbnail 메소드를 사용하여, 원하는 pixel 수로 줄일 수 있다.

181025_TodayWhatILearned

181025 TWIL

오늘 할 일은 무엇인가

  1. 확률분포 공부
  2. 프로젝트 모임
  3. Selenium, Scrapy, Pillow 활용 공부

오늘 한 일은 무엇인가

  1. Selenium, Pillow 활용 공부

내일 할 일은 무엇인가

  1. 확률분포 공부

무엇을 느꼈는가

  • 동영상과 이미지를 처리하는 방법에 대해 공부하면서, Selenium 을 활용해 많은 활용도를 느꼈다.
    주말을 이용해 동영상이나 이미지들을 Crawling 해서 class 형태로 만드는 방법을 시도해봐야겠다.

Requests

WEB CRAWLING 1

공부한 내용을 스스로 보기 쉽게 정리한 글입니다.

Requests

  • Requests 패키지는 크롤링 하고자 하는 페이지를 url 값을 통해 가져와 객체로 변환 해주는 기능을 가지고 있다.

1. Installation

  • Requests 를 이용하기 위해 package 를 설치해준다.
    1
    $ pip3 install requests

  • request를 이용하면서, json 형식으로의 크롤링과, html 형식으로 css selecting 을 위한 크롤링을 실습해 볼 것이므로, BeautifulSoup Package 역시 같이 설치해준다. (BeautifulSoup은 html parser 를 이용해보기 위함이다.)
  • python-forecastio 는 dark sky 의 api를 활용해 날씨 데이터를 받아올때 사용해보기 위해 설치한다.
    1
    2
    $ pip3 install bs4
    $ pip3 install python-forecastio
  • import 할 것들
    1
    2
    3
    4
    import requests
    import forecastio
    from bs4 import BeautifulSoup
    from pandas.io.json import json_normalize

2. [ jSON ] Dark Sky api 활용 날씨정보 가져오기

  • DarkSky api 는 위도와 경도를 입력하면, 날씨 정보를 주는 api 이다.

  • https://darsky.net/dev/ 에 가입 후, TOKEN 을 받는다.

  • 위에서 받은 개인의 TOKEN 을 활용해 url 을 먼저, formating을 해준다.

  • requests의 get 메소드를 활용해 url 의 정보를 받아온다.

  • 받아온 정보를 requests 의 json 메소드로 json 형식으로 변환해준다.

  • json 을 확인하고 원하는 정보를 return 해준다.

    1
    2
    3
    4
    5
    def forecast(lat, lng):
    url = "https://api.darksky.net/forecast/{}/{},{}".format(TOKEN, lat, lng)
    response = requests.get(url)
    json_obj = response.json()
    return json_obj["hourly"]["summary"]

3. [ html ] BS4 활용 html selecting 해서 가져오기

  • 네이버의 실시간 검색순위 부분의 text 를 크롤링 해보자
  • html 파일을 BS4 를 활용해 받아온뒤, CSS selecting 으로 원하는 text data 를 가져온다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from bs4 import BeautifulSoup
def naver():
url = "https://www.naver.com"
df = pd.DataFrame(columns=["rank", "keyword"])
response = requests.get(url)
dom = BeautifulSoup(response.content, "html.parser")

# BeautifulSoup(markup, features, builder, parse_only, from_encoding, exclude_encodings)

for keyword in keywords:
df.loc[len(df)] = {
"rank":keyword.select_one('.ah_r').text,
"keyword":keyword.select_one('.ah_k').text
}
return df
  • print(response.content)의 모양을 보자.
  • 따라서, BeautifulSoup 으로 html 형식으로 parsing 해주고, css 를 활용해 selecting 해준다.
  • .select 는 여러개의 엘리먼트를 선택 -> 결과가 리스트
  • .select_one은 하나의 엘리먼트를 선택 -> 결과가 하나의 객체

Selenium

Selenium

공부한 내용을 스스로 보기 쉽게 정리한 글입니다.

  • 자동화 할 수 있는 프로그램

[ Install Selenium ]

  1. chrome driver 다운로드

    1
    $ mv ~/Download/chromedriver /usr/local/bin
  2. Selenium Python Package 설치

    1
    $ sudo pip3 install selenium

1. 셀레니움 사용해보기

  • import
    1
    from selenium import webdriver
  • Open Browser (Chrome Driver)
    1
    driver = webdriver.Chrome()
  • 페이지 이동
    1
    driver.get(url)
  • 브라우져 상에서 자바 스크립트 실행
    1
    driver.execute_script("window.scrollTo(300, 400)")
  • 지금 control하고 있는 window 객체 확인
    1
    2
    3
    main_window = driver.current_window_handle
    main_window
    #현재 control 하고 있는 window 의 객체를 리턴한다.
  • 열려 있는 전체 window 탭 모두 확인
    1
    2
    3
    windows = driver.window_handles
    windows
    #현재 열려있는 모든 탭의 객체를 리스트 형태로 리턴한다.
  • 열려있는 window 탭 중, control 대상 window 로 바꾸기
    1
    2
    3
    driver.switch_to_window(windows[0])
    #다시 원래 열었던 창으로 돌아가기
    driver.switch_to_window(main_window)

2. Alert 와 Confirm 다루기

  • 웹을 자동화해서 다니다보면, Alert 창이나 Confirm 창이 의도치 않게 나올 수 있다. 이를 다루는 방법은 다음과 같다.
  • Alert와 Confirm 창의 차이는,

    Alert 는 확인 창 하나만 있고, Confirm은 확인과 취소가 같이 있는 창이다.

(1) Alert

  • Alert 띄우기
    1
    2
    drive.switch_to_window(main_window)
    drive.execute_script("alert('이게 alert 로 뜰겁니다.');")
  • Alert 확인 누르기
    1
    2
    alert = driver.switch_to.alert
    alert.accept()
  • Alert 창이 있으면 확인을 누르고, 없으면 없다고 리턴하기 (예외처리)
    1
    2
    3
    4
    5
    try:
    alert = driver.switch_to.alert
    alert.accept()
    except:
    print("alert 가 없습니다.")

(2) Confirm

  • Confirm 띄우기
    1
    driver.execute_script("confirm('이게 Confirm 창입니다.');")
  • Confirm 창 확인 누르기 or 취소 누르기
    1
    2
    3
    4
    5
    confirm = driver.switch_to.alert
    # 확인
    # confirm.accept()
    # 취소
    confirm.dismiss()

3. 입력창에 글씨 입력하기

  • 이제부터 Selenium을 통해 특정 html 의 element 에 액션을 주려면,
    각종 Selector 를 사용하여 html 상의 element을 셀렉팅 하고, 해당 element 에게 액션을 주어야한다.
1
driver.find_element_by_css_selector(nameof cssselector).send_keys("입력할 내용")
  • .find_element_by_css_selector 와

    .find_elements_
    by_css_selector 는 다르다.element 는 하나의 selector 만 선택하는 반면, elements 는 여러가지 element 를 셀렉팅 해서, 리스트 형식으로 Return 한다.
  • 따라서 이렇게 리스트 형식으로 Return 이 된 경우, List[0] 등과 같이 그 엘리먼트를 뒤에 지정해줘야된다. 즉,
    1
    2
    3
    4
    driver.find_element_by_css_selector(nameof cssselector)
    #위는 바로 selecting 이 된것이지만,
    driver.find_elements_by_css_selector(nameof cssselector)[0]
    #위는 뒤에 selecting 위해 list 의 요소를 선택 해주어야한다.

4. 버튼 클릭하기

1
2
# 위의 방법처럼, element 를 선택해준다.
driver.find_element_by_css_selector("name of css selector").click()

5. id, class, 그 외의 attribute 값을 selecting 하는 법

1
2
3
4
driver.find_element_by_css_selector("name of css selector.").click()
# id 의 경우 : #idname
# class 의 경우 : .classname
# 다른 attribute 의 경우 : [attribute = 'value']

6. selecting 한 element 의 attribute value 를 얻는 방법

  • CSS로 선택한 element에 html 태그에는 다양한 attribute 들이 있을 수 있다. 이 중
    attribute의 value에 접근 하고 싶을 때는 .get_attribute()메소드를 사용할 수 있다.
    1
    driver.find_element_by_css_selector("name of css selector").get_attribute("attribute_name")

7. element 의 위치와, 사이즈 구하기

  • 스크롤을 내리거나, 엘리먼트의 위치와 크기를 알고 싶을 때 사용할 수 있다.
    1
    2
    3
    4
    5
    element = driver.find_element_by_css_selector("name of css selector")
    element.location
    #element 의 좌측 상단의 위치가 pixel 단위로 x, y 값의 dictionary로 보여준다.
    element.size
    #element 의 size 를 height, width를 pixel 단위로 dictionary로 보여준다.

Thread

Thread

공부한 내용을 스스로 보기 쉽게 정리한 글입니다.

  • 파이썬 기본 : Single Thread (Main Thread)

  • threading 모듈 : main thread에서 subthread 를 생성하여 진행하는 방식

  • multiprocessing 모듈 : double cpu

  • ThreadPoolExecutor : API - 멀티스레드와 멀티프로세스 동일한 형태로 디자인(Pool 클래스만 변경하면됨)

threading.Thread() arguement

1
2
3
4
5
Thread(group=, target=, args= , kwargs=, *, daemon=None)
#target= : 실제 스레드에서 돌아가게 될 함수
#args= : tuple 로 target 함수에 들어가게될 argument
#kwargs= : dictionary로 target 함수에 들어가게될 argument
#daemon : 데몬 스레드로 돌아갈지 여부
1
2
3
4
5
#Thread 의 메소드
start(): #스레드의 실행, self 의 run() 메소드를 호출
run(): #스레드가 실제로 수행하게될 작업
name : #스레드의 이름
threading.locals() : #해당 스레드 내부에서 사용할 로컬 변수 지정

181024 TodayWhatILearned

181024 TWIL

오늘 할 일은 무엇인가

  1. 멀티스레딩으로 네이버 크롤링 코드 작성
  2. 오후 4시 스터디
  3. 확률 분포 공부

오늘 한 일은 무엇인가

  1. 멀티스레딩 개념을 활용한 크롤링 코드 작성
  2. 오후 4시 스터디
  3. 확률분포 공부

내일 할 일은 무엇인가

  1. 확률분포 공부
  2. 프로젝트 모임
  3. Pandas 정리해보기

무엇을 느꼈는가

  • Documentation 과 각종 개념 자료들을 혼자 보고 공부하면서, 파이썬이라는 언어가 단순히 책 한권 끝냈다고 해서 끝나는 언어가 아님을 깨달았다. 기본적인 문법을 금방 익숙해져서, ‘역시 쉬운 언어인가’라고 생각했다가 오늘 다양한 자료를 찾아보고 읽어보면서 언어 하나만해도 아직 공부할게 무궁무진 하다는 것을 깨달았다.

181023 TodayWhatILearned

181023 TWIL

오늘 할 일은 무엇인가

  1. Queue 정리 하기
  2. 확률 분포 공부
  3. <스터디>멀티 스레딩 개념을 포함한 네이버 크롤링 코드짜기

오늘 한 일은 무엇인가

  1. <스터디> 멀티 스레딩에 관해 이야기, 공부해볼 정보들 공유, 어떻게 코드를 구성할 것인지 의견을 나누었다.
  2. Queue 개념 정리 및 코드 구현 연습
  3. 베르누이 분포, 이항분포 정리 및 Searching
  4. 블로그 수정

내일 할 일은 무엇인가

  1. 오후 4시 멀티 스레드 관련한 내용으로 온라인 스터디 모임 예정
  2. 멀티스레딩 개념을 활용한 네이버 크롤링 코드 짜기
  3. 각종 확률 분포 및 검정 부분까지 복습

무엇을 느꼈는가

  • 오늘 공부한 testing 시작부분부터는 그간 배웠던 것을 한꺼번에 적용한다. 배웠던 여러가지 분포를 활용하여,
    가설을 세우고 이 가설이 선택한 분포의 관점에서 봤을 떄, 가설을 선택할지 기각할지에 관한 내용은 점차
    data를 통해 prediction 을 해가는 과정에 있는 듯한 느낌을 받았다.
  • 아직 검정 과정과 앞으로 공부하게 될 여러가지 분석 모델을 이해하기에 앞서배운 확률분포 부분의 내용이
    부족한듯하여, 계속 꾸준히 앞부분을 공부해야될 것 같다.

Queue

Queue

공부한 내용을 스스로 보기 쉽게 정리한 글입니다.

Queue의 특징

  1. 내가 버스정류장에 서있다고 생각해보면, 버스 전용차선으로 버스가 줄지어 들어온다. 아무리 뒷차가 손님을 다 태웠다고해서, 앞에 버스가 아직 손님을 태우고 있으면 뒷 버스는 출발 하지 못한다.

    이것이 바로 QUEUE
  2. FIFO : First In First Out == 선입선출 or 후입후출
  3. front와 rear 라는 index가 각각 구조의 맨 앞과 뒤를 가리키고 있다. Data는 rear로 들어가고, front 에서 나온다.

ADT

  1. empty() 라는 메소드로 Queue 에 data가 있는지 없는지 확인하게 한다. empty 이면 True, not empty 이면, False 를 return 한다.

    Queue.empty() returns Boolean

  2. enaueue(data) 메소드로 Queue의 rear 가 가리키고 있는 data 뒤에 data를 넣는다.

    Queue.enqueue (data) returns None

  3. dequeue() 메소드로 Queue의 front가 가리키고 있는 data를 반환하면서 삭제 된다.

    Queue.dequeue() returns data

  4. peek() 메소드로 Queue의 front가 가리키고 있는 data를 반환한다. peek은 어디까지나 확인하는 메소드 이므로, data가 삭제되지 않는다.

    Queue.peek() returns data

구현 1 : by python list

  • Queue 구조를 Python에 내장 되어 있는 list를 container 로 구현한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Queue:
def __init__(self):
self.container=list()

def empty(self):
# ADT 를 따라서, 비어 있으면 return True 비어있지 않으면 return False
if not self.container:
return True
return False

def enqueue(self, data):
# list 를 활용했으므로, list.append(data)를 활용할 수 있다.
self.container.append(data)

def dequeue(self):
# pop 역시 list.pop()을 활용할 수 있다.
return self.container.pop(0)

def peek(self):
# peek은 단지 front 에 어떤 데이터가 있는지 확인 하는 것 뿐이므로, 현재 리스트의 가장 앞 부분에 있는 data 를 확인하면 된다.
return self.container[0]

구현 2 :

Stack

Stack

공부한 내용을 스스로 보기 쉽게 정리한 글입니다.

Stack 의 특징

  1. 접시를 쌓듯이 데이터를 쌓아 올리는 모양의 데이터 구조
  2. LIFO : Last In First Out == 후입선출 or 선입후출
  3. top index 가 항상 Stack의 가장 윗부분을 가리키고 있어, 우리는 top 위치만 볼 수 있다.
  4. 단점 : stack 의 top 이 외에 밑에 쌓여져있는 데이터의 Search 가 안된다.

ADT

  1. empty() 라는 메소드로 Stack 에 data가 있는지 없는지 확인하게 한다. empty 이면 True, not empty 이면, False 를 return 한다.

Stack.empty() returns Boolean
2. Stack의 top 위치에 데이터를 쌓는다.

Stack.push(data) returns None

  1. Stack의 top 위치에 있는 데이터를 삭제하면서 반환한다.

Stack.pop() returns data
4. Stack의 top 위치에 있는 데이터를 반환하지만, 삭제하지 않는다. 어떤 데이터가 있는지 just 확인.

Stack.peek() returns data

구현 1 : by python list

  • Stack 구조를 Python에 내장 되어 있는 list를 container 로 삼아 구현하게 되면, 그 구현은 매우매우 쉽다.
  • Python의 List 자료형의 대단함을 그만큼 느낀다.
  • 이 때 List 의 index가 큰 쪽이 top 방향이다.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    class Stack:
    def __init__(self):
    self.container=list()

    def empty(self):
    # ADT 를 따라서, 비어 있으면 return True 비어있지 않으면 return False
    if not self.container:
    return True

    return False

    def push(self, data):
    # list 를 활용했으므로, list.append(data)를 활용할 수 있다.
    self.container.append(data)

    def pop(self):
    # pop 역시 list.pop()을 활용할 수 있다.
    return self.container.pop()

    def peek(self):
    # peek은 단지 top 에 어떤 데이터가 있는지 확인 하는 것 뿐이므로, 현재 리스트의 가장 마지막에 append 되어 있는 data를 확인하면 된다.
    return self.container[-1]

구현 2 :