구현환경 : python, vscode
클롤링 할 사이트 : https://news.naver.com/main/history/mainnews/list.nhn
1. selenium 설치
- terminal에 입력
pip install selenium
2. 사용할 브라우저 드라이버 다운로드
- 우측 상단의 다음과 같은 버튼 클릭 > 도움말 > 크롬 정보 에서 자신의 크롬 버전 확인해 맞는 버전 설치
- chrome : https://sites.google.com/a/chromium.org/chromedriver/downloads
- Firefox : https://github.com/mozilla/geckodriver/releases
- Edge : https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/
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
'학교 > 졸프' 카테고리의 다른 글
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 |