제작 도전

다음 뉴스 크롤링 제작

영성 2021. 4. 30. 16:29
# 내 저장공간 확인
pwd
# 라이브러리 import
import pandas as pd
import numpy as np

from selenium import webdriver                        # 라이브러리(모듈) 가져오라
from selenium.webdriver import ActionChains as AC     # 웹브라우저 동작
from tqdm import tqdm
from tqdm.notebook import tqdm
from time import sleep
import time
# 데이터 수집할 키워드 지정
keyword = "SK텔레콤"
keyword

다음뉴스기사 url 수집

# 크롬창 띄우기
driver = webdriver.Chrome("chromedriver.exe")  # 맥 : /Users/aiden/Desktop/chromedriver
driver.get("https://search.daum.net/search?w=news&nil_search=btn&DA=NTB&enc=utf8&cluster=y&cluster_page=1&q={}".format(keyword))
time.sleep(3) #문자 안에 변수를 넣고 싶을떼 넣고 싶은 위치에 {}를 쓰고 뒤에 .format(변수)를 넣어준다
# page1에서 다음뉴스 url 수집하기
things = driver.find_elements_by_link_text('다음뉴스')  

url_list1 = []
for thing in things:
    url1 = thing.get_attribute('href')
    url_list1.append(url1)
    
url_list1
# 2번 페이지로 이동
driver.find_element_by_link_text("2").click( )
# page2에서 다음뉴스 url 수집하기
things = driver.find_elements_by_link_text('다음뉴스')  

url_list2 = []
for thing in things:
    url2 = thing.get_attribute('href')
    url_list2.append(url2)
    
url_list2
# page1, page2 url 합치기
url_list = (url_list1+url_list2)
print(len(url_list))
url_list
# csv 파일로 url 저장
df = pd.DataFrame({"url":url_list})
df.to_csv('daumnews_urls.csv')

전체 기사 for문으로 수집

# url 갯수
s = len(df['url'])
s
dict = {}

# 페이지당 기사 수집
for i in tqdm(range(0, s)):   # len(df['url'])
    try:
        # 뉴스 크롬창 띄우기
        driver = webdriver.Chrome("chromedriver.exe")  # 맥 : /Users/aiden/Desktop/chromedriver
        driver.get(df['url'][i])
        time.sleep(1)

        # 기사 데이터 수집
        title = driver.find_element_by_css_selector('.tit_view').text
        date = driver.find_element_by_css_selector('.num_date').text
        angry = driver.find_element_by_css_selector(".emotion_list .selectionbox.type-LIKE.unselected .count").text
        like = driver.find_element_by_css_selector(".emotion_list .selectionbox.type-ANGRY.unselected .count").text
        sad = driver.find_element_by_css_selector(".emotion_list .selectionbox.type-SAD.unselected .count").text
        
        # 기사 댓글 갯수 
        review_count = int(driver.find_element_by_css_selector(".num_count").text.replace(',', ''))

        # review 수집하기
        review_list = []
        overlays1 = ".desc_txt"
        reviews = driver.find_elements_by_css_selector(overlays1)
        for review in tqdm(reviews):    
            review = review.text
            review_list.append(review)

        target_info = {}
        target_info['기사명'] = title
        target_info['날짜'] = date
        target_info['좋아요'] = like
        target_info['화나요'] = angry
        target_info['슬퍼요'] = sad
        target_info['댓글 수'] = len(review_list)
        target_info['댓글'] = review_list

        dict[i] = target_info
        
        print(title, '( 댓글 수:', len(review_list),')')

        driver.close()
        time.sleep(1)
        
    except:
        driver.close()
        continue

print(len(dict))
dict

처참한 환경 다음 뉴스....
아무도 관심을 가져주지 않는다....

 

# 판다스로 만들기
import pandas as pd
result_df = pd.DataFrame.from_dict(dict, 'index')
result_df
# result_df.rename(columns={result_df.columns[0] : name}, inplace=True)

아무런 자료를 찾을 수 없다.... 다음 화이팅....

안되는 줄 알겠지만 실제로 댓글도 달고 좋아요 누르면 제대로 크롤링 된다...