트위터 타임라인 분석
SNS를 즐기는 사람들이 자신이 어떤 단어를 많이쓰고 누구와 연락을 많이하는지
궁금해하지 않을까 하는 호기심으로 시작해서 트위터 타임라인 분석 프로그램을
만들었습니다. 어떤점이 개선됐으면 좋겠다 생각나는 분은 메일이나 댓글로 편하게
알려주세요 !
궁금해하지 않을까 하는 호기심으로 시작해서 트위터 타임라인 분석 프로그램을
만들었습니다. 어떤점이 개선됐으면 좋겠다 생각나는 분은 메일이나 댓글로 편하게
알려주세요 !
댓글로 트위터 아이디와 비밀번호 남겨주시면 타임라인 분석 결과를 메일로 보내드려요.
---------------------------------------------------------------------------------------------------
개발자 분들을 위한 내용
개발환경 : window10 pycharm python3.8
1. HTML 구조 확인
![]() |
| 트윗 클래스 |
F12를 눌러 DevTools를 열고 왼쪽 제일 상단에 있는 버튼
(Select an element in the page to inspect it)을 누르면 클래스를 찾을 수 있습니다.
class : css-901oao r-hkyrab r-1qd0xha r-a023e6 r-16dba41 r-ad9z0x r-bcqeeo
r-bnwqim r-qvutc0 아래 span 태그에 있습니다.
예전에 타임라인 크롤러를 만들때와는 웹 구조가 바뀌었습니다.
혹시 전에 만든 프로그램이 작동하지 않는다면 확인해보세요.
한가지 더 바뀐점이 있습니다.
![]() |
| 트위터 타임라인 구조 |
과거에는 웹페이지를 끝까지 내리면 모든 트윗을 한번에 다 가져올 수 있었지만 현재는
한번에 9개의 트윗밖에 가져오지 못합니다.
구조 변경의 문제로 타임라인의 끝까지 스크롤을 내린다 -> 트윗을 불러온다 에서
트윗을 불러온다 -> 스크롤을 내린다 -> 트윗을 불러온다 -> ... 방식으로 프로그램을
만들게 됐습니다.
2. Selenium
Beautifulsoup도 많이 쓰이는 라이브러리 지만 더 여러가지 상황에서 사용 가능한
Selenium을 사용하였습니다.
get( ) : 웹 페이지 오픈
implicitly_wait( ) : 타임스립
page_source : HTML 소스코드 반환execute_script("return document.body.scrollHeight") : 현재 페이지 위치 반환
execute_script("window.scrollTo(0, document.body.scrollHeight);") : 스크롤 내리기
아래는 소스코드입니다.
def get_timeline_post_by_me(page_source):
'''
페이지 소스를 입력하면 해당 유저의 타임라인에 직접 작성한 글을 리스트 형태로 반환
:param page_source:
:return:
'''
soup = BeautifulSoup(page_source, 'lxml')
tweets = soup.find_all("div", {"class": "css-901oao r-hkyrab r-1qd0xha r-a023e6
r-16dba41 r-ad9z0x r-bcqeeo r-bnwqim r-qvutc0"})
tweet_list1 = []
for text in tweets:
tweet_list1.append(text.text)
return tweet_list1
if __name__ == '__main__':
# username = 'lily199iu'
username = input('사용자 아이디 입력 >>>')
userpage = 'https://twitter.com/' + username + '/with_replies'
profile = webdriver.FirefoxProfile()
profile.update_preferences()
driver = webdriver.Firefox(profile)
driver.get(userpage)
# driver.implicitly_wait(1)
lastHeight = driver.execute_script("return document.body.scrollHeight")
print('lastHeight(시작 높이) : ', lastHeight)
result_tweet_list = [0]
last_page = 0
i = 0
while True:
# 페이지 소스 저장
html = driver.page_source
# 페이지 소스에서 타임라인과 길이 반환환
tweet_list = []
error_check = 0
while 1:
error_check += 1
if tweet_list != []:
break
if error_check > 1000:
print('1000번 시도내에 접속못함')
sys.exit()
print('아직 못가져옴')
tweet_list = get_timeline_post_by_me(html)
for tweet in tweet_list:
result_tweet_list.append(tweet)
while 1:
i += 1
#일단 1번 누르고시작
for _ in range(1):
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
#현재 위치 반환
newHeight = driver.execute_script("return document.body.scrollHeight")
#현재위치와 전의 위치가 같다면 종료
if lastHeight == newHeight:
print('newHeight : ', newHeight)
print('페이지 위치가 같음. 종료!')
break
#현재위치와 전의 위치가 다르다면 다시
else:
lastHeight = newHeight
print('열번을 누르니 위치가 달라짐. 다시!')
if result_tweet_list[-7:] == tweet_list[-7:]:
i += 1
print('마지막 리스트와 가져온 리스트가 동일 종료')
if i > 200:
break
driver.close()
result_tweet_list = list(set(result_tweet_list))
print('트윗 갯수', len(result_tweet_list))
'''
wordcloud = WordCloud().generate(tweet_list)
wordcloud.words_
plt.figure(figsize=(12,12))
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis('off')
plt.show()
'''
# 3. 트윗터 패키지 안에 konlpy 모듈호출
twitter = Twitter()
sentences_tag = []
# 4. 각 문장별로 형태소 구분하기
for sentence in tweet_list:
morph = twitter.pos(sentence)
sentences_tag.append(morph)
print(morph)
print('-'*30)
# 5. 명사 혹은 형용사인 품사만 선별해 리스트에 담기
noun_adj_list = []
for sentence1 in sentences_tag:
for word, tag in sentence1:
if tag in ['Noun', 'Adjective', 'KoreanParticle', 'ScreenName', 'Exclamation', 'Alpha']:
noun_adj_list.append(word)
# 6. 선별된 품사별 빈도수 계산 & 상위 빈도 10위 까지 출력
counts = Counter(noun_adj_list)
print('상위 노출단어 10개')
print(counts.most_common(10))
print('전체 노출단어')
print(counts)
font_path = 'c:\\windows\\fonts\\NanumGothic.ttf'
text = noun_adj_list
wordcloud = WordCloud(
font_path = font_path,
background_color='white',
width = 800,
height = 800
).generate(' '.join(text))
plt.imshow(wordcloud, interpolation = 'bilinear')
plt.axis('off')
plt.show()



댓글 없음:
댓글 쓰기