본문 바로가기
개발일기/파이썬

파이썬(python) 설치부터 파싱(parsing)까지

by 프로그래머콩 2019. 1. 9.

[python3]

파이썬 설치부터 파싱까지

- OS는 맥(mac)과 우분투(ubuntu)



# 파이썬 설치 간단 요약 - 맥(mac) 기준

1. Homebrew 설치하기.

- 터미널 창에 다음 명령어를 입력후 실행하면, 간단하게 설치 완료됨.

- 설치후버전 확인

$ brew -v

출력 결과 >> Homebrew 0.9.5

- 설치후 homebrew update 하기.

$ brew update

2. 환경 변수 설정하기

$ cd ~

$ sudo vi .profile

아래 내용 입력 후 저장

export PATH=/usr/local/bin:/usr/local/sbin:$PATH

3. python설치하기

$ brew install python

또는

$ brew install python3

4. pip 설치하기.

- 터미털 창에 다음 명령어를 입력후 본인암호 입력하면 pip 설치됨.

$ sudo easy_install pip

- 설치 확인

$ pip

5. (선택) python IDE(개발툴) jupyter 설치하기

$ pip install jupyter

( 혹은 $ python3 -m pip install jupyter )

- 설치 확인

$ jupyter notebook

혹은

# 파이썬 설치 간단 요약 - 우분투(ubuntu) 기준

1. python 설치

(보통 설치되어 있는 경우가 많음)

$ sudo apt-get install python

혹은

$ sudo apt-get install python3

2. pip설치

$ sudo apt-get install python-pip

3. (선택) python IDE(개발툴) jupyter 설치하기

$ pip install jupyter

# 웹 크롤링 준비

※ 참고

맥에서는 python 2.x버전이 미리 설치 되어있을 수 있다.

python3.x버전을 사용하고 싶어서 모르고 새로 설치했을 경우 약간의 문제가 발생한다.

pip install 명령어를 통해 python라이브러리(모듈)를 설치할 때 먼저 설치되었던 python 2.x버전에만 라이브러리가 설치된다.

python3버전에 라이브러리 설치를 진행하려면 'pip3 install' 명령어를 사용하면 된다.

혹은

$ pip3 install beautifulsoup4

$ puthon3 -m pip install beautifulsoup4

$ sudo apt install python3-beautifulsoup4 // ubuntu 버전

이렇게도 가능하다.

- 보편적으로 사용하는 python라이브러리들 알아보고 미리 설치하기.

- HTTP 요청을 보내는 모듈인 requests

$ sudo pip install requests

- 많이 쓰이는 파이썬용 파서 beautifulsoup.

html, xml을 파싱할때 주로 많이 사용한다. 웹에서 파싱한 데이터들을 객체화 해줌.

$ sudo pip install beautifulsoup4

- ( iframe 긁어올 때 사용할 selenium도 미리 설치 해놓기)

$ python3 -m pip install selenium

# 기타 추가 설치-selenium에 chrome사용할 사람들만!

# chrome web driver 설치하기

Selenium은 주로 웹앱을 테스트하는데 이용하는 프레임워크. webdriver라는 API를 통해 운영체제에 설치된 Chrome등의 브라우저를 제어하게 된다.

브라우저를 직접 동작시킨다는 것은 JavaScript를 이용해 비동기적으로 혹은 뒤늦게 불러와지는 컨텐츠들을 가져올 수 있다는 것이다. 즉, ‘눈에 보이는’ 컨텐츠라면 모두 가져올 수 있다는 뜻이다. 우리가 requests에서 사용했던 .text의 경우 브라우저에서 ‘소스보기’를 한 것과 같이 동작하여, JS등을 통해 동적으로 DOM이 변화한 이후의 HTML을 보여주지 않는다. 반면 Selenium은 실제 웹 브라우저가 동작하기 때문에 JS로 렌더링이 완료된 후의 DOM결과물에 접근이 가능하다.

+ Selenium이 DOM결과물에 완벽하게 접근 가능하게 하려면 Selenium이 똑똑똑 문 두드릴 때 브라우저 측에서 들어오세요~ 하고 문을 열어주는 역할이 chrome webdriver다

위 사이트에서 버전에 맞게 ChromeDriver를 다운로드 하고 압축을 풀어주면 끝

# 파이썬 사용 방법 (1) : requests로 페이지 긁어 오기

코드

설명

import requests

requests 라이브러리 import

긁어올 홈페이지 URL 변수에 입력

rsp = requests.get(URL)

requests 라이브러리를 이용해 홈페이지 정보를 가져오기

rsp.status_code

서버 코드 나타내기 // 성공 = 200, 리디렉션 = 30*, 페이지 찾을 수 없음 = 40x, 서버 에러 = 50*,

rsp.text

// 가공하지 않은 html 코드 출력 됨

1. GET 요청할 때 parameter 전달법

params = {'param1': 'value1', 'param2': 'value'}

res = requests.get(URL, params=params)

2. POST 요청할 때 data 전달법 위의 내용과 같다, params 대신 data라는 이름으로 주면 된다.

data = {'param1': 'value1', 'param2': 'value'}

res = requests.post(URL, data=data)

조금 더 복잡한 구조로 POST 요청을 해야 할 때가 있다.

이럴 때는 위의 방법이 아니라

우리가 인지하고 있는 그 딕셔너리의 구조를 유지하면서 문자열로 바꿔서 전달해줘야 하는데(?),

python에서 이 노동을 해주는 친구가 json 모듈이다.

import requests, json

data = {'outer': {'inner': 'value'}}

res = requests.post(URL, data=json.dumps(data))

3. 헤더 추가, 쿠키 추가

별도의 헤더 옵션을 추가하고자 할 때는 headers 옵션을, 쿠키를 심어서 요청을 보내고 싶으면 cookies 옵션을 사용하면 된다

headers = {'Content-Type': 'application/json; charset=utf-8'}

cookies = {'session_id': 'sorryidontcare'}

res = requests.get(URL, headers=headers, cookies=cookies)

4. 응답(Response) 객체 요청(request)을 보내면 응답(response)을 받는다.

당연히 이 응답은 python 객체로 받는다.

그리고 이 응답 객체는 많은 정보와 기능을 가지고 있다.

python 환경에서 res.<탭>을 통해 어떤 요소 및 함수가 있는지 살펴볼 수 있다.

( 몇가지만 적어보면)

res.request # 내가 보낸 request 객체에 접근 가능

res.status_code # 응답 코드

res.raise_for_status() # 200 OK 코드가 아닌 경우 에러 발동

res.json() # json response일 경우 딕셔너리 타입으로 바로 변환

# 파이썬 사용 방법 (2) : Beautiful Soup

다음과 같은 함수를 만들어 놓고 시작

(html을 가져오는 함수)

def get_html(url):

_html = ""

resp = requests.get(url)

if resp.status_code == 200:

_html = resp.text

return _html

1. BeautifulSoup를 import

2. URL 변수 선언

3. get_html함수를 이용해 html텍스트 가져오고,

4. beautifulSoup를 이용해서 파싱 객체를 생성한다

from bs4 import BeautifulSoup

html = get_html(URL)

soup = BeautifulSoup(html, 'html.parser')

soup객체는 내가 필요한 부분을 쉽게 찾을 수 있도록 find, find_all함수를 제공한다,

즉 만약 위의 결과에서 a태그를 모두 찾고 싶다면, soup.find_all(“a”)라는 함수만 실행하면 된다

>>> l = soup.find_all("a")

>>> print(len(l))

127

응용해서 post페이지 + iframe 들어간 페이지 띄우면

def post_html(url, data):

_html = ""

resp = requests.post(url, data=data)

if resp.status_code == 200:

_html = resp.text

return _html

html = get_html(URL, '')

soup = BeautifulSoup(html, 'html.parser’)

print(html)

따라란

iframe내용 1개도 안뜸 ^_^

그럴 때 사용하는 방법... selenium!!!

# 본격적으로... selenium !

selenium으로 원하는걸 가져와보자

나의 selenium 크롬 드라이버 위치는 아래와 같다

/Users/(계정이름)/beomi/Downloads/chromedriver

(아래 소스에서 chromedriver위치에 작성 )

==> driver = webdriver.Chrome('/Users/(계정이름)/Downloads/chromedriver’)

import os from selenium

import webdriver

chromedriver = "/Users/(계정이름)/Downloads/chromedriver"

#os.environ["webdriver.chrome.driver"] = chromedriver

driver = webdriver.Chrome(chromedriver)

driver.implicitly_wait(3)#웹 자원 로드 위해 3초까지 기다리기

html=driver.page_source

#driver.close()

참고 : 혹시 아래와 같은 오류가 나타나면

- /etc/hosts 파일 127.0.0.1 localhost 잘 설정 되어있는지 확인 해볼 것!

만약 chromedriver의 위치가 정확하다면 새 크롬 화면이 뜨고 구글 첫 화면으로 들어가질 것입니다.

Selenium은 driver객체를 통해 여러가지 메소드를 제공한다.

URL에 접근하는 api,

페이지의 단일 element에 접근하는 api,

find_element_by_name(‘HTML_name’)

find_element_by_id(‘HTML_id’)

find_element_by_xpath(‘/html/body/some/xpath’)

페이지의 여러 elements에 접근하는 api 등이 있다.

find_element_by_css_selector(‘#css > div.selector’)

find_element_by_class_name(‘some_class_name’)

find_element_by_tag_name(‘h1’)

위 메소드들을 활용시 HTML을 브라우저에서 파싱해주기 때문에 굳이 Python와 BeautifulSoup을 사용하지 않아도 된다.

하지만 Selenium에 내장된 함수만 사용가능하기 때문에 좀더 사용이 편리한 soup객체를 이용하려면

driver.page_source API를 이용해 현재 렌더링 된 페이지의 Elements를 모두 가져올 수 있다.

함수로 정의 해보자

# selenium init함수

>>> def webdriver_init():

... chromedriver="/Users/(계정이름)/Downloads/chromedriver"

... os.environ["webdriver.chrome.driver"] = chromedriver

... driver = webdriver.Chrome(chromedriver)

... driver.implicitly_wait(3)

... return driver

# html Element 인자 가져오는 함수

>>> def get_html(url,driver,frame_name):

... driver.get(url)

... driver.switch_to_frame(frame_name)

... html = driver.page_source

... return html

...

(위 함수 쓰면 아래와 같이 iframe부분만 뽑혀서 나옴!)

# 여태 까지 한 내용들을 정리하면(네이버 블로그 최신글 10개 따오기)

from bs4 import BeautifulSoup

import os

from selenium import webdriver

driver = webdriver_init();

result = get_html("https://blog.naver.com/znxcx93/",driver,”mainFrame")

soup = BeautifulSoup(result, 'html.parser’)

list_area = soup.find_all("li",{"class":"p_title”})

print(list_area)

_list = list()

for index in list_area:

info_soup = index.find("a")

_url = info_soup["href"]

_title = info_soup["title"]

_list.append((_title,_url, ))

(혹은

딕셔너리 방식(키, 값 쌍)인 dict를 이용해서 아래와 같이 코딩해도 무방)

>>> for index in list_area:

... info_soup = index.find("a")

... _url = info_soup["href"]

... _title = info_soup["title"]

... _dict = dict()

... _dict = {'title':_title, 'url':_url}

... _list.append((_dict ))

... _dict.clear()

...

>>> print(_list)

여기 까지가 내가 긁고 싶은 iframe 긁어와서 객체화 하는 것 까지!

*문법 잠깐 알고가기

print(len(_list)) # 객체 개수

print(_list[0]) # 배열 0번 보기...다른 스크립트 문법이랑 별 다르지 않음

*참고

def insert_info(simple_redis, infos):

for info in infos:

res = simple_redis.redis_hash_set("maso", info[0], info)

위는 redis에 insert하는 함수고 응용해서 리스트 순회하며 DB에 튜플 넣는 것 까지 ...