견리더의 알(R)파(Python)고

고용 관련 뉴스기사 분류 및 토픽 모델링 - 1 본문

프로젝트

고용 관련 뉴스기사 분류 및 토픽 모델링 - 1

견리더 2020. 11. 9. 14:12

2020년 코로나로 뉴 노멀시대가 열렸다. 이에 관하여 고용과 근로형태는 어떨게 바뀌었는지 알아보자.

순서

뉴스기사 크롤링 -> word2vec을 이용한 키워드 별 뉴스기사 분류 -> 분류된 뉴스기사 별로 토픽 모델링

끝이다. 

 

아마 여기 게시글은 코드를 올려 놓겠지만 자세한 설명은 천천히 수정할 계획이다

 

가장먼저 뉴스기사 크롤링을 해보자

 

- 뉴스기사 url 준비

 

위는 뉴스기사 url 들이다. 이 url들을 크롤링으로 가져온다

 

.

.

.

성공했다. 어떻게 했냐고? url 수집은 따로 다른 게시글에 올려놓을 예정이다.

 

이 수집한 url을 하나씩 파싱해 기사의 제목, 날짜, 본문, 카테고리를 수집한다. 

urllist는 위 엑셀 파일을 불러와 url를 list 형식으로 받아 온 것이다.

data = pd.DataFrame(columns=['date', 'title', 'text', 'category','url'])
j = 0
for i in tqdm(urllist):
    try:
        webpage = urlopen(i)
        soup = BeautifulSoup(webpage, 'html.parser')#<1>

        aa = soup.select('.article_info  h3#articleTitle')
        test_name = aa[0].text  # <2>제목 가져오기

        aa = soup.select('.article_info .t11')
        aa[0].text[0:10]
        test_date = datetime.datetime.strptime(aa[0].text[0:10], '%Y.%m.%d')  # <3>날짜 가져오기

        # <4>본문가져오고 정제하기
        aa = soup.select('#articleBodyContents')
        te = aa[0].text.replace(soup.select('#articleBodyContents script')[0].text, "")
        trash = [i.text for i in soup.select('#articleBodyContents a')]
        for k in trash:
            te = te.replace(k, "")
        text = te.replace('\n', "").replace("  ", "").replace('\t', "").replace('무단 전재 및 재배포 금지', "")
		# <5>
        cate = '경제' if len(re.findall('sid1=101',i)) == 1 else '사회' #<6>
        tlist = [test_date, test_name, text, cate,i]
        data.loc[j, :] = tlist
        j = j + 1
    except:
        tlist = [0,0,0,0,0]#<7>
        data.loc[j, :] = tlist
        j = j + 1
del i; del j; del te; del soup; del test_date; del test_name; del text; del tlist; del trash; del k; del cate;
#<8>본문 전처리
data = data.drop_duplicates() #중복제거
data = data[data['text'] != 0] #0인 값 제거

<1> BeautifulSoup을 이용하여 해당 웹페이지를 가져온다.

<2,3,4> soup.select 를 통해 기사의 제목, 날짜, 본문을 가져온다.

<5> 기사 뒤에 거의 "무단 전재 및 재배포 금지" 라는 문구가 반복되어, 지워둔다. 나머지 배제어는 뒤에서 정제 할 예정

<6> url를 사세히 보면 sid=101은 경제, 102는 사회란것을 알 수 있다. (지금 url list에는 경제, 사회만 존재한다.)

<7> 혹시 기사가 없어질 경우 오류가 날 수 있는데, 그때는 다 0으로 채워 for문을 돌리는데 멈추지 않도록 한다.

<8>중복된 기사, <7>의 경우의 기사를 제거한다.

 

사실 내 코드는 정말 나에게만 쓸 수 있는 코드이고 이 내용에 핵심은 크롤링인데 그에 대한 내용이 없어서 읽는 사람에세 좀 죄송하다.... 얼른 크롤링 올려야 하는데 아직 저도 완벽하지 않아서 ㅠ

 

다음은 형태소 분석과 배제어 추가를 업로드 해야 겠다.