728x90
1. 크롬드라이버 설치
먼저 아래사이트에서 크롬 버전에 맞는 크롬드라이버를 설치합니다
Chrome for Testing availability (googlechromelabs.github.io)
설치하시면 크롬드라이버 exe파일을 작업중인 파이썬 폴더안에 넣어줍니다.
2. 데이터 추출
1) 셀레니움만으로 추출
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver import ActionChains
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
import time
# 모바일에서 접속한 것처럼 보이게 하기
user_agent="Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1"
options = Options()
options.add_experimental_option("detach",True) # 화면이 안꺼지는 옵션
options.add_argument("--start-maximized")
options.add_argument(f"user-agent={user_agent}")
service = Service(ChromeDriverManager().install()) #크롬 드라이버를 자동설치하는 서비스를 만듬
driver = webdriver.Chrome(service=service,options=options)
url = "https://m2.melon.com/index.htm"
driver.get(url)
time.sleep(2)
if driver.current_url != url:
driver.get(url)
time.sleep(2)
driver.find_element(By.LINK_TEXT,"멜론차트").click()
time.sleep(2)
driver.find_elements(By.CSS_SELECTOR,"#moreBtn")[1].click() # 더보기 버튼 클릭
time.sleep(2)
#### 방법1 #####
chart_list = driver.find_element(By.ID,"_chartList")
items = chart_list.find_elements(By.CSS_SELECTOR,".list_item")
action =ActionChains(driver) # driver에서 액션체인을 사용한다는 의미
action.move_to_element(items[90]).perform() # 원하는 요소가 있는 곳으로 이동 -> 마지막에 perform이 있어야 작동함
for rank,item in enumerate(items[:10],1):
action.move_to_element(item).perform()
title = item.find_element(By.CSS_SELECTOR, ".title.ellipsis")
name = item.find_element(By.CSS_SELECTOR, ".name.ellipsis")
thumb = item.find_element(By.CSS_SELECTOR, ".inner > span")
thumb.click()
time.sleep(1)
print(f"album_url : {driver.current_url}")
driver.back()
time.sleep(1)
print(f"<<<{rank}>>>")
print(title.text)
print(name.text)
print()
time.sleep(1)
# #### 방법2(상위 태그가 없는 경우) ###
# items2 = driver.find_elements(By.CSS_SELECTOR,".list_item")
#
# for item in items2[:]:
# try:
# ranking_num = item.find_element(By.CLASS_NAME,"ranking_num")
# except NoSuchElementException:
# print("랭크가 없어서 삭제합니다.")
# items2.remove(item)
# driver.quit()
2) BeautifulSoup와 셀레니움으로 데이터 추출
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
import time
options = Options()
options.add_experimental_option("detach",True) # 화면이 안꺼지는 옵션
driver = webdriver.Chrome(options=options)
url = "https://www.naver.com/"
driver.get(url)
time.sleep(1)
driver.find_element(By.ID,"query").send_keys("뉴진스")
time.sleep(1)
driver.find_element(By.CSS_SELECTOR,".btn_search").click() #CSS_SELECTOR는 id,class 다 찾아준다.대신 id는 앞에 #을 붙이고 class는 앞에 .을 붙인다.
time.sleep(1)
# driver.find_elements(By.CLASS_NAME,"menu")[2].click() # 클래스이름이 menu인 것들 중 두번째를 찾아 클릭한다.
# time.sleep(2)
driver.find_element(By.XPATH,'//*[text()="VIEW"]').click()
# //*의 의미는 하위에 있는 모든 것이라는 의미 -> //*[text()="VIEW"]는 하위에 있는 모든 것에서 text가 VIEW인것을 찾아라
time.sleep(1)
driver.find_element(By.NAME,"query").clear() # 검색어를 제거
time.sleep(1)
driver.find_element(By.NAME,"query").send_keys("에스파") # 검색어에 에스파를 입력
time.sleep(1)
driver.find_element(By.NAME,"query").send_keys(Keys.ENTER) # 엔터입력
time.sleep(1)
driver.execute_script("window.scrollTo(0,document.body.scrollHeight)") # 0에서 스크롤 끝까지 내려준다
driver.find_element(By.TAG_NAME,"body").send_keys(Keys.PAGE_DOWN) #스크롤을 내린다.
for i in range(10):
driver.find_element(By.TAG_NAME, "body").send_keys(Keys.END) # PAGE_DOWN보다 더 내려감
time.sleep(1)
# selenium과 BeautifulSoup 혼용
html = driver.page_source
soup = BeautifulSoup(html,"html.parser") # html을 html_parser로 분석한다
total_area = soup.select(".total_area")
timeline_area = soup.select(".timeline_area")
if total_area:
areas = total_area
elif timeline_area:
areas = timeline_area
else:
print("확인요망")
rank_num =1
for area in areas:
ad = area.select_one(".link_ad") # 광고요소 하나를 찾는다
if ad:
print("광고")
continue
print(f"<<{rank_num}>>")
title = area.select_one(".api_txt_lines.total_tit") # select_one은 하나만 가져오는 것
name = area.select_one(".sub_txt.sub_name")
print(name.text)
print(title.text)
print(title['href'])
print()
rank_num +=1
print(len(areas))
driver.quit() # 셀레니움 종료
예제2)
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
import time
options = Options()
options.add_experimental_option("detach",True) # 화면이 안꺼지는 옵션
driver = webdriver.Chrome(options=options)
url = "https://www.naver.com/"
driver.get(url)
time.sleep(1)
# # title이 '검색어를 입력해 주세요.'인 요소를 찾아 '뉴진스'를 입력한 후 엔터를 친다
# driver.find_element(By.XPATH,"//*[@title='검색어를 입력해 주세요.']").send_keys("뉴진스",Keys.ENTER)
# time.sleep(1)
# driver.find_element(By.LINK_TEXT,"VIEW").click() # VIEW라는 글자를 찾아 클릭한다.
# time.sleep(1)
#
# driver.find_element(By.PARTIAL_LINK_TEXT,"인플루언").click() # 인플루언이 포함된 글자를 찾아 클릭한다.
items = driver.find_elements(By.CLASS_NAME,"link_service")
# print(items)
# print()
# print(dir(items[0]))
# print()
# print(len(items))
for num, item in enumerate(items,1):
# print(num)
# print(item.get_attribute("outerHTML"))
# print(item.text)
# print()
if item.text == "쇼핑":
item.click()
break
driver.quit()
3. 크롬드라이버 자동 설치(크롬 버전을 맞출 필요없음)
1) 크롬드라이버 자동설치
아래 명령어를 콘솔에 입력하여 webdriver를 설치합니다.
pip install webdriver-manager
아래의 코드를 작성합니다.
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
import time
service = Service(ChromeDriverManager().install()) #크롬 드라이버를 자동설치하는 서비스를 만듬
driver = webdriver.Chrome(service=service)
이러면 자동설치는 끝입니다.
2) 크롬드라이버 완전 자동화(selenium 4.6이상)
콘솔에 아래 명령어를 입력하여 본인의 selenium 버전을 확인합니다.
pip list
만약에 버전이 4.6이하라면 아래명령어를 입력하여 업그레이드를 합니다.
pip install --upgrade selenium
일반 크롬드라이버를 설치했을 때 처럼 아래코드만 입력하고 사용하시면 됩니다.
from selenium import webdriver
import time
driver = webdriver.Chrome()
4. 팝업창, iframe 접근방법
1) 팝업창 접근방법
1] 팝업창이 한개만 열릴 경우
windows = driver.window_handles // window_handles() 아님
driver.switch_to.window(windows[1]) # 현재 위치는 인덱스가 0
# 팝업창에서 작업 수행
driver.switch_to.window(windows[0]) # 메인화면으로 이동
2] 팝업창이 여러개일 경우
windows = driver.window_handles // window_handles() 아님
for index in range(len(windows)-1): #메인화면을 제외하면 모든 팝업창을 순회
driver.switch_to.window(windows[index+1])
try:
# 특정 팝업창에서 작업 수행
except:
#예외가 발생할 경우 팝업창 닫기
driver.close()
# 메인화면으로 이동
driver.switch_to.window(windows[0])
2) iframe 접근방법
iframe1 = driver.find_element(By.ID,"iframe_id")
# iframe 이동
driver.switch_to.frame(iframe1)
# iframe에서 작업 수행
# 메인화면으로 이동
driver.switch_to.default_content()
'PYTHON Programming > Python' 카테고리의 다른 글
[python] 엑셀 자동화(openpyxl) (0) | 2024.05.22 |
---|---|
[python] selenium 웹 드라이버 옵션 추가 (0) | 2024.05.22 |
[python] 웹 크롤링(beautifulsoup) (1) | 2024.05.21 |
[python] 설치된 패키지 목록 생성과 requirements.txt 속 패키지 설치 (0) | 2024.05.21 |
[python] 외장함수 (0) | 2024.05.21 |