본문 바로가기

코린이_탈출/크롤링

[모각코_크롤링] 동적 크롤링 5

[공부 내용]

>여러개 탭 다루기

-  driver.window_handles : 열린 탭 목록

len(driver.window_handles) : 열린 탭의 개수
driver.window_handles[0] : 첫번째 탭
driver.window_handles[1] : 두번째 탭
driver.window_handles[n] : 마지막 탭 = driver.window_handles[-1]

-  driver.switch_to.window() : 작업할 탭을 바꿔준다

# 기본 코드
driver.switch_to.window(작업할 탭)

# 1. 새로운 탭이 켜짐
새로운 탭 등장!

# 2. 'driver' 변수를 새로운 탭으로 전환
driver.switch_to.window(driver.window_handles[-1])

# 3. 새로운 탭에서 작업
클릭, 값 입력, 내용 수집 등의 작업 수행

# 4. 작업을 마치면 새로운 탭을 닫음
driver.close()

# 5. 다시 처음 탭으로 전환
driver.switch_to.window(driver.window_handles[0])

from selenium import webdriver
import time

#뉴스 검색 키워드 입력
keyword = input("뉴스 검색 키워드 : ")

#뉴스 기사 게시판 접속
driver = webdriver.Chrome('./chromedriver')
news_url = 'https://search.hankyung.com/apps.frm/search.news?query=' + keyword + '&mediaid_clust=HKPAPER,HKCOM'
driver.get(news_url)

time.sleep(2)

#뉴스 기사 제목 10개를 나타내는 태그 저장> em.tit 태그 10개를 찾아줘야 하기 때문에 find_elements 사용
ten_articles = driver.find_elements_by_css_selector('em.tit')


### 탭 전환, 본문 출력, 크롬 창 닫기
#뉴스마다 번호를 붙여주기 위한 변수
cnt = 0

# 10개 뉴스 기사를 대상으로 반복문
for article in ten_articles:

    #'article'은 뉴스 기사 제목을 나타내는 HTML 요소. .text는 제목
    title = article.text

    #'article'은 HTML 요소이므로 클릭하면 뉴스 기사 본문을 확인 할 수 있음
    article.click()

    time.sleep(1)

    #'driver'를 새로운 탭 (뉴스 기사 본문창)으로 전환
    driver.switch_to_window(driver.window_handles[-1])

    #기사 본문을 'content' 변수에 저장 > id: artilcletxt
    content = driver.find_element_by_id('articletxt').text

    #'content'를 '\n' 단위로 나누어 'seperate' 변수에 저장
    seperate = content.split('\n')

    #기사 본문 출력
    cnt += 1
    print(f'<{cnt}번 뉴스 - {title}>')

    ## 본문 깔끔하게 출력
    for sep in seperate:
        #아무 것도 없는 공백 ('')이 포함되어 있기 때문에, 이런 공백은 출력하지 않음
        if sep != '':
            # print(값, end = ??)를 활용하여 모든 sep 사이에 공백 한 칸 (' ')을 삽입하여 출력
            print(sep, end = ' ')
    # 하나의 본문 내용을 출력하고 나면 줄 간격을 한 줄 넣어줌
    print('\n')

    #새로운 탭(뉴스 기사 본문창)에서는 작업을 다 했으므로 창 닫기
    driver.close()

    #다시 원래 탭(뉴스 기사 정렬되어 있는)으로 전환
    driver.switch_to_window(driver.window_handles[0])

    time.sleep(1)

driver.close()  #작업완료 후 크롬 창 닫기