[Python] 데이터 크롤링(data crawling) #3
데이터 크롤링

[Python] 데이터 크롤링(data crawling) #3

3번째 이야기에서는 '트럼프 대통의 취임 이후 1년간 게시한 2,500개의 게시물'을 분석해 볼 계획입니다.

처리조건문, 반복문, 리스트를 복합적으로 활용해 트럼프 대통령의 트윗을분석하고, 알아보기 쉬운 시각화로 표현해 봅시다!

 

분석에 앞서, 이번 게시물에서는 주로 사용하게 될 기본개념 및 문법에 대해서 알아보는 시간을 가지겠습니다.

간단한 파이썬 문법이니, 아래 내용을 아시는 분들은 넘어가주셔도 좋습니다 :-)  

 

 - 문자열 인덱싱 

 - 파일다루기(file open, with)

 - 문자열함수( startswith(), split(), append(), upper(), lower(), replace() )

 

#  인덱스 넘버startswith() 사용하기

다른 일반적인 언어들과 마찬가지로, 파이썬에서 인덱스는 0부터 시작하여 접근할 수 있습니다.

다만, -1 은 맨 마지막 문자 또는 요소를 의미합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 트럼프 대통령 트위터 내용 중 일부를 공백 기준으로 분리한 리스트입니다. 
trump_tweets = ['thank''you''to''president''moon''of''south''korea''for''the''beautiful'
'welcoming''ceremony''it''will''always''be''remembered']
 
def print_korea(text):
    '''
    문자열로 구성된 리스트에서 k로 시작하는 문자열을 출력합니다.
    '''
    
    # 아래 코드를 작성하세요.
    for word in text :
        if word[0=="k" : 
            print(word)
 
print_korea(trump_tweets)
 

트윗의 내용 중, k로 시작하는 문자열을 인덱스로 접근하여 찾아낸 예제입니다.

 == 를 사용하여 직관적으로 표현가능하다는 것이 강점이랄까요.

 

+ 위의 for 반복문 부분을 다음과 같이 문자열함수 startswith() 를 사용하여 나타낼 수도 있습니다.

11
12
13
    for word in text :
        if word.startswith("k") :
            print(word)

결과는 korea 로 같습니다. 

 

 


 split()을 사용하여 문장을 단어 단위로 구분하기

1
2
3
4
5
6
7
8
9
10
11
12
# 트럼프 대통령 트위터 내용 중 일부 입니다. 
trump_tweets = "thank you to president moon of south korea for the beautiful 
welcoming ceremony it will always be remembered"
 
def break_into_words(text):
    '''
    공백 기준으로 분리된 문자열을 리스트형으로 반환합니다. 
    '''
    words =  text.split()
    
    return words
 
print(break_into_words(trump_tweets))
 

split뒤의 ()에는 구분해낼 요소들을 넣어줄 수 있습니다.

예를 들어, mylist.split(',') 라고 한다면, mylist이라는 이름을 가지는 문자열을 , 기준으로 분리시켜 리스트형으로 반환하겠다는 것입니다.

()안에 아무것도 넣지 않는다면, 띄어쓰기 기준으로 분리시키게 됩니다.

위 코드를 실행시킨 결과는 다음과 같습니다.

['thank', 'you', 'to', 'president', 'moon', 'of', 'south', 'korea', 'for', 'the', 'beautiful', 'welcoming', 'ceremony', 'it', 'will', 'always', 'be', 'remembered']

words에 list형태로 반환되어 저장되었습니다.

 

 


#  append()를 사용하여 새로운 단어를 추가하기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 트럼프 대통령 트위터 중 일부를 공백 기준으로 분리한 리스트입니다.
trump_tweets = ['america''is''back''and''we''are''coming''back''bigger''and'
'better''and''stronger''than''ever''before']
 
def make_new_list(text):
    '''
    문자열로 구성된 리스트에서 b로 시작하는 모든 문자열을 새로운 리스트에 담습니다.
    '''
    new_lists = []
    for word in text :
        if (word[0]=="b") :
new_list.append(word)
    
    return new_lists
  
new_list = make_new_list(trump_tweets)
print(new_list)
 

append()는 리스트를 다룰 때 사용되는 가장 기본적인 메소드로 , 리스트의 맨 마지막에 새로운 요소를 추가합니다.

실행한 결과는 다음과 같습니다.

['back', 'back', 'bigger', 'better', 'before']

if 조건문에 해당하는 단어를 새로운 리스트(new_list)에 추가(append)하였습니다.

 

 


# upper() 또는 lower()로 대소문자 변환하기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 트럼프 대통령의 트윗 세개로 구성된 리스트입니다.
trump_tweets = [
    "FAKE NEWS - A TOTAL POLITICAL WITCH HUNT!",
    "Any negative polls are fake news, just like the CNN, ABC, NBC polls in the election.",
    "The Fake News media is officially out of control.",
]
 
def lowercase_all_characters(text):
    '''
    리스트에 저장된 문자열을 모두 소문자로 변환합니다.
    '''
    processed_text = []
    for word in text :
processed_text.append(word.lower())
    
    return processed_text
 
print('\n'.join(lowercase_all_characters(trump_tweets)))
 

메소드명에서 확인할 수 있다시피, lower()는 소문자로 upper()는 대문자로 바꿔줍니다.

데이터 분석에 왜 필요할까요?

가짜 뉴스를 뜻하는 Fake News는 트럼프 대통령이 가장 자주 사용하는 말 중 하나입니다.

FAKE NEWS, Fake News는 대소문자가 다르기 때문에 두 단어가 몇 번 사용되었는지 정확하게 확인하기 위해서는 모두 소문자로 변환하여 통일시켜 주는 것이 이상적이기 때문입니다.

위 코드의 실행 결과는 다음과 같습니다.

fake news - a total political witch hunt!

any negative polls are fake news, just like the cnn, abc, nbc polls in the election.

the fake news media is officially out of control.

 

lower()과 upper()를 사용할 때 절대 잊지 말아야 할 것은, 이 메소드를 사용하면 '원래 문자열을 직접 수정하는 것이 아니다' 라는 것입니다.

예를 들어,

1
2
intro = "My name is PHILIP"
intro.lower()

을 실행한다고 하여도, intro의 문자열에는 변화가 없다는 것입니다. 변화를 준 문자열을 직접 저장하는 과정이 있어야 합니다.

이 특징은 바로 다음에 나올 replace() 메소드에도 똑같이 적용됩니다.

 

 


# replace()로 특수기호 제거하기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 트럼프 대통령의 트위트터 세개로 구성된 리스트입니다. 
trump_tweets = [
    "i hope everyone is having a great christmas, then tomorrow 
it’s back to work in order to make america great again.",
    "7 of 10 americans prefer 'merry christmas' over 'happy holidays'.",
    "merry christmas!!!",
]
 
def remove_special_characters(text):
    '''
    리스트에 저장된 문자열에서 쉼표, 작은따옴표, 느낌표를 제거합니다.
    '''
    processed_text = []
    for word in text :
processed_text.append(word.replace(',','').replace('\'','').replace('!',''))
    return processed_text
 
print('\n'.join(remove_special_characters(trump_tweets))
replace() 메소드는 문자열에서 특정 문자나 문자열을 다른 문자(열)로 바꿀 때 사용됩니다.
replace() 는 변경하고 싶은 문자열을 첫 번째  입력값으로, 대체할 문자열을 두 번째 입력값으로 받습니다.

소문자로 변환된 trump_tweets의 트윗을 공백을 기준으로 구분할 경우 christmas', christmas,, christmas!!!가 생성되기 때문에 christmas가 몇 번 사용되었는지 정확하게 확인하기 위해서는 특수문자를 제거해야 합니다.

따라서 trump_tweets 리스트의 문자열 요소에서 쉼표, 작은따옴표, 느낌표를 제거해줘야 합니다!

위 코드를 실행한 결과는 다음과 같습니다.

i hope everyone is having a great christmas then tomorrow it’s back to work in order to make america great again.

7 of 10 americans prefer merry christmas over happy holidays.

merry christmas