본문 바로가기
데이터 관련/크롤링

구글 뉴스기사 크롤링 (Selenium 문법 변경)

by 준쓰_ 2023. 12. 31.

구글 뉴스기사 크롤링

[목차]
1. 셀레니움 및 구글 변경사항 
2. 크롤링 코드

 

1. 셀레니움 및 구글 변경사항 

최근 크롤링할 일이 있어 코드를 짜는 중 예전 코드가 작동하지 않는 것을 발견했습니다.
셀레니움이 업데이트되면서 문법 중 변경된 사항이 많았습니다.

  • chromedriver.exe로 활용하지 않음
  • find_element 문법 변경

구글 또한 크롤링에 대응하고자 변동된 것이 많았습니다. 

  • 첫번째 뉴스 페이지 내에 css 문법 미통일
  • 5페이지 단위로 10번째 기사의 css 변동

2. 크롤링 코드

구글의 크롤링 방지 css를 우회하여 특정 키워드 관련 뉴스기사 제목을 수집하는 코드를 작성하였습니다.
(2023.11.11. 기준)

from seleniumbase import Driver
from selenium.webdriver.common.keys import Keys # 엔터키 입력용
from selenium.webdriver.common.by import By
import pandas as pd
import time

######################################## 함수 ############################################

# 기사 제목
def crawling_title(n) :
    title_address = '#rso > div > div > div:nth-child('+str(n)+') > div > div > a > div > div.iRPxbe > div.n0jPhd.ynAwRc.MBeuO.nDgy9d'
    title = driver.find_element(By.CSS_SELECTOR, title_address).text
    return title

# 기사 내용 일부
def crawling_text(n) :
    source_address = '#rso > div > div > div:nth-child('+str(n)+') > div > div > a > div > div.iRPxbe > div.GI74Re.nDgy9d'
    source = driver.find_element(By.CSS_SELECTOR, source_address).text
    return source

# 기사 링크
def crawling_href(n) :
    href_address = '#rso > div > div > div:nth-child('+str(n)+') > div > div > a'
    href = driver.find_element(By.CSS_SELECTOR, href_address).get_attribute("href")
    return href

# 신문사
def crawling_source(n) :
    source_address = '#rso > div > div > div:nth-child('+str(n)+') > div > div > a > div > div.iRPxbe > div.MgUUmf.NUnG9d > span'
    source = driver.find_element(By.CSS_SELECTOR, source_address).text
    return source

# 작성일
def crawling_time(n) :
    source_address = '#rso > div > div > div:nth-child('+str(n)+') > div > div > a > div > div.iRPxbe > div.OSrXXb.rbYSKb.LfVVr > span'
    source = driver.find_element(By.CSS_SELECTOR, source_address).text
    return source
    
    
 ######################################## 코드 시작 #######################################
 driver = Driver(uc=True) # 웹드라이버 객체 생성

# 구글을 열어서 키워드 입력 입력 후 이동
driver.get('http://www.google.com') # 구글 홈페이지 내용 렌더링
target=driver.find_element(By.CSS_SELECTOR,"[name = 'q']") # 검색어 지정
target.send_keys('키워드')
target.send_keys(Keys.ENTER) # 엔터처리

time.sleep(1)

# 뉴스 페이지로 이동
news = driver.find_element(By.CSS_SELECTOR,'#hdtb-msb > div:nth-child(1) > div > div:nth-child(2) > a')
news.click()

time.sleep(1)

# 크롤링 방지 우회 클릭
driver.find_element(By.CSS_SELECTOR,'#pnnext > span:nth-child(2)').click()


title = []
text = []
href = []
source = []
time_check = []

# 페이지 끝을 range에 적용
for x in range(1, 31) : 
    print(x, '페이지 입니다.')
    time.sleep(3)
    for y in range(1,9) :
        print(y, end=' ')
        title.append(crawling_title(y))
        text.append(crawling_text(y))
        href.append(crawling_href(y))
        source.append(crawling_source(y))
        time_check.append(crawling_time(y))
    driver.find_element(By.CSS_SELECTOR,'#pnnext > span:nth-child(2)').click()
    print()

df = pd.DataFrame([title, text, href, source, time_check]).T
df.columns = ['TITLE', 'CONTENT', 'LINK', 'SOURCE', 'TIME']

display(df.head())

df.to_excel("./제목.xlsx", index=None)

'데이터 관련 > 크롤링' 카테고리의 다른 글

혼자서 해보는 LOL 챔프 크롤링  (0) 2021.04.29