Scrapy

Scrapy

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

  • Scrapy 라이브러리는 파이썬에서 제공하는 라이브러리로써, 대량의 페이지들의 Crawling을 손쉽게 해주는 라이브러리이다.

1. Install

  • 파이썬의 라이브러리 이므로 pip 으로 설치 할 수 있다.
    1
    pip3 install scrapy

2. 실습

  • 실습을 위해 import 할 것들
1
2
3
import scrapy
import requests
from scrapy.http import TextResponse
  1. requests 를 통해 url 정보를 받아온다.
  2. TextResponse 를 통해 받아온 html 파일을 encoding 과 text형식으로 return
1
2
req = requests.get("url_name")
response = TextResponse(req.url, body=req.text, encoding="utf-8")
1
2
3
4
5
6
a = response.xpath('xpath')
# xpath 로 지정한 엘리먼트를 가져온다.
a_text = reponse.xpath('xpath/text()')
# 엘리먼트의 text data 를 가져온다.
a_text.extract()
# 엘리먼트의 text data들을 말그대로 extract 하여, list 형태로 return 해준다

3. Scrapy 사용하기

(1) scrapy 프로젝트 생성

  • shell command
    1
    scrapy startproject crawler
1
!scrapy startproject crawler
New Scrapy project 'crawler', using template directory '/Users/emjayahn/.pyenv/versions/3.7.0/envs/dss/lib/python3.7/site-packages/scrapy/templates/project', created in:
    /Users/emjayahn/Dev/DSS/TIL(markdown)/crawler

You can start your first spider with:
    cd crawler
    scrapy genspider example example.com
1
!tree crawler
crawler
├── crawler
│   ├── __init__.py
│   ├── __pycache__
│   ├── items.py
│   ├── middlewares.py
│   ├── pipelines.py
│   ├── settings.py
│   └── spiders
│       ├── __init__.py
│       └── __pycache__
└── scrapy.cfg

4 directories, 7 files

(2) Scrapy 기본 구조

  1. Spider

    • 크롤링 절차 정하기
    • 어떤 웹사이트들을 어떻게 크롤링 할 것인지 선언
    • 각각의 웹페이지의 어떤 부분을 스크래핑 할 것 인지 명시하는 클래스
  2. items.py

    • spider 가 크롤링한 data 들을 저장할 때, 사용자 정의 자료구조 클래스
    • MVC : 중 Model 부분에 해당
    • Feature 라고 생각
  3. pipeline.py

    • 스크래핑한 데이터를 어떻게 처리할지 정의
    • 데이터에 한글이 포함되어 있을 때는 encoding=’utf-8’ utf-8인코딩이 필요
  4. settings.py

    • Spider, item, pipeline 의 세부 사항을 설정
    • (예) 크롤링 빈도 등
    • (예) robots.txt - ROBOTSTXT_OBEY=True

Xpath

xpath

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

1. xpath란?

  • xpath = XML Path Language
  • XML 문서의 element나 attribute의 value에 접근하기 위한 언어
  • XML 문서를 해석하기 위한 언어이므로, 기본적으로 path expression 이 바탕이 되어있다.
  • 연산, 문자열 처리를 위한 라이브러리를 내장하고 있다.

2. Location Path

  • element 를 찾으러 가는 것이므로, location을 나타내기 위한 연산자는 다음과 같다.
  1. element_name : element_name 과 일치하는 모든 element를 선택한다.
  2. / :
    • 가장 처음 쓰는 /는 절대경로를 의미한다.
    • Path 중간에 쓰는 /는 조건에 맞는 바로 다음 하위 엘리먼트를 검색한다. (css selector에서 >와 같다)
  3. // : 가장 상위 엘리먼트
  4. . : 현재 엘리먼트
  5. * : 조건에 맞는 전체 하위 엘리먼트를 검색한다(css selector 에서 한칸 띄우는 것 과 같다)
  6. element[조건] : 엘리먼트에 조건에 해당되는 것을 검색한다
    • (예) p[2] : p 엘리먼트 중 두번째 엘리먼트를 선택 **주의:1부터 시작, 0이 아님 **
    • (예) [@(attribute_key="attribute_value")] : 속성값으로 엘리먼트를 선택
      [@id="main"] : “main” 이라는 id 를 선택
      [@class="pp"] : “pp” 라는 class 를 선택
  7. not(조건) : 조건이 아닌 엘리먼트를 찾는다.
  8. /text() : 해당 엘리먼트의 text 데이터를 가져온다
  9. /@attribute_name : 해당 엘리먼트의 attribute_name 에 할당된 value 값을 가져옴
    • /@href : 해당 엘리먼트의 href의 value 값을 가져옴

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 형태로 만드는 방법을 시도해봐야겠다.

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로 보여준다.

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은 하나의 엘리먼트를 선택 -> 결과가 하나의 객체

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 을 해가는 과정에 있는 듯한 느낌을 받았다.
  • 아직 검정 과정과 앞으로 공부하게 될 여러가지 분석 모델을 이해하기에 앞서배운 확률분포 부분의 내용이
    부족한듯하여, 계속 꾸준히 앞부분을 공부해야될 것 같다.