학교/졸프

selenium 네이버 뉴스 크롤링

daykim 2021. 6. 29. 15:59

구현환경 : python, vscode

클롤링 할 사이트 : https://news.naver.com/main/history/mainnews/list.nhn

 

1. selenium 설치

  • terminal에 입력
    pip install selenium​
     

2. 사용할 브라우저 드라이버 다운로드

 

3. 기본적인 코드

  • https://github.com/ekdud0529/Meme/blob/main/memeCrawling.py
  • 이전 코드 복붙했다.
    from selenium import webdriver
    
    # selenium에서 사용할 웹 드라이버 절대 경로 정보
    chromedriver = 'C:\dev\chromedriver.exe'
    
    # selenum의 webdriver에 앞서 설치한 chromedirver를 연동한다.
    driver = webdriver.Chrome(chromedriver)
    
    # driver로 특정 페이지를 크롤링한다.
    driver.get('https://news.naver.com/main/history/mainnews/list.nhn')

 

4. 구현하기

  • 2010년 ~ 최근까지 크롤링해올 생각이다.

1) 2010년 1월 날짜로 변경하기

 

from selenium import webdriver
import time #클릭, 이동시 브라우저도 시간이 필요하기 때문에 시간 지연시키는 코드를 위해 사용
import urllib.request
import csv

# selenium에서 사용할 웹 드라이버 절대 경로 정보
chromedriver = 'C:\dev\chromedriver.exe'

# selenum의 webdriver에 앞서 설치한 chromedirver를 연동한다.
driver = webdriver.Chrome(chromedriver)

SCROLL_PAUSE_SEC = 1

def newsLinkScraping() :
    # driver로 특정 페이지를 크롤링한다.
    driver.get('https://news.naver.com/main/history/mainnews/list.nhn')

    date = driver.find_element_by_xpath("//*[@id='u.c.button']").click()
    # change = driver.find_element_by_xpath("//*[@id='u.c.year.div']/a/span[2]").click()
    # years = driver.find_elements_by_css_selector('#u\.c\.year\.div > div > div.content > ul > li')
    # driver.execute_script("arguments[9].click();", years)

    # 날짜 클릭하기 (현재 19.01.01)
    while(1):
        mon = driver.find_element_by_xpath("//*[@id='u.c.layer']/div/div/div[2]/div/div[1]/span").text
        if(mon == "1") :
            day = driver.find_element_by_xpath("//*[@id='u.c.layer']/div/div/div[2]/div/div[2]/table/tbody/tr[2]/td[3]").click()
            time.sleep(SCROLL_PAUSE_SEC)
            break;
        else :
            # 이전 달
            prev = driver.find_element_by_xpath("//*[@id='u.c.layer']/div/div/div[2]/div/div[1]/a[1]").click()

            # 다음 달
            # next =  driver.find_element_by_xpath("").click()

    # 뉴스 list
    
    newsHref = []

    

    for page in range(2) :
        articleDate = driver.find_element_by_css_selector("#main_content > div.calendar_date2 > div > span").text

        time.sleep(SCROLL_PAUSE_SEC)

        newsListLen = len(driver.find_elements_by_css_selector("#h\.m\.text > ul"))

        for mlist in range(4):

            for i in range(5):

                if page == 1 :
                    driver.find_element_by_css_selector("#h\.m\.text > div > div.eh_btns > a.eh_btn_next.nclicks\(his_lst\.tnext\)").click()
                    time.sleep(SCROLL_PAUSE_SEC)
                    
                news = []
                time.sleep(SCROLL_PAUSE_SEC)
                title = ""
                href = ""

                title = driver.find_element_by_css_selector("#h\.m\.text > ul:nth-child(%d) > li:nth-child(%d) > a"%(mlist+1, i+1)).text
                time.sleep(SCROLL_PAUSE_SEC)
                
                href = driver.find_element_by_css_selector("#h\.m\.text > ul:nth-child(%d) > li:nth-child(%d) > a"%(mlist+1, i+1)).get_attribute("href")
                time.sleep(SCROLL_PAUSE_SEC)
                
                driver.get(href)
                time.sleep(SCROLL_PAUSE_SEC)

                contents = driver.find_elements_by_css_selector("#articleBodyContents")
                text = ""
                for body in contents:
                    text = text.join(body.text)

                news.append(articleDate)
                news.append(title)
                news.append(text)
                newsHref.append(news)
                time.sleep(SCROLL_PAUSE_SEC)

                driver.back()
                time.sleep(SCROLL_PAUSE_SEC)

    driver.close()
            
    print(newsHref)
    print(len(newsHref))

    return newsHref

def list2csv(crawlingList) :
    # newline='' 설정이 없는 경우 row와 row 사이에 뉴라인이 한번 더 들어가게 됨
    f = open('01.csv', 'w', newline='', encoding='utf-8-sig')
    wr = csv.writer(f)
    for imgList in crawlingList:
        wr.writerow(imgList)
    f.close()

def csv2list() :
    data = []
    # encoding='utf-8-sig' 설정은 한글 깨짐 방지
    f = open('memeData.csv', 'r')
    rdr = csv.reader(f)
    for line in rdr:
        data.append(line)
    f.close

    return data

list2csv(newsLinkScraping())

 

 

참고한 URL

https://www.youtube.com/watch?v=1b7pXC1-IbE

https://60sec.tistory.com/210

'학교 > 졸프' 카테고리의 다른 글

LDA(Latent Dirichlet Allocation  (0) 2021.08.19
Doc2Vec  (0) 2021.08.17
AWS EC2에서 Flask 구동하기  (0) 2021.06.28
Nginx와 Flask를 활용해서 서빙하기  (0) 2021.06.25
AWS 서버 세팅하기  (0) 2021.06.15