기본 콘텐츠로 건너뛰기

Python Selenium

동적인 컨텐츠로부터 필요한 데이터를 추출하는 방법
selenium 앱, 모듈이 필요함
- 시스템에 selenium 모듈 설치
- selenium 앱(웹드라이버) 다운로드
- selenium 모듈을 사용하여 웹드라이버 제어
- 웹드라이버는 웹브라우저를 제어하여 사이트에 접근
- 코드를 사용하여 브라우저 화면의 버튼도 클릭 가능
- 웹페이지 가져오기(crowling), 웹페이지로부터 추출(scraping)
- selenium, BeautifulSoup 연동 가능

설치

C:/temp/chromedriver.exe

pip install selenium

사용
from selenium import webdriver
from selenium.webdriver.common.keys import Keys 
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service

driver = webdriver.Chrome(executable_path='C:/Temp/chromedriver')  # 드라이버가 저장된 경로
driver.get('https://naver.com')
driver.implicitly_wait(1) # 모두 로드가 될 때까지 충분히(1초) 기다린다

문법
find_element(By.ID,'id') # 아이디
find_element(By.NAME, 'name') # name 속성
find_element(By.XPATH, 'xpath') # xpath
find_element(By.LINK_TEXT, 'link text') # 링크 텍스트
find_element(By.PARTIAL_LINK_TEXT, 'partial link text') # 부분적인 링크 텍스트
find_element(By.TAG_NAME, 'tag name') # 태그 이름, 한개
find_elements(By.TAG_NAME, 'tag name') # 태그 이름, 여러개
find_element(By.CLASS_NAME, 'class name') # 클래스 이름
find_element(By.CSS_SELECTOR, 'css selector') # CSS 선택자

CLASS_NAME
res = driver.find_element(By.CLASS_NAME,'login_msg')
type(res) # selenium.webdriver.remote.webelement.WebElement
res.text.strip() # '네이버를 더 안전하고 편리하게 이용하세요'
res.get_attribute('class').strip() # 'login_msg'

XPATH
특정 태그에 접근하기 위한 경로 표현법
사용
res = driver.find_element(By.XPATH,'//*[@id="account"]/p') # <selenium.webdriver.remote.webelement.WebElement (session="52e59ced3cf08d0b7c8b874eda71d998", element="967fc44d-6e6e-4749-8e13-5bbd43804c9e")>
res.text # '네이버를 더 안전하고 편리하게 이용하세요'
문법
'//*[@id="account"]/p' # //(상대경로)*(모든태그)[@id="account"](아이디가 'account')/(하위경로)p(p태그)

CSS_SELECTOR
driver.find_element(By.CSS_SELECTOR,'#account>p.login_msg').text # '네이버를 더 안전하고 편리하게 이용하세요'

Input Tag에 값 집어넣기
input.send_keys('python')

Button Tag 클릭하기
button.click()

사용
# 검색창에 'python'을 입력하고 검색버튼 클릭하기
driver.find_element(By.CSS_SELECTOR, '#query').send_keys('python')
driver.find_element(By.CSS_SELECTOR, '#search_btn').click()

실습
##
# selenium, BeautifulSoup 등을 사용하여 아래의 문제를 해결해보세요
# 자신의 메일 목록에서 2페이지 분량의 메일 송신자, 제목, 날짜 정보를
# 가져와서 csv 파일에 저장하기

def addCsv(url, list_csv):
    driver.get(url)
    mails = driver.find_elements(By.CSS_SELECTOR,'.mail_item')

    for mail in mails:
        mail_sender = mail.find_element(By.CSS_SELECTOR,'.mail_sender')
        button_sender = mail_sender.find_element(By.CSS_SELECTOR,'.button_sender')
        sender = button_sender.text.split('\n')[1]
        title = mail.find_element(By.CSS_SELECTOR,'.mail_title_link>.text').text
        date = mail.find_element(By.CSS_SELECTOR,'.mail_date_wrap').text

        csv = {}
        csv['sender'] = sender
        csv['title'] = title
        csv['date'] = date
        list_csv.append(csv)

list_csv = list()
addCsv('https://mail.naver.com/v2/folders/0/all?page=1',list_csv)
addCsv('https://mail.naver.com/v2/folders/0/all?page=1',list_csv)

with open('mail_csv.csv','wt') as fout:
    for csv in list_csv:
        fout.write(f"{csv['sender']},{csv['title']},{csv['date']}\n")
##

##
# Spring 웹에서 [사원정보 보기] 버튼을 누르면 위의 사원정보가 json 문자열 형식
# 으로 응답되는 기능을 작성한다. 로그인한 이용자만 버튼을 누를 수 있게 한다
# 버튼을 누르면, gender, first_name, phone, job_title
# <table> 안에 표시되도록 한다

# Python 데이터 수집 시스템을 작성하여 화면에 표시된 사원정보 테이블에서
# 데이터를 읽어와서 python_emp_table.json 파일에 저장한다
# 파일에 저장된 사원정보는 언제든지 파이썬을 이용하여 화면에 표시될 수 있어야 한다.
import requests
res = requests.get('http://localhost/crawl/login?id=smith&pw=1111')

from selenium import webdriver
driver = webdriver.Chrome('C:/Temp/chromedriver');
driver.get('http://localhost/crawl/login?id=smith&pw=1111')
driver.implicitly_wait(1)

from selenium.webdriver.common.by import By
driver.find_element(By.CSS_SELECTOR,'#employees_btn').click()
driver.implicitly_wait(1)

employee_tr = driver.find_elements(By.CSS_SELECTOR,'.employee')

with open('employees.csv','wt') as fout:
    for tr in employee_tr:
        str_csv = f"{tr.find_element(By.CSS_SELECTOR,'.gender').text},{tr.find_element(By.CSS_SELECTOR,'.first_name').text},{tr.find_element(By.CSS_SELECTOR,'.phone').text},{tr.find_element(By.CSS_SELECTOR,'.job_title').text}\n"
        fout.write(str_csv);
        print(str_csv)
##

이 블로그의 인기 게시물

Blogger

코드 하이라이트 사이트 http://hilite.me/ 코드 <!-- 나만의 공간 --> <style id='daru_css' type='text/css'> .code {      overflow: auto;      height: 200px;      background-color: rgb(239,239,239);      border-radius: 10px;      padding: 5px 10px; } .code::-webkit-scrollbar-thumb {      background-color: grey;      border: 1px solid transparent;      border-radius: 10px;      background-clip: padding-box;   } .code::-webkit-scrollbar {      width: 15px; } </style> <!-- 나만의 공간 -->

Python Sklearn make_blobs

from sklearn.datasets import make_blobs 예제 X, y = make_blobs(n_samples=500, centers=3, n_features=2, random_state=0) # 500개의 점을 3개로 모이게 한다, 변수는 2개, 무작위 상태는 0 X.shape, y.shape # ((500, 2), (500,)) plt.scatter(X[:,0],X[:,1],c=y,s=5) plt.show() # 학습 데이터 나누기 from sklearn.model_selection import train_test_split x_train, x_test, y_train, y_test = train_test_split(X, y, test_size=.25, random_state=0) x_train.shape, x_test.shape, y_train.shape, y_test.shape # ((375, 2), (125, 2), (375,), (125,)) # 지도 학습 하기 from sklearn.linear_model import LogisticRegression logisticReg = LogisticRegression(max_iter=5000) # 기본 반복 100 logisticReg.fit(x_train, y_train) # 추정하기 pred = logisticReg.predict(X) # 결정계수 logisticReg.score(x_test, y_test) # 0.92 # 한글 깨짐 없이 나오게 설정 from matplotlib import rcParams # 인코딩 폰트 설정 rcParams['font.family'] = 'New Gulim' rcParams['font.size'] = 10 # 산점도 plt.figure(figsize=(10,4)) plt.subplot(1,2, 1) plt.scatter(X[:,0],X[:,1],c=y) plt.title('정답') plt.su...

Python 문법

제곱 c = c**2; 주석 # 주석 함수 # 함수 형식 def hello(): # 함수 선언     print("여기는 함수") # 함수 실행문 hello() # 함수 호출 #결과: 여기는 함수 def add(a,b): # 매개변수에 자료형이 필요없다     c = a+b     print(f"{a} + {b} = {c}") add(3,5) #결과 : 3 + 5 = 8 if문 if a > b:     print("a가 큽니다") 객체의 정보 dir(객체) 객체의 주소 id(객체) 생략 if 'a' == 'a':     pass # 생략 else:     pass # 생략 enumerate for i,v in enumerate(range(20, 26)):     print(i,v) display display(df)