김건

Merge branch 'twitter' into 'master'

Twitter

Twitter Crawl 구현

See merge request !3
1 +현재 검색 기능 구현 완료와 더불어
2 +검색 속도 향상 완료
...\ No newline at end of file ...\ No newline at end of file
1 +적합하지 않은 webtoon 브랜치 삭제
2 +twitter branch 새로 구현
3 +
4 +추가로 twitter에서 댓글 받아오는 것을 아이디, 날짜, 내용, 링크로 구성된
5 +딕셔너리로 만듬
6 +
7 +이를 이용해서 더 구현 예정
...\ No newline at end of file ...\ No newline at end of file
1 +import GetOldTweets3 as got
2 +from bs4 import BeautifulSoup
3 +
4 +import datetime
5 +import time
6 +from random import uniform
7 +from tqdm import tqdm_notebook
8 +
9 +def get_tweets(criteria):
10 + tweet = got.manager.TweetManager.getTweets(criteria)
11 + tweet_list = []
12 +
13 + for index in tqdm_notebook(tweet):
14 +
15 + # 메타데이터 목록
16 + username = index.username
17 + link = index.permalink
18 + content = index.text
19 + tweet_date = index.date.strftime("%Y-%m-%d")
20 + retweets = index.retweets
21 + favorites = index.favorites
22 +
23 + # 결과 합치기
24 + info_list = {'username' : username, 'text': content, 'time': tweet_date, 'link': link}
25 + tweet_list.append(info_list)
26 + # 휴식
27 + time.sleep(uniform(1,2))
28 + print("====================================")
29 + if(len(tweet_list) == 0):
30 + print("조건에 맞는 tweet이 없습니다.")
31 + else:
32 + print(tweet_list)
33 + print("====================================")
34 +days_range = []
35 +
36 +start = datetime.datetime.strptime("2019-11-25", "%Y-%m-%d")
37 +end = datetime.datetime.strptime("2019-11-26", "%Y-%m-%d")
38 +date_generated = [start + datetime.timedelta(days=x) for x in range(0, (end-start).days)]
39 +
40 +for date in date_generated:
41 + days_range.append(date.strftime("%Y-%m-%d"))
42 +print("=== 기본으로 설정된 트윗 수집 기간은 {} 에서 {} 까지 입니다 ===".format(days_range[0], days_range[-1]))
43 +print("=== 총 {}일 간의 데이터 수집 ===".format(len(days_range)))
44 +
45 +# 수집 기간 맞추기
46 +start_date = days_range[0]
47 +end_date = (datetime.datetime.strptime(days_range[-1], "%Y-%m-%d")
48 + + datetime.timedelta(days=1)).strftime("%Y-%m-%d") # setUntil이 끝을 포함하지 않으므로, day + 1
49 +
50 +my_key = input("검색할 키워드를 입력해주세요: ")
51 +
52 +while(True):
53 + temp1 = "현재 검색어는 " + my_key + "입니다. "
54 + print(temp1)
55 + print("기간은 기본적으로 최근 1일입니다.")
56 + print("빠른 검색을 지원하기 위해 최대 50건까지만 표시됩니다.")
57 + print("1. 닉네임을 통한 검색")
58 + print("2. 키워드를 통한 검색")
59 + print("3. 시간을 통한 검색")
60 + print("4. 종료")
61 + userNum = int(input("무엇을 하시겠습니까?: "))
62 +
63 + if userNum == 1:
64 + nick = input("검색할 닉네임을 입력해주세요: ")
65 + print("1. 최근 10개만 보기")
66 + print("2. 해당 닉네임의 트윗 50건 보기")
67 + print("3. 현재 검색어를 적용시켜 보기")
68 + tweetNum = int(input("무엇을 하시겠습니까?: "))
69 + if(tweetNum == 1):
70 + tweetCriteria = got.manager.TweetCriteria().setUsername(nick)\
71 + .setSince(start_date)\
72 + .setUntil(end_date)\
73 + .setMaxTweets(10)
74 + get_tweets(tweetCriteria)
75 + elif(tweetNum == 2):
76 + tweetCriteria = got.manager.TweetCriteria().setUsername(nick)\
77 + .setSince(start_date)\
78 + .setUntil(end_date)\
79 + .setMaxTweets(50)
80 + get_tweets(tweetCriteria)
81 + elif(tweetNum == 3):
82 + tweetCriteria = got.manager.TweetCriteria().setUsername(nick)\
83 + .setQuerySearch(my_key)\
84 + .setSince(start_date)\
85 + .setUntil(end_date)\
86 + .setMaxTweets(50)
87 + get_tweets(tweetCriteria)
88 + else:
89 + print("잘못된 보기를 선택하셨습니다.")
90 + elif userNum == 2:
91 + my_key = input("검색할 키워드를 입력해주세요: ")
92 + tweetCriteria = got.manager.TweetCriteria().setQuerySearch(my_key)\
93 + .setSince(start_date)\
94 + .setUntil(end_date)\
95 + .setMaxTweets(50)
96 + get_tweets(tweetCriteria)
97 + elif userNum == 3:
98 + user_start = int(input("시작일을 입력해주세요(yyyymmdd형태): "))
99 + if(user_start < 20170000 or user_start > 20191200):
100 + print("최근 3년 이내만 검색가능합니다.")
101 + continue
102 + user_end = int(input("종료일을 입력해주세요(yyyymmdd형태): "))
103 + if(user_end > 20191200):
104 + print("미래로 갈 수는 없습니다.")
105 + continue
106 + elif(user_end < user_start):
107 + print("시작일보다 작을 수 없습니다.")
108 + continue
109 + if(user_end - 8 > user_start):
110 + print("최대 1주일까지 검색이 가능합니다.")
111 + continue
112 + else:
113 + start_year = user_start // 10000
114 + start_month = user_start // 100 - start_year * 100
115 + start_day = user_start - start_year * 10000 - start_month * 100
116 + end_year = user_end // 10000
117 + end_month = user_end // 100 - end_year * 100
118 + end_day = user_end - end_year * 10000 - end_month * 100
119 + d1 = str(start_year) + "-" + str(start_month) + "-" + str(start_day)
120 + # d2는 보여주기용, d3는 실제 코드에 넣기용(코드에 넣을때는 +1을 해줘야 한다.)
121 + d2 = str(end_year) + "-" + str(end_month) + "-" + str(end_day)
122 + d3 = str(end_year) + "-" + str(end_month) + "-" + str(end_day + 1)
123 + print("1. 현재 검색어를 적용시켜 검색")
124 + print("2. 다른 검색어를 적용시켜 검색")
125 + myNum = int(input("무엇을 선택하시겠습니까?: "))
126 + if(myNum == 1):
127 + print("1. 닉네임을 적용시켜 검색")
128 + print("2. 닉네임 상관없이 전부 검색")
129 + myNum1 = int(input("무엇을 선택하시겠습니까?: "))
130 + if(myNum1 == 1):
131 + nick2 = input("검색할 닉네임을 입력해주세요: ")
132 + tweetCriteria = got.manager.TweetCriteria().setUsername(nick)\
133 + .setQuerySearch(my_key)\
134 + .setSince(d1)\
135 + .setUntil(d3)\
136 + .setMaxTweets(50)
137 + elif(myNum1 == 2):
138 + tweetCriteria = got.manager.TweetCriteria().setQuerySearch(my_key)\
139 + .setSince(d1)\
140 + .setUntil(d3)\
141 + .setMaxTweets(50)
142 + else:
143 + print("잘못된 입력입니다.")
144 + continue
145 + elif(myNum == 2):
146 + my_key = input("검색할 키워드를 입력해주세요: ")
147 + print("1. 닉네임을 적용시켜 검색")
148 + print("2. 닉네임 상관없이 전부 검색")
149 + myNum2 = int(input("무엇을 선택하시겠습니까?: "))
150 + if(myNum2 == 1):
151 + nick2 = input("검색할 닉네임을 입력해주세요: ")
152 + tweetCriteria = got.manager.TweetCriteria().setUsername(nick)\
153 + .setQuerySearch(my_key)\
154 + .setSince(d1)\
155 + .setUntil(d3)\
156 + .setMaxTweets(50)
157 + elif(myNum2 == 2):
158 + tweetCriteria = got.manager.TweetCriteria().setQuerySearch(my_key)\
159 + .setSince(d1)\
160 + .setUntil(d3)\
161 + .setMaxTweets(50)
162 + else:
163 + print("잘못된 입력입니다.")
164 + continue
165 + else:
166 + print("잘못된 입력입니다.")
167 + continue
168 + print("=== 현재 설정된 트윗 수집 기간은 {} 에서 {} 까지 입니다 ===".format(d1, d2))
169 + print("=== 총 {}일 간의 데이터 수집 ===".format(user_end - user_start))
170 + get_tweets(tweetCriteria)
171 + elif userNum == 4:
172 + break
173 + else:
174 + print("잘못된 입력입니다.")
175 + continue