selenium 라이브러리를 이용하여 html이나 JavaScript가 아닌 실제 브라우저를 이용하는 것처럼 스크래핑을 하는 방법에 대해 공부하였다.
PhantomJS와 Chromedriver 둘 중 하나가 꼭 필요하니 따라해보고 싶다면 꼭 다운받도록 하자.
여기 나오는 내용은 "파이썬을 이용한 머신러닝, 딥러닝, 실전 개발 입문"에 나오는 내용이다.
======================= Python =======================
from selenium import webdriver
# 캡쳐할 웹 페이지를 선택
url = "http://www.naver.com/"
# PhantomJS 드라이버 추출하기
browser = webdriver.PhantomJS(executable_path="phantomjs")
# print(browser) # 객체 확인.
# 드라이버 초기화를 위해 3초 기다리기
browser.implicitly_wait(3)
# URL 읽기
browser.get(url)
# 화면 캡처하여 저장하기
browser.save_screenshot("Website.png")
# 브라우저 종료하기
browser.quit()
# PhantomJS를 사용하지 않고 크롬의 headless를 이용해서 화면 캡쳐하기
# https://sites.google.com/a/chromium.org/chromedriver/downloads 에서 chromedriver가 필요.
from selenium import webdriver
options = webdriver.ChromeOptions()
options.add_argument('headless') # 브라우저 창 없이 웹 페이지 데이터를 가져올 수 있는 headless를 설정한다. 이게 있어야 브라우저가 안 뜬다.
options.add_argument('window-size=1920x1080') # 가져올 크기를 결정한다.
options.add_argument("disable-gpu") # 그래픽카드 가속을 사용하지 않음. 사용하고 싶으면 enable로 바꾸면 된다.
# 혹은 options.add_argument("--disable-gpu") # 리눅스의 경우 이렇게 지정해야한다.
# 드라이버 객체 생성
driver = webdriver.Chrome('chromedriver', chrome_options=options) # 위에서 담은 옵션을 driver 객체에 넣어준다.
driver.get('http://www.naver.com/') # 들어갈 페이지 설정하기
driver.implicitly_wait(3) # 드라이버 초기화를 위해 3초 기다리기
driver.get_screenshot_as_file('naver.png') # naver.png로 저장
driver.quit()
# PhamtomJS를 이용하여 네이버 쇼핑 페이지에서 구매 목록을 가져오기
from selenium import webdriver
USER = "아이디"
PASS = "비밀번호"
# PhantomJS 드라이버 추출하기
browser = webdriver.PhantomJS()
browser.implicitly_wait(3) # 드라이버 활성화를 위한 3초 기다리기
# 로그인 페이지에 접근하기
url_login = "https://nid.naver.com/nidlogin.login"
browser.get(url_login)
print("로그인 페이지에 접근합니다.")
# 텍스트 박스에 아이디와 비밀번호 입력하기
e = browser.find_element_by_name('id') # 확인 결과 id, name이 동일하게 'id'로 되어있었다.
e.clear() # 기존에 어떤 데이터가 들어있는지 모르기 때문에 clear()메서드를 이용하여 안에 내용 없애기. 안 써도 무방.
e.send_keys(USER) # 아이디 보내기
e = browser.find_element_by_name('pw') # 확인 결과 id, name이 동일하게 'pw'로 되어있었다.
e.clear()
e.send_keys(PASS) # 비밀번호 보내기
# 입력 양식 전송해서 로그인하기
# 로그인 버튼이 <input class="btn_global" type="submit" ~> 으로 되어있어 아래와 같이 설정했다.
form = browser.find_element_by_css_selector("input.btn_global[type=submit]")
form.submit() # submit으로 보낸다.
print("로그인 버튼을 클릭합니다.")
# 쇼핑 페이지의 데이터 가져오기
# 위의 접속 결과를 이용해서 쇼핑 데이터를 가져오기 위해 네이버 쇼핑 url을 입력한다.
browser.get("http://order.pay.naver.com/home?tabMenu=SHOPPING")
# 쇼핑 목록 출력하기
# 쇼핑을 한 목록이 <div class="p_info" ~> <span> 구매물품 </span> </div>로 들어있다.
# 구매 관련한 사항도 들어있으므로 구매확정, 취소완료도 나온다.
products = browser.find_elements_by_css_selector("div.p_info span")
for product in products: # 얻은 데이터를 출력하기.
print("-", product.text)
# 크롬 Headless를 이용하여 네이버 쇼핑 페이지에서 구매 목록을 가져오기
from selenium import webdriver
USER = "아이디"
PASS = "비밀번호"
# headless option 설정하기
options = webdriver.ChromeOptions()
options.add_argument('headless') # 브라우저 창 없이 웹 페이지 데이터를 가져올 수 있는 headless를 설정한다.
# 드라이버 등록하기
browser = webdriver.Chrome('chromedriver', chrome_options=options)
browser.implicitly_wait(3) # 드라이버 활성화를 위한 3초 기다리기
# 로그인 페이지에 접근하기
url_login = "https://nid.naver.com/nidlogin.login"
browser.get(url_login)
print("로그인 페이지에 접근합니다.")
# 텍스트 박스에 아이디와 비밀번호 입력하기
e = browser.find_element_by_name('id') # 확인 결과 id, name이 동일하게 'id'로 되어있었다.
e.clear() # 기존에 어떤 데이터가 들어있는지 모르기 때문에 clear()메서드를 이용하여 안에 내용 없애기. 안 써도 무방.
e.send_keys(USER) # 아이디 보내기
e = browser.find_element_by_name('pw') # 확인 결과 id, name이 동일하게 'pw'로 되어있었다.
e.clear()
e.send_keys(PASS) # 비밀번호 보내기
# 입력 양식 전송해서 로그인하기
# 로그인 버튼이 <input class="btn_global" type="submit" ~> 으로 되어있어 아래와 같이 설정했다.
form = browser.find_element_by_css_selector("input.btn_global[type=submit]")
form.submit()
print("로그인 버튼을 클릭합니다.")
# 쇼핑 페이지의 데이터 가져오기
# 위의 접속 결과를 이용해서 쇼핑 데이터를 가져오기 위해 네이버 쇼핑 url을 입력한다.
browser.get("http://order.pay.naver.com/home?tabMenu=SHOPPING")
# 쇼핑 목록 출력하기
# 쇼핑을 한 목록이 <div class="p_info" ~> <span> 구매물품 </span> </div>로 들어있다.
# 구매 관련한 사항도 들어있으므로 구매확정, 취소완료도 나온다.
products = browser.find_elements_by_css_selector("div.p_info span")
for product in products: # 얻은 데이터를 출력하기.
print("-", product.text)
6b3e125bdd0f1e6919094daad36"
# 날씨를 확인할 도시 지정하기
cities = ["Seoul,KR", "Toko,JP", "New York,US"]
# API 지정
api = "https://api.openweathermap.org/data/2.5/weather?q={city}&APPID={key}"
# 절대 온도를 섭씨로 변환
k2c = lambda k: k - 273.15
# 각 도시의 정보 추출하기
for name in cities:
# API의 URL 구성하기
url = api.format(city=name, key=apikey) # 도시 이름을 {city}에, apikey를 {key}에 매핑을 해준다.
# API에 요청을 보내 데이터 추출하기
r = requests.get(url) # json 형태의 데이터가 나온다.
# print(type(r)) # <class 'requests.models.Response'>
# print(type(r.text)) # <class 'str'>
# 결과를 JSON 형식으로 변환하기
data = json.loads(r.text) # 위의 requests.models.Response을 dict 으로 바꾸기 위해 json.loads(r.text)를 사용한다.
# print(type(data)) # <class 'dict'>
# print(data) # 데이터 확인
print("+ 도시 =", data["name"])
print("| 날씨 =", data["weather"][0]["description"])
print("| 최저 기온 =", k2c(data["main"]["temp_min"]))
print("| 최고 기온 =", k2c(data["main"]["temp_max"]))
print("| 습도 =", data["main"]["humidity"])
print("| 기압 =", data["main"]["pressure"])
print("| 풍향 =", data["wind"]["deg"])
print("| 풍속 =", data["wind"]["speed"])
print("")
======================= Python =======================
'프로그래밍 > Python, R 프로그래밍' 카테고리의 다른 글
[Python] Python 26일차(파이썬을 이용한 머신러닝, 딥러닝 실전 개발 입문) (0) | 2018.07.10 |
---|---|
[Python] Python 25일차(파이썬을 이용한 머신러닝, 딥러닝 실전 개발 입문) (0) | 2018.07.09 |
[Python] Python 23일차(파이썬을 이용한 머신러닝, 딥러닝 실전 개발 입문) (0) | 2018.07.03 |
[Python] Python 22일차(파이썬을 이용한 머신러닝, 딥러닝 실전 개발 입문) (0) | 2018.07.02 |
[Python] Python 21일차(예제로 배우는 파이썬 데이터 시각화) (0) | 2018.06.20 |