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 =======================

+ Recent posts