[패스트캠퍼스] 데이터 분석 부트캠프 16기 4주차 - Python의 Selenium을 활용한 데이터 크롤링

2024. 9. 13. 18:40·데이터 분석 부트캠프/주간학습일지

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
'데이터 분석 부트캠프/주간학습일지' 카테고리의 다른 글
  • [패스트캠퍼스] 데이터 분석 부트캠프 16기 8주차 - SQL 기본 이론
  • [패스트캠퍼스] 데이터 분석 부트캠프 16기 5주차 - Python을 활용한 데이터 시각화 (NumPy / Pandas / MatPlotLib / Seaborn)
  • [패스트캠퍼스] 데이터 분석 부트캠프 16기 3주차 - Python 제어문/예외처리/함수/변수/클래스
  • [패스트캠퍼스] 데이터 분석 부트캠프 16기 3주차 - Python 자료형
MaxH
MaxH
Development and Analysis log by Max H
  • MaxH
    Max’s analog
    MaxH
  • 전체
    오늘
    어제
    • 분류 전체보기 (24)
      • 데이터 분석 부트캠프 (19)
        • 주간학습일지 (11)
        • 회고록 (8)
      • Python (2)
      • SQL (2)
      • AWS (1)
  • 링크

    • GitHub (@missiletoe)
    • LinkedIn (Yong Suk Heo)
  • 인기 글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
MaxH
[패스트캠퍼스] 데이터 분석 부트캠프 16기 4주차 - Python의 Selenium을 활용한 데이터 크롤링
상단으로

티스토리툴바