質問編集履歴
6
修正
test
CHANGED
File without changes
|
test
CHANGED
@@ -1,6 +1,4 @@
|
|
1
|
-
### twitterにてある人物の発言に対してのAPIを利用してリプライを抽出し、
|
2
|
-
|
3
|
-
|
1
|
+
###、MySQLに格納したいと思っています。
|
4
2
|
|
5
3
|
|
6
4
|
|
@@ -52,117 +50,15 @@
|
|
52
50
|
|
53
51
|
ATS = '*****************************************'
|
54
52
|
|
55
|
-
|
53
|
+
|
56
54
|
|
57
|
-
|
55
|
+
#接続
|
58
56
|
|
59
|
-
screen_name = '*********'
|
60
|
-
|
61
|
-
# 検索時のパラメーター
|
62
|
-
|
63
|
-
count = 100 # 一回あたりの検索数(最大100/デフォルトは15)
|
64
|
-
|
65
|
-
range = 100 # 検索回数の上限値(最大180/15分でリセット)
|
66
|
-
|
67
|
-
# ツイート検索・リプライの抽出
|
68
|
-
|
69
|
-
tweets = search_tweets(CK, CKS, AT, ATS, user_id, screen_name, count, range)
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
url = "https://api.twitter.com/1.1/search/tweets.json"
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
def search_tweets(CK, CKS, AT, ATS, user_id, screen_name, count, range):
|
80
|
-
|
81
|
-
# 文字列設定
|
82
|
-
|
83
|
-
user_id += ' exclude:retweets' # RTは除く
|
84
|
-
|
85
|
-
user_id = urllib.parse.quote_plus(user_id)
|
86
|
-
|
87
|
-
# リクエスト
|
88
|
-
|
89
|
-
url = "https://api.twitter.com/1.1/search/tweets.json?lang=ja&q="+user_id+"&count="+str(count)
|
90
|
-
|
91
|
-
auth = OAuth1(CK, CKS, AT, ATS)
|
92
|
-
|
93
|
-
response = requests.get(url, auth=auth)
|
94
|
-
|
95
|
-
data = response.json()
|
96
|
-
|
97
|
-
if not 'statuses' in data:
|
98
|
-
|
99
|
-
print(data)# {'errors': [{'message': 'Rate limit exceeded', 'code': 88}]}
|
100
|
-
|
101
|
-
sys.exit() #
|
102
|
-
|
103
|
-
data = data['statuses']
|
104
|
-
|
105
|
-
#print(response)
|
106
|
-
|
107
|
-
# 2回目以降のリクエスト
|
108
|
-
|
109
|
-
cnt = 0
|
110
|
-
|
111
|
-
reply_cnt = 0
|
112
|
-
|
113
|
-
tweets = []
|
114
|
-
|
115
|
-
while True:
|
116
|
-
|
117
|
-
if len(data) == 0:
|
118
|
-
|
119
|
-
break
|
120
|
-
|
121
|
-
cnt += 1
|
122
|
-
|
123
|
-
if cnt > range:
|
124
|
-
|
125
|
-
break
|
126
|
-
|
127
|
-
for tweet in data:
|
128
|
-
|
129
|
-
if tweet['in_reply_to_screen_name'] == screen_name: # スクリーンネームに一致するものを抽出
|
130
|
-
|
131
|
-
tweets.append(tweet['text']) # ツイート内容
|
132
|
-
|
133
|
-
reply_cnt += 1
|
134
|
-
|
135
|
-
maxid = int(tweet["id"]) - 1
|
136
|
-
|
137
|
-
url = "https://api.twitter.com/1.1/search/tweets.json?lang=ja&q="+user_id+"&count="+str(count)+"&max_id="+str(maxid)
|
138
|
-
|
139
|
-
response = requests.get(url, auth=auth)
|
140
|
-
|
141
|
-
try:
|
142
|
-
|
143
|
-
data = response.json()['statuses']
|
144
|
-
|
145
|
-
except KeyError: # リクエスト回数が上限に達した場合のデータのエラー処理
|
146
|
-
|
147
|
-
print('上限まで検索しました')
|
148
|
-
|
149
|
-
break
|
150
|
-
|
151
|
-
print('検索回数 :', cnt)
|
152
|
-
|
153
|
-
print('リプライ数 :', reply_cnt)
|
154
|
-
|
155
|
-
# print(tweets)
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
#MYSQLに接続
|
160
|
-
|
161
|
-
conn = MySQLdb.connect(host='localhost',user='root',passwd='abcdefg',db='
|
57
|
+
conn = MySQLdb.connect(host='localhost',user='root',passwd='abcdefg',db='aaa',')
|
162
58
|
|
163
59
|
c = conn.cursor()
|
164
60
|
|
165
|
-
|
61
|
+
|
166
62
|
|
167
63
|
c.execute("INSERT INTO tweet(user_id,content) VALUES(%s,%s)")
|
168
64
|
|
@@ -170,21 +66,13 @@
|
|
170
66
|
|
171
67
|
conn.commit()
|
172
68
|
|
173
|
-
conn.close()
|
174
|
-
|
175
|
-
return tweets
|
176
69
|
|
177
70
|
|
178
71
|
|
179
72
|
|
180
73
|
|
181
|
-
if __name__ == '__main__':
|
182
74
|
|
183
75
|
main()
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
76
|
|
189
77
|
```
|
190
78
|
|
5
コードの修正
test
CHANGED
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
MySQLにデータが格納できない
|
test
CHANGED
@@ -1,4 +1,6 @@
|
|
1
|
-
### twitterにてある人物の発言に対してのAPIを利用してリプライを抽出し
|
1
|
+
### twitterにてある人物の発言に対してのAPIを利用してリプライを抽出し、
|
2
|
+
|
3
|
+
結果をMySQLに格納したいと思っています。
|
2
4
|
|
3
5
|
|
4
6
|
|
@@ -6,29 +8,23 @@
|
|
6
8
|
|
7
9
|
|
8
10
|
|
9
|
-
|
11
|
+
### 発生している問題・エラーメッセージ
|
10
12
|
|
11
|
-
|
13
|
+
raise ProgrammingError(str(m))
|
14
|
+
|
15
|
+
MySQLdb._exceptions.ProgrammingError: not all arguments converted during bytes formatting
|
12
16
|
|
13
17
|
|
14
18
|
|
19
|
+
上記のように表示され、抽出結果をMySQLに格納できません。
|
15
20
|
|
16
|
-
|
17
|
-
|
21
|
+
データをMySQLに格納するためにはどうすればよろしでしょうか
|
18
22
|
|
19
23
|
|
20
24
|
|
21
25
|
|
22
26
|
|
23
27
|
|
24
|
-
|
25
|
-
<Response [200]>
|
26
|
-
|
27
|
-
上限まで検索しました
|
28
|
-
|
29
|
-
検索回数 : 78
|
30
|
-
|
31
|
-
リプライ数 : 0
|
32
28
|
|
33
29
|
|
34
30
|
|
@@ -40,15 +36,7 @@
|
|
40
36
|
|
41
37
|
|
42
38
|
|
43
|
-
import urllib
|
44
39
|
|
45
|
-
from requests_oauthlib import OAuth1Session, OAuth1
|
46
|
-
|
47
|
-
import requests
|
48
|
-
|
49
|
-
import sys
|
50
|
-
|
51
|
-
import MySQLdb
|
52
40
|
|
53
41
|
|
54
42
|
|
@@ -68,37 +56,17 @@
|
|
68
56
|
|
69
57
|
user_id = '@@*********'
|
70
58
|
|
71
|
-
|
59
|
+
screen_name = '*********'
|
72
60
|
|
73
61
|
# 検索時のパラメーター
|
74
62
|
|
75
|
-
count = 100 # 一回あたりの検索数(最大100/デフォルトは15)
|
63
|
+
count = 100 # 一回あたりの検索数(最大100/デフォルトは15)
|
76
64
|
|
77
65
|
range = 100 # 検索回数の上限値(最大180/15分でリセット)
|
78
66
|
|
79
67
|
# ツイート検索・リプライの抽出
|
80
68
|
|
81
|
-
tweets = search_tweets(CK, CKS, AT, ATS, user_id, count, range)
|
69
|
+
tweets = search_tweets(CK, CKS, AT, ATS, user_id, screen_name, count, range)
|
82
|
-
|
83
|
-
#MYSQLに接続
|
84
|
-
|
85
|
-
conn = MySQLdb.connect(host='localhost',user='root',passwd='*******',db='*****', charset='utf8mb4')
|
86
|
-
|
87
|
-
c = conn.cursor()
|
88
|
-
|
89
|
-
#テーブルの作成(2回目以降の実行では不要)すでに作成しているのでコメントアウト
|
90
|
-
|
91
|
-
# c.execute('''
|
92
|
-
|
93
|
-
# CREATE TABLE tweet(
|
94
|
-
|
95
|
-
# user_id bigint,
|
96
|
-
|
97
|
-
# content text
|
98
|
-
|
99
|
-
# )
|
100
|
-
|
101
|
-
#''')
|
102
70
|
|
103
71
|
|
104
72
|
|
@@ -108,15 +76,7 @@
|
|
108
76
|
|
109
77
|
|
110
78
|
|
111
|
-
# 抽出結果を表示
|
112
|
-
|
113
|
-
# print(tweets)
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
def search_tweets(CK, CKS, AT, ATS, user_id, count, range):
|
79
|
+
def search_tweets(CK, CKS, AT, ATS, user_id, screen_name, count, range):
|
120
80
|
|
121
81
|
# 文字列設定
|
122
82
|
|
@@ -138,7 +98,7 @@
|
|
138
98
|
|
139
99
|
print(data)# {'errors': [{'message': 'Rate limit exceeded', 'code': 88}]}
|
140
100
|
|
141
|
-
sys.exit() #
|
101
|
+
sys.exit() #
|
142
102
|
|
143
103
|
data = data['statuses']
|
144
104
|
|
@@ -166,7 +126,7 @@
|
|
166
126
|
|
167
127
|
for tweet in data:
|
168
128
|
|
169
|
-
if tweet['in_reply_to_screen_name'] ==
|
129
|
+
if tweet['in_reply_to_screen_name'] == screen_name: # スクリーンネームに一致するものを抽出
|
170
130
|
|
171
131
|
tweets.append(tweet['text']) # ツイート内容
|
172
132
|
|
@@ -192,21 +152,27 @@
|
|
192
152
|
|
193
153
|
print('リプライ数 :', reply_cnt)
|
194
154
|
|
155
|
+
# print(tweets)
|
156
|
+
|
157
|
+
|
158
|
+
|
195
159
|
#MYSQLに接続
|
196
160
|
|
197
|
-
conn = MySQLdb.connect(host='localhost',user='root',passwd='
|
161
|
+
conn = MySQLdb.connect(host='localhost',user='root',passwd='abcdefg',db='tweetdata', charset='utf8mb4')
|
198
162
|
|
199
163
|
c = conn.cursor()
|
200
164
|
|
165
|
+
#ユーザ名,ツイートの内容をMysqlに入れていく
|
166
|
+
|
201
|
-
c.execute(
|
167
|
+
c.execute("INSERT INTO tweet(user_id,content) VALUES(%s,%s)")
|
168
|
+
|
169
|
+
cursor.close()
|
202
170
|
|
203
171
|
conn.commit()
|
204
172
|
|
173
|
+
conn.close()
|
174
|
+
|
205
175
|
return tweets
|
206
|
-
|
207
|
-
#ユーザ名,ツイートの内容をMysqlに入れていく
|
208
|
-
|
209
|
-
|
210
176
|
|
211
177
|
|
212
178
|
|
4
db
test
CHANGED
File without changes
|
test
CHANGED
@@ -194,7 +194,7 @@
|
|
194
194
|
|
195
195
|
#MYSQLに接続
|
196
196
|
|
197
|
-
conn = MySQLdb.connect(host='localhost',user='root',passwd='
|
197
|
+
conn = MySQLdb.connect(host='localhost',user='root',passwd='*******',db='tweetdata', charset='utf8mb4')
|
198
198
|
|
199
199
|
c = conn.cursor()
|
200
200
|
|
3
rerurn tweet の位置を修正
test
CHANGED
File without changes
|
test
CHANGED
@@ -132,9 +132,17 @@
|
|
132
132
|
|
133
133
|
response = requests.get(url, auth=auth)
|
134
134
|
|
135
|
+
data = response.json()
|
136
|
+
|
137
|
+
if not 'statuses' in data:
|
138
|
+
|
139
|
+
print(data)# {'errors': [{'message': 'Rate limit exceeded', 'code': 88}]}
|
140
|
+
|
141
|
+
sys.exit() # あるいはちゃんとSleepする
|
142
|
+
|
135
|
-
data =
|
143
|
+
data = data['statuses']
|
136
|
-
|
144
|
+
|
137
|
-
print(response)
|
145
|
+
#print(response)
|
138
146
|
|
139
147
|
# 2回目以降のリクエスト
|
140
148
|
|
@@ -158,7 +166,7 @@
|
|
158
166
|
|
159
167
|
for tweet in data:
|
160
168
|
|
161
|
-
if tweet['in_reply_to_s
|
169
|
+
if tweet['in_reply_to_screen_name'] == user_id: # ユーザーIDに一致するものを抽出
|
162
170
|
|
163
171
|
tweets.append(tweet['text']) # ツイート内容
|
164
172
|
|
@@ -184,13 +192,21 @@
|
|
184
192
|
|
185
193
|
print('リプライ数 :', reply_cnt)
|
186
194
|
|
195
|
+
#MYSQLに接続
|
196
|
+
|
197
|
+
conn = MySQLdb.connect(host='localhost',user='root',passwd='kanamar89',db='tweetdata', charset='utf8mb4')
|
198
|
+
|
199
|
+
c = conn.cursor()
|
200
|
+
|
201
|
+
c.execute('INSERT INTO tweet(user_id,content) VALUES(%s,%s)',(tweet['user_id'],content['content']))
|
202
|
+
|
203
|
+
conn.commit()
|
204
|
+
|
187
205
|
return tweets
|
188
206
|
|
189
207
|
#ユーザ名,ツイートの内容をMysqlに入れていく
|
190
208
|
|
191
|
-
|
209
|
+
|
192
|
-
|
193
|
-
conn.commit()
|
194
210
|
|
195
211
|
|
196
212
|
|
@@ -202,6 +218,8 @@
|
|
202
218
|
|
203
219
|
|
204
220
|
|
221
|
+
|
222
|
+
|
205
223
|
```
|
206
224
|
|
207
225
|
|
2
コードの修正
test
CHANGED
File without changes
|
test
CHANGED
@@ -8,226 +8,198 @@
|
|
8
8
|
|
9
9
|
Pythonでコードを書いています。
|
10
10
|
|
11
|
-
ある人物のツイートに対しての返信をAPIを利用して抽出を実装中
|
11
|
+
ある人物のツイートに対しての返信をAPIを利用して抽出を実装中ですが抽出できない状況です
|
12
|
-
|
13
|
-
|
12
|
+
|
13
|
+
|
14
14
|
|
15
15
|
|
16
16
|
|
17
17
|
### 発生している問題・エラーメッセージ
|
18
18
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
19
|
+
|
20
|
+
|
21
|
+
|
22
|
+
|
23
|
+
|
24
|
+
|
25
|
+
<Response [200]>
|
26
|
+
|
27
|
+
上限まで検索しました
|
28
|
+
|
29
|
+
検索回数 : 78
|
30
|
+
|
31
|
+
リプライ数 : 0
|
32
|
+
|
33
|
+
|
34
|
+
|
35
|
+
### 該当のソースコード
|
36
|
+
|
37
|
+
|
38
|
+
|
39
|
+
```Python
|
40
|
+
|
41
|
+
|
42
|
+
|
43
|
+
import urllib
|
44
|
+
|
45
|
+
from requests_oauthlib import OAuth1Session, OAuth1
|
46
|
+
|
47
|
+
import requests
|
48
|
+
|
49
|
+
import sys
|
50
|
+
|
51
|
+
import MySQLdb
|
52
|
+
|
53
|
+
|
54
|
+
|
55
|
+
|
56
|
+
|
57
|
+
def main():
|
58
|
+
|
59
|
+
CK = '*****************************************'
|
60
|
+
|
61
|
+
CKS = '*****************************************'
|
62
|
+
|
63
|
+
AT = '*****************************************'
|
64
|
+
|
65
|
+
ATS = '*****************************************'
|
66
|
+
|
67
|
+
# ユーザー・ツイートID
|
68
|
+
|
69
|
+
user_id = '@@*********'
|
70
|
+
|
71
|
+
#tweet_id = 'コメントアウトしました' # str型で指定
|
72
|
+
|
73
|
+
# 検索時のパラメーター
|
74
|
+
|
75
|
+
count = 100 # 一回あたりの検索数(最大100/デフォルトは15)
|
76
|
+
|
77
|
+
range = 100 # 検索回数の上限値(最大180/15分でリセット)
|
78
|
+
|
79
|
+
# ツイート検索・リプライの抽出
|
80
|
+
|
81
|
+
tweets = search_tweets(CK, CKS, AT, ATS, user_id, count, range)
|
82
|
+
|
83
|
+
#MYSQLに接続
|
84
|
+
|
85
|
+
conn = MySQLdb.connect(host='localhost',user='root',passwd='*******',db='*****', charset='utf8mb4')
|
86
|
+
|
87
|
+
c = conn.cursor()
|
88
|
+
|
89
|
+
#テーブルの作成(2回目以降の実行では不要)すでに作成しているのでコメントアウト
|
90
|
+
|
91
|
+
# c.execute('''
|
92
|
+
|
93
|
+
# CREATE TABLE tweet(
|
94
|
+
|
95
|
+
# user_id bigint,
|
96
|
+
|
97
|
+
# content text
|
98
|
+
|
99
|
+
# )
|
100
|
+
|
101
|
+
#''')
|
102
|
+
|
103
|
+
|
104
|
+
|
105
|
+
url = "https://api.twitter.com/1.1/search/tweets.json"
|
106
|
+
|
107
|
+
|
108
|
+
|
109
|
+
|
110
|
+
|
111
|
+
# 抽出結果を表示
|
112
|
+
|
113
|
+
# print(tweets)
|
114
|
+
|
115
|
+
|
116
|
+
|
117
|
+
|
118
|
+
|
119
|
+
def search_tweets(CK, CKS, AT, ATS, user_id, count, range):
|
120
|
+
|
121
|
+
# 文字列設定
|
122
|
+
|
123
|
+
user_id += ' exclude:retweets' # RTは除く
|
124
|
+
|
125
|
+
user_id = urllib.parse.quote_plus(user_id)
|
126
|
+
|
127
|
+
# リクエスト
|
128
|
+
|
129
|
+
url = "https://api.twitter.com/1.1/search/tweets.json?lang=ja&q="+user_id+"&count="+str(count)
|
130
|
+
|
131
|
+
auth = OAuth1(CK, CKS, AT, ATS)
|
132
|
+
|
133
|
+
response = requests.get(url, auth=auth)
|
134
|
+
|
135
|
+
data = response.json()['statuses']
|
136
|
+
|
137
|
+
print(response)
|
138
|
+
|
139
|
+
# 2回目以降のリクエスト
|
140
|
+
|
141
|
+
cnt = 0
|
142
|
+
|
143
|
+
reply_cnt = 0
|
144
|
+
|
145
|
+
tweets = []
|
146
|
+
|
147
|
+
while True:
|
148
|
+
|
149
|
+
if len(data) == 0:
|
150
|
+
|
151
|
+
break
|
152
|
+
|
153
|
+
cnt += 1
|
154
|
+
|
155
|
+
if cnt > range:
|
156
|
+
|
157
|
+
break
|
158
|
+
|
159
|
+
for tweet in data:
|
160
|
+
|
161
|
+
if tweet['in_reply_to_status_id_str'] == user_id: # ユーザーIDに一致するものを抽出
|
162
|
+
|
163
|
+
tweets.append(tweet['text']) # ツイート内容
|
164
|
+
|
165
|
+
reply_cnt += 1
|
166
|
+
|
167
|
+
maxid = int(tweet["id"]) - 1
|
168
|
+
|
169
|
+
url = "https://api.twitter.com/1.1/search/tweets.json?lang=ja&q="+user_id+"&count="+str(count)+"&max_id="+str(maxid)
|
170
|
+
|
171
|
+
response = requests.get(url, auth=auth)
|
172
|
+
|
173
|
+
try:
|
174
|
+
|
175
|
+
data = response.json()['statuses']
|
176
|
+
|
177
|
+
except KeyError: # リクエスト回数が上限に達した場合のデータのエラー処理
|
178
|
+
|
179
|
+
print('上限まで検索しました')
|
180
|
+
|
181
|
+
break
|
182
|
+
|
183
|
+
print('検索回数 :', cnt)
|
184
|
+
|
185
|
+
print('リプライ数 :', reply_cnt)
|
186
|
+
|
187
|
+
return tweets
|
188
|
+
|
189
|
+
#ユーザ名,ツイートの内容をMysqlに入れていく
|
190
|
+
|
191
|
+
c.execute('INSERT INTO tweet(user_id,content) VALUES(%s,%s)',(tweet['user_id'],content['content']))
|
192
|
+
|
193
|
+
conn.commit()
|
194
|
+
|
195
|
+
|
196
|
+
|
197
|
+
|
198
|
+
|
199
|
+
if __name__ == '__main__':
|
42
200
|
|
43
201
|
main()
|
44
202
|
|
45
|
-
File "twiiter.py", line 26, in main
|
46
|
-
|
47
|
-
c.execute('''
|
48
|
-
|
49
|
-
File "/Users/.pyenv/versions/3.8.3/lib/python3.8/site-packages/MySQLdb/cursors.py", line 206, in execute
|
50
|
-
|
51
|
-
res = self._query(query)
|
52
|
-
|
53
|
-
File "/Users/.pyenv/versions/3.8.3/lib/python3.8/site-packages/MySQLdb/cursors.py", line 319, in _query
|
54
|
-
|
55
|
-
db.query(q)
|
56
|
-
|
57
|
-
File "/Users/.pyenv/versions/3.8.3/lib/python3.8/site-packages/MySQLdb/connections.py", line 259, in query
|
58
|
-
|
59
|
-
_mysql.connection.query(self, query)
|
60
|
-
|
61
|
-
MySQLdb._exceptions.ProgrammingError: (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ',\n content text\n )' at line 2")
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
### 該当のソースコード
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
```Python
|
70
|
-
|
71
|
-
import urllib
|
72
|
-
|
73
|
-
from requests_oauthlib import OAuth1Session, OAuth1
|
74
|
-
|
75
|
-
import requests
|
76
|
-
|
77
|
-
import sys
|
78
|
-
|
79
|
-
import MySQLdb
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
def main():
|
86
|
-
|
87
|
-
CK = '*****************************************'
|
88
|
-
|
89
|
-
CKS = '*****************************************'
|
90
|
-
|
91
|
-
AT = '*****************************************'
|
92
|
-
|
93
|
-
ATS = '*****************************************'
|
94
|
-
|
95
|
-
# ユーザー・ツイートID
|
96
|
-
|
97
|
-
user_id = '@@********'
|
98
|
-
|
99
|
-
tweet_id = '1234456789012' # str型で指定
|
100
|
-
|
101
|
-
# 検索時のパラメーター
|
102
|
-
|
103
|
-
count = 100 # 一回あたりの検索数(最大100/デフォルトは15)
|
104
|
-
|
105
|
-
range = 100 # 検索回数の上限値(最大180/15分でリセット)
|
106
|
-
|
107
|
-
# ツイート検索・リプライの抽出
|
108
|
-
|
109
|
-
tweets = search_tweets(CK, CKS, AT, ATS, user_id, tweet_id, count, range)
|
110
|
-
|
111
|
-
#MYSQLに接続
|
112
|
-
|
113
|
-
conn = MySQLdb.connect(host='localhost',user='root',passwd='*****',db='tweetdata', charset='utf8mb4')
|
114
|
-
|
115
|
-
c = conn.cursor()
|
116
|
-
|
117
|
-
#テーブルの作成(2回目以降の実行では不要)
|
118
|
-
|
119
|
-
c.execute('''
|
120
|
-
|
121
|
-
CREATE TABLE tweet(
|
122
|
-
|
123
|
-
user_id,
|
124
|
-
|
125
|
-
content text
|
126
|
-
|
127
|
-
)
|
128
|
-
|
129
|
-
''')
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
url = "https://api.twitter.com/1.1/search/tweets.json"
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
# 抽出結果を表示
|
140
|
-
|
141
|
-
# print(tweets)
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
def search_tweets(CK, CKS, AT, ATS, user_id, tweet_id, count, range):
|
148
|
-
|
149
|
-
# 文字列設定
|
150
|
-
|
151
|
-
user_id += ' exclude:retweets' # RTは除く
|
152
|
-
|
153
|
-
user_id = urllib.parse.quote_plus(user_id)
|
154
|
-
|
155
|
-
# リクエスト
|
156
|
-
|
157
|
-
url = "https://api.twitter.com/1.1/search/tweets.json?lang=ja&q="+user_id+"&count="+str(count)
|
158
|
-
|
159
|
-
auth = OAuth1(CK, CKS, AT, ATS)
|
160
|
-
|
161
|
-
response = requests.get(url, auth=auth)
|
162
|
-
|
163
|
-
data = response.json()['statuses']
|
164
|
-
|
165
|
-
print(response)
|
166
|
-
|
167
|
-
# 2回目以降のリクエスト
|
168
|
-
|
169
|
-
cnt = 0
|
170
|
-
|
171
|
-
reply_cnt = 0
|
172
|
-
|
173
|
-
tweets = []
|
174
|
-
|
175
|
-
while True:
|
176
|
-
|
177
|
-
if len(data) == 0:
|
178
|
-
|
179
|
-
break
|
180
|
-
|
181
|
-
cnt += 1
|
182
|
-
|
183
|
-
if cnt > range:
|
184
|
-
|
185
|
-
break
|
186
|
-
|
187
|
-
for tweet in data:
|
188
|
-
|
189
|
-
if tweet['in_reply_to_status_id_str'] == tweet_id: # ツイートIDに一致するものを抽出
|
190
|
-
|
191
|
-
tweets.append(tweet['text']) # ツイート内容
|
192
|
-
|
193
|
-
reply_cnt += 1
|
194
|
-
|
195
|
-
maxid = int(tweet["id"]) - 1
|
196
|
-
|
197
|
-
url = "https://api.twitter.com/1.1/search/tweets.json?lang=ja&q="+user_id+"&count="+str(count)+"&max_id="+str(maxid)
|
198
|
-
|
199
|
-
response = requests.get(url, auth=auth)
|
200
|
-
|
201
|
-
try:
|
202
|
-
|
203
|
-
data = response.json()['statuses']
|
204
|
-
|
205
|
-
except KeyError: # リクエスト回数が上限に達した場合のデータのエラー処理
|
206
|
-
|
207
|
-
print('上限まで検索しました')
|
208
|
-
|
209
|
-
break
|
210
|
-
|
211
|
-
print('検索回数 :', cnt)
|
212
|
-
|
213
|
-
print('リプライ数 :', reply_cnt)
|
214
|
-
|
215
|
-
return tweets
|
216
|
-
|
217
|
-
#ユーザ名,ツイートの内容をMysqlに入れていく
|
218
|
-
|
219
|
-
c.execute('INSERT INTO tweet(user_id,content) VALUES(%s,%s)',(tweet['user_id'],content['content']))
|
220
|
-
|
221
|
-
conn.commit()
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
if __name__ == '__main__':
|
228
|
-
|
229
|
-
main()
|
230
|
-
|
231
203
|
|
232
204
|
|
233
205
|
```
|
1
main関数の前半部の更新
test
CHANGED
File without changes
|
test
CHANGED
@@ -68,6 +68,52 @@
|
|
68
68
|
|
69
69
|
```Python
|
70
70
|
|
71
|
+
import urllib
|
72
|
+
|
73
|
+
from requests_oauthlib import OAuth1Session, OAuth1
|
74
|
+
|
75
|
+
import requests
|
76
|
+
|
77
|
+
import sys
|
78
|
+
|
79
|
+
import MySQLdb
|
80
|
+
|
81
|
+
|
82
|
+
|
83
|
+
|
84
|
+
|
85
|
+
def main():
|
86
|
+
|
87
|
+
CK = '*****************************************'
|
88
|
+
|
89
|
+
CKS = '*****************************************'
|
90
|
+
|
91
|
+
AT = '*****************************************'
|
92
|
+
|
93
|
+
ATS = '*****************************************'
|
94
|
+
|
95
|
+
# ユーザー・ツイートID
|
96
|
+
|
97
|
+
user_id = '@@********'
|
98
|
+
|
99
|
+
tweet_id = '1234456789012' # str型で指定
|
100
|
+
|
101
|
+
# 検索時のパラメーター
|
102
|
+
|
103
|
+
count = 100 # 一回あたりの検索数(最大100/デフォルトは15)
|
104
|
+
|
105
|
+
range = 100 # 検索回数の上限値(最大180/15分でリセット)
|
106
|
+
|
107
|
+
# ツイート検索・リプライの抽出
|
108
|
+
|
109
|
+
tweets = search_tweets(CK, CKS, AT, ATS, user_id, tweet_id, count, range)
|
110
|
+
|
111
|
+
#MYSQLに接続
|
112
|
+
|
113
|
+
conn = MySQLdb.connect(host='localhost',user='root',passwd='*****',db='tweetdata', charset='utf8mb4')
|
114
|
+
|
115
|
+
c = conn.cursor()
|
116
|
+
|
71
117
|
#テーブルの作成(2回目以降の実行では不要)
|
72
118
|
|
73
119
|
c.execute('''
|