파이썬 : 크롤링 데이터 정제하기

자욱·2020년 10월 12일
0
post-thumbnail
post-custom-banner

크롤링으로 생성된 텍스트 파일을, 파이썬으로 간략하게 정제하여 출력하는 과정을 다룹니다.
파이썬의 기초 중 기초인 텍스트 슬라이싱과 리스트, 반복문, 파일 출력 기능만을 이용합니다.

1. 크롤링 데이터 준비

웹크롤링 도구를 이용하여 네이버 블로그 포스트를 텍스트 파일에 저장하면, 각종 태그가 뒤섞인 텍스트 파일이 생성되어 있는 것을 확인할 수 있다.

(물론 크롤링 과정에서 이미 정제해서 저장해 버리는 사람들도 많지만, 여기에서는 보다 다양한 방법으로 포스트를 수집할 것을 감안하여 원 재료의 맛이 살아 있는 데이터를 준비하였다.)

텍스트 파일 원본의 모양. 각 기업의 슬로건을 모아 둔 블로그 포스트를 가져왔다.

먼저 텍스트 파일 내부의 데이터를 가져오자.

with open('tttt.txt', mode='r', encoding='utf-8') as rawtext :
    text=rawtext.read()
    # with 구문을 사용하면, 파일 관련 메소드 이용이 끝났을 때 자동으로 close가 작동한다.
print(text)

원본 파일과 똑같은 텍스트가 출력된다. (스크린샷 생략)

2. 필요하지 않은 부분 잘라내기

텍스트 파일 내에서 필요한 부분은, 각 태그 사이사이에 있는 텍스트뿐이다.

시험 삼아 '>'와 '<' 사이에 있는 문자를 찾아 리스트에 담아 보자.

우선 텍스트에서 '>'가 등장하는 위치를 find 함수로 찾고, 등장 위치 다음부터 끝까지를 지정한 다음, 해당 부분을 기존 텍스트에 덮어씌우자. (text=text[슬라이싱])

그리고 앞부분의 태그가 잘 잘렸는지 확인해 본다.

firstidx=text.find('>')
text=text[firstidx+1:]
print(text)

앞부분이 잘 날아갔다.

3. 필요한 부분을 잘라 리스트에 담기

잘 작동하는 게 확인되었다면, 다음으로 '<'가 등장하기 전까지의 텍스트를 잘라 빈 리스트 (list=[])에 넣는다. 지금의 경우, 맨 앞에 바로 '<span style...' 모양이 등장하므로, 리스트에 빈 텍스트가 들어갈 것이다.

list=[]
lastidx=text.find('<')
list.append(text[:lastidx])
print(list)

출력결과는 예상대로.

['']

일단 다시 한 번, '>'가 등장하는 장소를 찾아 프린트해 본다.

firstidx=text.find('>')
text=text[firstidx+1:]
print(text)

앞쪽 태그가 한 번 더 잘리고 이후 내용이 잘 출력되고 있는 것이 확인된다면, 앞서 사용한 방식대로 한 번 더 '<'가 등장하는 구간을 찾아 자르고, 리스트에 추가한다.

lastidx=text.find('<') # 다음 '<'의 위치 찾기
list.append(text[:lastidx]) # 알맹이를 뽑아서 리스트에 추가하기

출력결과는...

['','- ']

👀 띠용?

원본소스를 잘 뜯어 보니, 이 부분이 리스트에 들어간 것이다.

빨간 네모로 표시한 부분.

그렇다면, 한 번 더 '>'가 등장하는 부분까지를 찾아 자르고, '<' 까지를 찾아 리스트에 넣는다면..

firstidx=text.find('>') # 다음 '>' 까지의 위치 찾기
text=text[firstidx+1:] # 해당 위치까지 자르기 (태그 부분이 잘린다)
lastidx=text.find('<') # 다음 '<'의 위치 찾기
list.append(text[:lastidx]) # 알맹이를 뽑아서 리스트에 추가하기

출력결과.

['','- ','최첨단 영상 멀티미디어 기술을 선도하는 가산']

이 부분이다. 성공적.

4. 반복되는 코드 모아주기

지금까지 소스코드를 테스트하면서, 반복되는 부분이 생겼다는 것을 눈치챘을 것이다. 딱 네 줄이다.

firstidx=text.find('>') # 다음 '>' 까지의 위치 찾기
text=text[firstidx+1:] # 해당 위치까지 자르기 (태그 부분이 잘린다)
lastidx=text.find('<') # 다음 '<'의 위치 찾기
list.append(text[:lastidx]) # 알맹이를 뽑아서 리스트에 추가하기

이 부분을 반복처리한다.

불필요한 앞부분의 텍스트가 계속 잘리고 잘릴 예정이므로, 반복 조건은 남은 텍스트 길이가 0이 될 때까지로 하자.

즉, 텍스트의 길이가 0보다 큰 동안 작업을 반복시키면 된다.

while len(text)>0 :
    firstidx=text.find('>')
    text=text[firstidx+1:]
    lastidx=text.find('<')
    list.append(text[:lastidx])
    
print(list)

반복문을 돌린 다음 리스트의 상태를 확인해 보면..

['',
'- ',
'',
'최첨단 영상 멀티미디어 기술을 선도하는 가산',
'',
'- ',
'좋은 집만을 지어 온 경남기업',
'',
'- ',
'밝은 미래를 추구하는 대우가족',
'',
'- ',
'품질에서 앞서가는 경인에너지',
'',
'- 2',
'대의 전통을 자랑하는 고려가방',
'',
'- ',
'고객중심',
...

텍스트 파일 끝까지 잘 돌아가는 것을 확인할 수 있다.

5. 수집한 데이터 묶고 정제하여 출력하기

이제 이 리스트의 모든 원소를 하나로 이어붙이도록 하자.

우선 빈 텍스트 객체인 longtxt를 만들자.
그 다음 for 반복문을 리스트 길이만큼 시행하여 리스트의 각 원소를 longtxt 객체에 이어붙인다.

longtxt=""

for i in range(0, len(list)) :
    longtxt+=list[i]
print(longtxt)

출력결과.

- 최첨단 영상 멀티미디어 기술을 선도하는 가산- 좋은 집만을 지어 온 경남기업- 밝은 미래를 추구하는 대우가족- 품질에서 앞서가는 경인에너지- 2대의 전통을 자랑하는 고려가방- 고객중심, 고객만족, 고객사랑 - 고려 CK- 새로운 주거환경의 미를 추구하는 극동요업- 토탈패션의 名家 - 금강제화- 기술의 상징 - 금성- 순간의 선택이 10년을 좌우합니다 - 금성- 신뢰의 상표 - 금성- 우리의 안전을 생각합니다 - 금호타이어- 새로운 주거환경을 창출하는 기업 - 기봉물산- 더 빨리, 늘 가까이 - 기아서비스- 이상과 현실을 이어가는 - 기창- 알로에를 사랑하고 연구하는 사람들의 기업 - 김정문알로에- 옛날 그 정성, 그 맛 - 남부식품- 자연이 있습니다 - 남양알로에- 새로운 주거환경을 창조하는 널분울알루미늄- 패션그룹 - 논노- 푸른 건강 - 대두그린- 항상 연구, 개발하는 기업 - 대열보일러- 세계경영, 우리기술 - 대우- 대우가 있습니다 - 대우- 무한의지와 도전의식으로 미래를 창조하는 기업 - 대우금속- 세계로 달린다 - 대우자동차- 제품은 튼튼하게, 생활은 편리하게 - 대우전자- 탱크주의 - 대우전자- 헌혈 - 사랑의 실천입니다 - 대한적십자사- 우리의 날개 - 대한항공- 21세기와 커뮤니케이션 한다 - 데이콤- 국제전화는 002로 시작하세요 - 데이콤- 세계를 가깝게, 미래를 가깝게 - 데이콤- In Touch With Tomorrow - 토시바- I Love What You Do For Me - 토시바- 즐거운 생활 속에 해표가 있습니다 - 동방유량- 자연의 맑은 물을 우리들의 후손에게 - 동신유암- 좋은 책 만들기 반세기 - 동아출판사- 숨쉬는 물시대 선언 - 동아프라자- FASHION CREATOR - 동일레나운- 전통 100년, 도전 100년 - 두산- PC의 새로운 환경 - 두인전자- 한 길, 한 뜻으로 사무기기 20년 - 라이카- 손끝에는 정성을, 가슴에는 정열을 - 라전모방- 고객을 위한 가치창조 - 럭키금성- 쾌적하고 생산적인 산업사회 창조 - 럭키금성- 사랑과 자유와 풍요로운 삶을 추구하는 롯데- The art of travel - LOUIS VUITTON- 바른 글 깨끗한 글씨 - 마이크로- 새로움과 믿음 -
...

블로그 포스트 작성자가 각 슬로건 앞에 하이픈 - 을 넣어 둔 모양이다.

이 하이픈을 줄바꿈으로 바꿔서 보기 편하게 정렬해보자.

앞의 반복문에, replace로 '- ' 부분을 줄바꿈 문자 '\n'으로 치환하는 명령을 추가하여 다시 실행한다.

longtxt=""

for i in range(0, len(list)) :
    longtxt+=list[i]
    longtxt=longtxt.replace('- ','\n')
print(longtxt)

최종 출력결과.

최첨단 영상 멀티미디어 기술을 선도하는 가산
좋은 집만을 지어 온 경남기업
밝은 미래를 추구하는 대우가족
품질에서 앞서가는 경인에너지
2대의 전통을 자랑하는 고려가방
고객중심, 고객만족, 고객사랑
고려 CK
새로운 주거환경의 미를 추구하는 극동요업
토탈패션의 名家
금강제화
기술의 상징
금성
순간의 선택이 10년을 좌우합니다
...

중간중간 기업명이 포스트 사이에 하이픈으로 들어 있는 모양이라, 슬로건 사이사이에 단일 기업명이 끼어 있다.

그러나 출력 결과를 전달하여 검토하기에 지장이 없을 만큼 바뀌었므로, 일단은 성공적이다.

더 깔끔하고 유의미한 결과물을 얻기 위해서는 좀 더 데이터 정제 과정을 다듬어야 하겠지만, 이건 예제니까..여기까지만 하도록 하자.

🐾 정리

수집된 자료의 형태에 따라, 데이터를 정제하는 방식은 천차만별일 것이다.

그러나 일정한 패턴을 파악한 뒤 필요한 작업을 반복수행하도록 로직을 완성하면, 이후 같은 형태의 데이터 수집 시 편리하게 저장, 처리, 시각화할 수 있을 것이다.

profile
"What Do You Do with a B.A. in Korean?"
post-custom-banner

0개의 댓글