#기본설정. 다음부터 그냥 이거 복사붙여넣기해서
#Anaconda에 크롬 드라이버 자동으로 다운받는 webdriver-manager 설치.
# 관련 모듈들 import
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from webdriver_manager.chrome import ChromeDriverManager
#브라우저 꺼짐 방지
chrome_options = Options()
chrome_options.add_experimental_option("detach", True)
#불필요한 에러 메시지 없애기
chrome_options.add_experimental_option("excludeSwitches", ["enable-logging"]) #셀레니움 로그 무시
pip install webdriver-managerOptions(): 위에서 불러온 Options 클래스의 객체를 생성한다. Options.add_experimental_option(): Options클래스의 메서드로, Options 객체에 옵션을 추가한다. 첫 번째 인자는 옵션 이름을 나타내는 문자열, 두 번째 인자는 그 옵션에 대한 값이다. ('detach', True): 스크립트 실행 후에도 브라우저 창이 열린 상태로 유지된다. ("excludeSwitches", ["enable-logging"]): 여기서 excludeSwitches는 전달되는 커맨드라인스위치를 제외시킨다. ['enable-logging']은, 로깅을 활성화하는 것이기 때문에, 이걸 제외시키므로 ChromeDriver가 기본적으로 활성화하는 로깅을 비활성화한다. 즉, 에러 메시지가 안뜨게 한다. #Options 객체는 위의 설정에서 만들어놨다
#Service 객체 만들기
service = Service(executable_path=ChromeDriverManager().install())
#webdriver 객체 만들면서, 만들었던 Options, Service 객체 전달
driver = webdriver.Chrome(service=service, options=chrome_options)
executable_path=: webdriver(여기선 ChromeDriver)의 파일 경로를 지정하는 매개변수. default는 None. ChromeDriverManager().install(): ChromeDriverManager() 객체의 install 메서드. 이 메서드 호출하면, 적합한 ChromeDriver 찾아서 자동으로 다운로드하고, 설치 경로를 return한다. 즉, ChromeDriverManager 객체가 자동으로 경로 설정한 것을 명시한 것.webdriver.Chrome(): 그냥 webdriver 모듈의 Chrome 클래스 객체를 생성하는 것. 여기서 service, options를 각자 매개변수로 받고, 위에서 만들어놓은 service, chrome_options를 집어넣는다. driver.get('url'): webdriver 클래스 메서드. 자동화 브라우저가 해당 url로 이동driver.current_url: webdriver 클래스의 속성. 현재 url return된다. driver.close(): webdriver 클래스 메서드. 해당 브라우저 끈다. 부하 안걸리게 작업 끝나면 반드시 쓴다. WebElement.send_keys('문자열'): find_element 등으로 반환된 webelement 객체의 메서드로, send_keys로 타이핑한 글자를 칠 수 있다. WebElement.click(): 클릭driver.switch_to.~(): selenium webdriver에서 현재 작업 중인 웹 페이지 내의 특정 요소로 포커스를 전환할 수 있다.switch_to.frame('frame_ex1'): <frame> 혹은 <iframe>태그에 포커스를 맞춘다. switch_to.default_content(): 최상위 레벨 문서로 포커스를 되돌린다. 즉, 기존의 페이지로 포커스를 다시 바꾼다. switch_to.parent_frame(): 현재 프레임에서 부모 프레임으로. switch_to.alert: 웹 페이지에 발생한 알림, 확인, 프롬프트 대화 상자와 상호작용하기 위한 메서드. switch_to.active_element: 현재 활성화된 요소의 참조를 반환. 예를 들어, 사용자가 텍스트 필드에 입력을 시작했을 때, 해당 텍스트 필드 요소를 찾는데 사용 가능. switch_to.window: 지정된 윈도우나 탭으로 포커스 전환. <frame name='frame_ex1'> 처럼 되어 있을 것.driver.find_element(By.ID, 'frame_ex1')로 프레임요소 찾은 후, 이 요소를 switch_to.frame()의 인자에 넣으면 같은 결과. driver.get('https://www.naver.com')
#개발자 도구로 네이버 메인 화명에서 검색창 HTML을 보면 ID가 query다
input_tag = driver.find_element(By.CSS_SELECTOR, '#query')
input_tag.send_keys('방탄소년단')
#엔터 치는 작업
input_tag.send_keys('\n')
driver.implicitly_wait(3)
driver.page_source: webdriver가 로드한 웹 페이지의 전체 HTML 소스를 문자열 형태로 반환하는 속성. BeautifulSoup(html, 'html.parser'): html 문자열 객체를 받아서, BeautifulSoup 객체로 바꾼다. 이를 파싱이라 한다. BeautifulSoup 객체는 Python의 복잡한 HTML/XML 문서를 파싱하고, 그걸 탐색하기 위한 다양한 메서드랑 속성을 제공한다. html.parser은 BeautifulSoup에서 사용되는 파싱 방식을 지정하는 인자. html.parser은 Python 표준 라이브러리에 내장된 HTML 파서. 보다 빠른 파싱이나 복잡한 HTML 문서 처리하려면, lxml, html5lib 같은 외부 파서 선택할 수도 있다. #위에 설정 다 마쳤다 가정하고 driver 객체 생성했다
service = Service(executable_path=ChromeDriverManager().install())
driver = webdriver.Chrome(service=service, options=chrome_options)
# 원하는 페이지 url 저장해서 이동
url = 'https://finance.naver.com/marketindex/'
driver.get(url)
#파싱
from bs4 import BeautifulSoup
html = driver.page_source
soup = BeautifulSoup(html, 'html.parser')
#종료
driver.close()
.find(): BeautifulSoup 객체, Tag 객체에 사용 가능. 특정 조건에 맞는 단일 요소를 찾아서, 첫 번째로 찾아진 요소를 반환. .select(선택자) : BeautifulSoup 객체, Tag 객체에 사용 가능. CSS 선택자를 매개변수로 받아 해당 선택자와 일치하는 모든 요소를 찾아 리스트 형태로 반환. 타입은 bs4.element.ResultSet인데, 리스트처럼 작용한다. 안의 요소들의 타입은 bs4.element.Tag.tag_list = soup.select('body p')
for tag in tag_list:
print(tag.text)
driver.close()
#네이버 금융 웹 페이지로 이동하기
driver = webdriver.Chrome(options=chrome_options)
url = 'https://finance.naver.com/marketindex/'
driver.get(url)
#환율 정보 프레임으로 변환
driver.switch_to.frame('frame_ex1')
#파싱
html = driver.page_source
soup = BeautifulSoup(html, 'html.parser')
#저장할 빈 리스트 선언
result = []
#select로 접근
currencys = soup.select('body > div > table > tbody > tr')
#select로 뽑은 내용 추출
for data in currencys:
country = data.select('td.tit > a')[0].text.strip()
exchange = data.select('td.sale')[0].text
result.append([country, exchange])
#pandas로 csv로
import pandas as pd
df = pd.DataFrame(result, columns = ['통화명', '환율'])
df.to_csv('../data/환율정보.csv', encoding = 'cp949', header = True, index=False)
from selenium.webdriver.common.by import Bydriver.find_element(By.CSS_SELECTOR, '#query') 이것은 사실상 By.ID, header와 같은 뜻. #가 ID, .이 class 나타내므로. 다양하게 접근할 수 있어서 별도로 있는 듯? find_element(선택자 지정, '문자열'): webdriver혹은 webelement에 사용 가능한 메서드로, webelement를 반환한다. 지정한 선택자에 해당하는 첫 번째 요소를 찾아 반환. 일치 요소 없으면 NoSuchElementException 예외 발생. find_elements(선택자 지정, '문자열'): webdriver혹은 webelement에 사용 가능한 메서드로, webelement로 구성된 리스트를 반환한다. 지정한 선택자에 해당하는 첫 번째 요소를 찾아 반환. 없으면 빈 리스트 반환. .get_attribute(): webelement 클레스에 대해 사용. HTML의 특정 요소에 설정된 속성값을 조회하는 메서드. string으로 반환#드라이버 객체 생성 및 실행
driver = webdriver.Chrome(service=service, options=chrome_options)
#구별 주유소 가격 사이트로 이동
driver.get('https://www.opinet.co.kr/searRgSelect.do')
#By 모듈 임포트
from selenium.webdriver.common.by import By
#개발자도구에서 원하는 부분 우클릭 - copy sellector하니까 SIDO_NM0
sido_list_raw = driver.find_element(By.ID, 'SIDO_NM0')
#마찬가지로 <option value='서울특별시'>로 되어 있었음.
sido_list = sido_list_raw.find_elements(By.TAG_NAME, 'option')
#option 중 [0]은 쓸데없는 정보 들어있어서 1로
sido_list[1].get_attribute('value') #서울특별시
find_element(선택자 지정, '문자열'): webdriver혹은 webelement에 사용 가능한 메서드로, webelement를 반환한다. 지정한 선택자에 해당하는 첫 번째 요소를 찾아 반환. 일치 요소 없으면 NoSuchElementException 예외 발생. find_elements(선택자 지정, '문자열'): webdriver혹은 webelement에 사용 가능한 메서드로, webelement로 구성된 리스트를 반환한다. 지정한 선택자에 해당하는 첫 번째 요소를 찾아 반환. 없으면 빈 리스트 반환. .get_attribute(): webelement 클레스에 대해 사용. HTML의 특정 요소에 설정된 속성값을 조회하는 메서드. string으로 반환. <option value='서울특별시'>로 되어 있었던 게, '서울특별시'가 나옴. #시, 도 정보 들고오기
sido_names = [option.get_attribute('value') for option in sido_list]
sido_names = sido_names[1:]
# 시, 군, 구 정보
gu_list_raw = driver.find_element(By.ID, 'SIGUNGU_NM0')
gu_list = gu_list_raw.find_elements(By.TAG_NAME, 'option')
gu_names = [option.get_attribute('value') for option in gu_list]
gu_names.remove('')

pip install tqdmimport time
from tqdm import tqdm_notebook
for gu in tqdm_notebook(gu_names):
element = driver.find_element(By.ID, 'SIGUNGU_NM0')
element.send_keys(gu)
time.sleep(3)
element_get_excel = driver.find_element(By.ID, 'glopopd_excel').click()
time.sleep(2)




import pandas as pd
from glob import glob
#파일 이름이 지역_위치별~
stations_files = glob('../data/지역_위치별*xls')
#파일 이름 들고온 걸 리스트로 돌면서, read_excel에 넣는다
#header=2는 3번째 행을 열 이름으로 사용하고, 1, 2행은 무시
#그리고 그 각각의 리스트를 묶어서 리스트에 다시 넣는다
tmp_raw = []
for file_name in stations_files:
tmp = pd.read_excel(file_name, header=2)
tmp_raw.append(tmp)
#concat하면 각각 리스트로 묶인 걸 하나로
station_raw = pd.concat(tmp_raw)
#필요한 행만 뽑아서 데이터프레임으로
stations = pd.DataFrame({'Oil_store':station_raw['상호'],
'주소':station_raw['주소'],
'가격':station_raw['휘발유'],
'셀프':station_raw['셀프여부'],
'상표':station_raw['상표']})
#내부 확인하고 오류값들 정제
#정제, 시각화
service = Service(executable_path=ChromeDriverManager().install())
driver = webdriver.Chrome(service=service, options=chrome_options)
driver.get('https://www.kopia.or.kr/info/statistics.php')
html = driver.page_source
soup = BeautifulSoup(html, 'html.parser')
#head 들고와서 칼럼명 리스트 만들기
th_raw = soup.select('tbody th')
col = []
for i in th_raw:
col.append(i.text)
#행별로 들고와서 추출
tr_raw = soup.select('tbody tr')
tr = []
for i in tr_raw:
td = i.select('td')
temp = []
for j in td:
temp.append(j.text)
tr.append(temp)
#빈행 자르기
tr = tr[1:]
#pandas로 데이터프레임화 => 저장
import pandas as pd
df = pd.DataFrame(tr, columns=col)
df.to_excel('../data/수주실적.xlsx', index=False)
import pandas as pd
html = 'http://kopia.or.kr/info/statistics.php'
#pandas에서 read_html이라고, html에서 table만 찾아서 제공하는 기능.
#2개 이상이면 0, 1 이렇게 나온다
df1 = pd.read_html(html)
df1[0].to_excel('../data/kopia.xlsx')
df1[0]
driver.save_screenshot('../images/001.png'): selenium 브라우저 스크린샷으로 저장driver.implicitly_wait(3): 요소를 찾기 위해 최대 3초간 webdriver가 대기하도록 설정. 이 시간동안 요소가 나타나면 다음 코드로 진행, 못찾으면 NoSuchElementException을 발생