Merge branch 'twitter' into 'master'
Twitter Twitter Crawl 구현 See merge request !3
Showing
3 changed files
with
184 additions
and
0 deletions
twitter/now.md
0 → 100644
twitter/readme.md
0 → 100644
twitter/twitter.py
0 → 100644
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 |
-
Please register or login to post a comment