본문 바로가기
공허의 유산/사상의 도구

DC Inside 고민 갤러리 데이터 수집 - 목록

by 바른생활머시마 2023. 9. 1.
728x90
반응형

원래는 국회 입법 정보 시스템의 데이터를 수집해서 일 안하는 의원, 거수기 역할만 하는 의원들 좀 분석 해 보려고 했는데, Code for Korea에서 진행하는 '위로' 프로젝트의 일환으로 'DC Inside의 고민 갤러리'에 작성 된 고민들을 바탕으로 위로를 해보기로 하였다. 일단 데이터를 모아서 분석하고 도울 수 있는 방법을 함께 찾아보자고.

 

Code for Korea 위로 프로젝트

https://code-for-korea.slack.com/archives/C05NCGCMWS2

 

Slack

 

code-for-korea.slack.com

 

프로젝트의 취지를 DC Inside에 말씀 드리고 데이터 활용이 가능한지 문의 드렸는데, 공익을 위한 활동이니 허락을 해주셨다. 와우!!! 감사합니다.

 

DC Inside 고민 갤러리

https://gall.dcinside.com/board/lists/?id=agony 

 

고민 갤러리 - 커뮤니티 포털 디시인사이드

건강/심리 카테고리로 분류된 고민 갤러리입니다. 고민 갤러리에 다양한 이야기를 남겨주세요.

gall.dcinside.com

 

프로젝트를 시작 한 뒤 자주 들러서 고민들을 읽어보고, 나름 도움이 될, 혹은 위로가 될 말을 몇 번 적어봤지만, 얼마나 도움이 될지 모르겠고, 그저 따뜻한 말 한마디로 위로 하는 것 말고 실질적인 도움이 될 수 있는 방법은 없을지 또 고민을 하지 않을 수가 없다. 여러 개의 고민들을 보고 있자면, 너무 거친 표현이 담겨 있으면 선의의 뜻이 제대로 전달되기 어려워 보여서 그 화가 내려갈 때까지 기다려야 할 것 같다고 생각된다. 욕설이 적혀있는 글들을 계속 해서 보고 있으려면 그것도 꽤 힘든 일이라서, 나중에 프로젝트를 할 멤버들에게는 각별히 주의를 하도록 이야기 해줘야겠다.

 

 

고갤 데이터의 개괄적인 내용

 

현재 등록 된 데이터의 개수를 먼저 파악 해 보았는데,

페이지당 100개씩 나오도록 하면 9715 페이지니까 97만건, 즉 거의 100만건에 가까운 개수의 글이 있다. 2005년부터 쌓인 글들이니 고3?고2쯤 되는 아이들이 태어나고 자라는 기간 만큼의 데이터가 쌓여있는 것이다. 주로 청소년과 젊은 이들의 고민들이 많았던 것 같다. 

 

지금 내 기준에서 보면 고민이 아니지만, 그 당시의 나에게도 고민이었던 내용들을 고민하는 아이들의 모습을 보면, 때로 귀엽기도 하고, 또 안타까울 때도 있다. 고민글에 짧지만 위로가 되는, 울림을 주는 댓글을 남겨주시는 분들도 쉽게 볼 수 있어서, 그런 답글을 보면서 나도 그 위로의 마음을 공유 할 수 있게 되는 것 같다.

 

 

데이터 수집 계획

데이터 수집은 프로젝트 참여 멤버들과 함께 해보려고 모집 중인데, 기술적으로 어려운 내용은 아닌 것 같고, 양이 많은 것이라 여러 사람들이 나눠서 하면 좋을 것 같다. DC Inside 서버에서 Dump를 내려주면 좋지만, 번거롭게 해드리기 뭐하고 사용 허락을 해주신 것만도 감사해서, 어떻게든 우리끼리 한번 알아서 해보는게 좋을 것 같다. 

 

GET 방식으로 각 글을 열어 볼 수 있도록 글 번호만 알면 해당 페이지를 여는 URL을 조합 할 수 있으니, 일단 목록을 먼저 추출하고, 목록이 만들어지면 사람들과 양을 나눠서 진행 해 보는 것이 좋을 것 같다. 목록은 내가 연습삼아 슥슥~

 

목록 페이지 URL 형식은 아래와 같으니, page만 1부터 9715까지 돌리면 되겠다.

https://gall.dcinside.com/board/lists/?id=agony&page=9715&list_num=100 

 

목록에서 저장 할 정보는 글번호/제목/댓글수/작성자/날짜/조회수/추천수 로 목록에 나오는 그대로이다.

크롤링 대상을 나누는 목적 외에, 위 정보만 가지고도 개괄적인 통계를 뽑을 수 있는 것이 있을 것 같다.

시기별 고민글 빈도나 제목에 따른 조회수 등.

 

 

목표 범위 페이지 전환 코드

URL이 GET 방식으로 되어 있어서 목록 페이지 넘기는 것은 간단히 다음과 같이 구현 할 수 있다.

# 수집 페이지 범위
page_from = 1
page_to = 10

# 수집 대상 사이트
base_URL = 'https://gall.dcinside.com/board/lists/?id=agony&list_num=100&page='

for page in range(page_from, page_to):
    target_url = base_URL + str(page)
    driver.get(target_url)
    time.sleep(1)

그나저나 Javascript하고 C#을 하다가 간만에 Python 하려니 낯설어서 검색의 힘이 많이 필요하네.

 

 

페이지내 목록 데이터 추출

요런 것은 한땀 한땀 할 수 밖에~ㅋ

긴 시간이지만 일단 요렇게 하면 된다는거.

import selenium
from selenium import webdriver

from selenium.webdriver.common.by import By

import time

import re

browser_driver_path = 'C:/Study/c4k/sellenium/chromedriver_win32/chromedriver.exe'
driver = webdriver.Chrome()

# 수집 페이지 범위
page_from = 1
page_to = 10

# 댓글 개수 패턴
reply_reg_filter = re.compile(r'\[\d\]$')

# 수집 대상 사이트
base_URL = 'https://gall.dcinside.com/board/lists/?id=agony&list_num=100&page='

for page in range(page_from, page_to):
    target_url = base_URL + str(page)
    driver.get(target_url)
    time.sleep(1)

    # table
    list_table = driver.find_element(By.XPATH,'//*[@id="container"]/section[1]/article[2]/div[2]/table/tbody')

    # contents
    trs = list_table.find_elements(By.CSS_SELECTOR,'.us-post')
    for tr in trs:
        #number
        number = tr.get_attribute('data-no')

        #title
        title = tr.find_element(By.CLASS_NAME,'gall_tit').text

        #reply
        reply_cnt = "#"
        replay_open_idx = title.rfind('[')
        if title[-1]!=']' and replay_open_idx<0:
            reply_cnt="0"
        else:
            reply_cnt = title[replay_open_idx+1:-1]
            title = title[:replay_open_idx]
  
        #writer
        writer = tr.find_element(By.CLASS_NAME,'gall_writer').text

        #date
        date = tr.find_element(By.CLASS_NAME,'gall_date').get_attribute('title')

        #count
        count = tr.find_element(By.CLASS_NAME,'gall_count').text

        #recommend
        recommend = tr.find_element(By.CLASS_NAME,'gall_recommend').text

        #tr
        tr_string = number+"|"+title+"|"+reply_cnt+"|"+writer+"|"+date+"|"+count+"|"+recommend

        #print
        print(tr_string)

출력도 잘 된다.

이제 이것을 파일 하나에 담을지, 몇 개에 나눠서 담을지 정해야 하는데...

목록이니까 일단 파일 하나에 담아보도록 하자.

그건 다음에~

728x90
반응형

댓글