Selenium
- Selenium Version :
4.24.0
설치
- pip를 통한 selenium과 webdriver-manager 설치는 한번만
pip install selenium
pip install webdriver-manager # webdriver 버전 관리 툴
- webdriver-manager로 ChromeDriver 설치
- Chrome과 ChromeDriver는 별개
from webdriver_manager.chrome import ChromeDriverManager
ChromeDriverManager().install()
옵션값 설정
from selenium import webdriver
options = webdriver.ChromeOptions()
options.add_argument('--headless') # Headless 설정
options.add_argument('--no-sandbox')
options.add_argument('--disable-dev-shm-usage')
driver = webdriver.Chrome(options=options) # 브라우저 열기
url = 'https://new.land.naver.com/complexes/142155' # 원베일리
driver.get(url)
driver.title # 제대로 접속됐는지 웹페이지 이름 출력으로 테스트
# '네이버페이 부동산'
WebDriver의 By 사용법
# 원베일리 호가 조회
from selenium.webdriver.common.by import By
priceList = driver.find_elements(By.CLASS_NAME,'price_line')
for p in priceList:
print(p.text)
# 매매80억
# 월세50억/1,200
# 전세75억
# 전세75억
# 월세50억/1,000
# 월세15억/520
# 전세75억
# 월세50억/1,200
# 월세50억/1,200
# 전세75억
# 전세75억
# 월세50억/1,200
# 전세75억
# 매매70억
# 매매72억
# 전세42억 8,000
# 매매70억
# 전세50억
# 매매98억
# 매매65억
# 원베일리 동/평수/층별 호가 조회
containers = driver.find_elements(By.CLASS_NAME,'item')
for container in containers:
dong_info = container.find_element(By.CLASS_NAME,'item_title').text
dong_price = container.find_element(By.CLASS_NAME,'price_line').text
dong_info_detail = container.find_element(By.CLASS_NAME, 'info_area').text
print(dong_info,'\n',dong_price,'\n',dong_info_detail,'\n\n')
# 래미안원베일리 106동
# 매매80억
# 아파트175C/133m², 29/35층, 남서향
# 53 주인직접 프리미엄급 입주가능 여의도한강뷰 관악산 막힘 없는집
#
#
# 래미안원베일리 106동
# 월세50억/1,200
# 아파트315C/234m², 35/35층, 북동향
# 95 펜트 ,럭셔리 귀한전세 최상급 테라스 한강및시티뷰,
#
#
# 래미안원베일리 106동
# 전세75억
# 아파트315C/234m², 35/35층, 북동향
# 95 펜트 ,럭셔리 귀한전세 최상급 테라스 한강및시티뷰,
#
#
# 래미안원베일리 106동
# 전세75억
# 아파트315C/234m², 35/35층, 남서향
# 특급펜트, 환상적인 파노라마뷰, 첫입주를 기다립니다.
#
#
# 래미안원베일리 106동
# 월세50억/1,000
# 아파트315C/234m², 35/35층, 남서향
# 특급펜트, 환상적인 파노라마뷰, 첫입주를 기다립니다.
#
#
# ...
# 원베일리 동/평수/층별 호가 정보를 리스트에 추가
containers = driver.find_elements(By.CLASS_NAME,'item')
data = []
for container in containers:
dong_info = container.find_element(By.CLASS_NAME,'item_title').text
dong_price = container.find_element(By.CLASS_NAME,'price_line').text
dong_info_detail = container.find_element(By.CLASS_NAME, 'info_area').text
data.append({
'동정보': dong_info,
'가격': dong_price,
'매물정보': dong_info_detail
})
실습 1. 구글 뉴스 크롤링
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
import pandas as pd
options = webdriver.ChromeOptions()
options.add_argument('--headless')
options.add_argument('--no-sandbox')
options.add_argument('--disable-dev-shm-usage')
driver = webdriver.Chrome(options=options)
url = 'https://www.google.com/search?newwindow=1&sca_esv=3c6029be58720811&sxsrf=ADLYWIIrnLRmoOXLyDKEcYa34-m6UyL7LQ:1725848117581&q=%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B6%84%EC%84%9D&tbm=nws&source=lnms&fbs=AEQNm0Aa4sjWe7Rqy32pFwRj0UkWd8nbOJfsBGGB5IQQO6L3J5MIFhvnvU242yFxzEEp3BekApeLFCP-yt1rlLqzmhw_-yjmy56-jU7vCqheuFOLmQRfAB99cxHld5c98wjVFx7BCmPA-rBzXjSG7_4up546CKY7pVCkxPqE2M1NcxbOCiVLDNhBj2ZKL7YJ8IiFHgkiUqDp&sa=X&ved=2ahUKEwiPhvCf5bSIAxUhdfUHHWDsC9UQ0pQJegQIFBAB&biw=1720&bih=995&dpr=2'
driver.get(url)
첫번째 뉴스의 (1) 제목 (2) 내용 (3) 언론사 (4) 작성시간 (5) 링크
title = driver.find_element(By.CLASS_NAME,'n0jPhd').text
content = driver.find_element(By.CLASS_NAME,'GI74Re').text
publisher = driver.find_element(By.CLASS_NAME,'MgUUmf').text
date_posted = driver.find_element(By.CLASS_NAME,'LfVVr').text
link = driver.find_element(By.CLASS_NAME,'WlydOe').get_attribute('href')
print('제목: ',title)
print('내용: ',content)
print('언론사: ',publisher)
print('작성기간: ',date_posted)
print('링크: ',link)
1페이지의 전체 뉴스 (1) 제목 (2) 내용 (3) 언론사 (4) 작성시간 (5) 링크
search_results = driver.find_elements(By.CLASS_NAME,'SoaBEf')
data = []
for i in search_results:
title = i.find_element(By.CLASS_NAME,'n0jPhd').text
content = i.find_element(By.CLASS_NAME,'GI74Re').text
publisher = i.find_element(By.CLASS_NAME,'MgUUmf').text
date_posted = i.find_element(By.CLASS_NAME,'LfVVr').text
link = i.find_element(By.CLASS_NAME,'WlydOe').get_attribute('href')
data.append({
'제목' : title,
'내용' : content,
'언론사' : publisher,
'작성시간' : date_posted,
'링크' : link
})
tables = pd.DataFrame(data) # Pandas의 DataFrame을 이용하여 tables에 data 추가
tables.to_csv('\'데이터분석\' 구글뉴스 검색결과.csv') # csv 파일로 추출
30페이지까지의 전체 뉴스 데이터 수집
# method 1
# next 버튼을 클릭해서 list에 key와 value 추가
data = []
def appendData(data):
search_results = driver.find_elements(By.CLASS_NAME,'SoaBEf')
for i in search_results:
title = i.find_element(By.CLASS_NAME,'n0jPhd').text
content = i.find_element(By.CLASS_NAME,'GI74Re').text
publisher = i.find_element(By.CLASS_NAME,'MgUUmf').text
date_posted = i.find_element(By.CLASS_NAME,'LfVVr').text
link = i.find_element(By.CLASS_NAME,'WlydOe').get_attribute('href')
data.append({
'제목' : title,
'내용' : content,
'언론사' : publisher,
'작성시간' : date_posted,
'링크' : link
})
driver.find_element(By.ID, 'pnnext').click()
time.sleep(1)
for a in range(29):
appendData(data)
tables = pd.DataFrame(data) # Pandas의 DataFrame을 이용하여 tables에 data 추가
tables.to_csv('\'데이터분석\' 구글뉴스 검색결과.csv') # csv 파일로 추출
# method 2
# url의 start parameter를 변경해서 list에 key와 value 추가
data = []
for i in range(0,290,10):
url = f'https://www.google.com/search?q=%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B6%84%EC%84%9D&sca_esv=449428b1edf18ef7&rlz=1C5CHFA_enKR1074KR1074&tbm=nws&ei=IYfeZtPlKYe3vr0P1c-i0As&start={i}&sa=N&ved=2ahUKEwiT-saLkLWIAxWHm68BHdWnCLo4ChDy0wN6BAgCEAQ&biw=1200&bih=896&dpr=2'
driver.get(url)
search_results = driver.find_elements(By.CLASS_NAME,'SoaBEf')
for i in search_results:
title = i.find_element(By.CLASS_NAME,'n0jPhd').text
content = i.find_element(By.CLASS_NAME,'GI74Re').text
publisher = i.find_element(By.CLASS_NAME,'MgUUmf').text
date_posted = i.find_element(By.CLASS_NAME,'LfVVr').text
link = i.find_element(By.CLASS_NAME,'WlydOe').get_attribute('href')
data.append({
'제목' : title,
'내용' : content,
'언론사' : publisher,
'작성시간' : date_posted,
'링크' : link
})
time.sleep(1)
tables = pd.DataFrame(data)
tables.to_csv('\'데이터분석\' 구글뉴스 검색결과.csv')
실습 2. DBPIA 논문 크롤링
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
import pandas as pd
options = webdriver.ChromeOptions()
options.add_argument('--headless')
options.add_argument('--window-size=1920,1080')
options.add_argument('--no-sandbox')
options.add_argument('--disable-dev-shm-usage')
driver = webdriver.Chrome(options=options)
# 검색 키워드를 입력받아 url 연결
keyword = input('검색하고자 하는 논문의 주제를 입력하세요 : ')
url = f'https://www.dbpia.co.kr/search/topSearch?searchOption=all&query={keyword}'
driver.get(url)
# 정렬 방식에서 100개씩 보기로 전환 (ViewPort가 mobile size일때 에러)
driver.find_element(By.CLASS_NAME, 'thesisAll__selectWrap').click()
driver.find_element(By.ID,'get100PerPage').click()
time.sleep(2) # 웹페이지 렌더링 대기
# list에 value 추가
link_list = []
# 하단의 다음 10페이지로 넘어가는 숫자 클릭
for i in range(2,12): # list에 url을 100개씩 10번 저장
links = driver.find_elements(By.CLASS_NAME, 'thesis__link')
for l in links:
link_list.append(l.get_attribute('href'))
if i < 11: # 페이지 번호에 따라 XPath가 바뀌는 패턴, 10페이지까지만 조회 (검색결과가 900개 이하일 때 에러)
xpath = f'//*[@id="pageList"]/a[{i}]'
driver.find_element(By.XPATH, xpath).click()
time.sleep(2)
# list에 key와 value 추가를 links_list번 반복
data = []
for link in link_list:
driver.get(link)
thesisTitle = driver.find_element(By.CLASS_NAME,'thesisDetail__tit').text
thesisAuthor = driver.find_element(By.CLASS_NAME, 'authorList').text
useCount = driver.find_element(By.ID,'showUsageChartButton').text
try:
abstract = driver.find_element(By.CLASS_NAME,'abstractTxt').text
except: # 초록이 없을 경우 에러 처리 방법
abstract = ''
data.append({
'제목': thesisTitle,
'저자': thesisAuthor,
'이용수': useCount,
'초록': abstract
})
print(f'{len(data)}개 추가 완료')
time.sleep(0.5)
tables = pd.DataFrame(data) # Pandas의 DataFrame을 이용하여 tables에 data 추가
tables.to_csv(f'DBPIA - {keyword}.csv') # csv 파일로 추출
'데이터 분석 부트캠프 > 주간학습일지' 카테고리의 다른 글
[패스트캠퍼스] 데이터 분석 부트캠프 16기 8주차 - SQL 기본 이론 (3) | 2024.10.11 |
---|---|
[패스트캠퍼스] 데이터 분석 부트캠프 16기 5주차 - Python을 활용한 데이터 시각화 (NumPy / Pandas / MatPlotLib / Seaborn) (3) | 2024.09.20 |
[패스트캠퍼스] 데이터 분석 부트캠프 16기 3주차 - Python 제어문/예외처리/함수/변수/클래스 (7) | 2024.09.05 |
[패스트캠퍼스] 데이터 분석 부트캠프 16기 3주차 - Python 자료형 (1) | 2024.09.03 |
[패스트캠퍼스] 데이터 분석 부트캠프 16기 2주차 - 기초수학/통계 (3) | 2024.08.30 |