使用 Tweepy 提取主题标签以进入 MySQLdb
Extracting hashtags using Tweepy to go into MySQLdb
我是一个完全的编程菜鸟,正在尝试配置 Twitter-Tweepy-MySQL 收集机制。我已经查看了很多关于此的类似帖子,但我无法完全得到答案,所以我希望我不会在这里重复......
我对我得到的基本脚本很满意 运行,现在我正在尝试改进它以构建我想要的确切模式。
我花了几个令人沮丧的时间来整理主题标签提取。我可以提取一个主题标签 ok - 问题是一条推文通常有六个,我需要它们。我的问题是它们是 Tweet 对象中数组的一部分,我不太明白如何告诉 Python 将它们全部提取出来并填充 MySQL。我很确定我需要使用其中一个条件,但不能让 TRY 或 IF 在每个主题标签行上工作...
当你看我的脚本时,请不要笑,如下 - 我知道它非常业余,但 YouTube 只能带你到此为止。我希望我想做的事情很明显,我会留下评论来展示我以前的一些尝试/想法。
非常感谢任何建议!罗宾
脚本如下:
from tweepy import Stream
from tweepy import OAuthHandler
from tweepy.streaming import StreamListener
import MySQLdb
import time
import json
conn = MySQLdb.connect("snarf","snarf","snarf","snarf", charset='utf8')
c = conn.cursor()
#consumer key, consumer secret, access token, access secret.
ckey = 'snarf'
csecret = 'snarf'
atoken = 'snarf'
asecret = 'snarf'
class listener(StreamListener):
def on_data(self, data):
try:
tweet = json.loads(data)
screen_name = tweet["user"]["screen_name"]
created_at = tweet ["created_at"]
identity = tweet ["id"]
text = tweet ["text"]
hashtag1 = tweet ["entities"]["hashtags"][0]["text"]
#hashtag2 = tweet ["entities"]["hashtags"][1]["text"]
#hashtag3 = tweet ["entities"]["hashtags"][2]["text"]
#hashtag4 = tweet ["entities"]["hashtags"][3]["text"]
#hashtag5 = tweet ["entities"]["hashtags"][4]["text"]
#URL1 = tweet ["entities"]["urls"][0]["expanded_url"]
#URL2 = tweet ["entities"]["urls"][1]["expanded_url"]
#URL3 = tweet ["entities"]["urls"][2]["expanded_url"]
#URL4 = tweet ["entities"]["urls"][3]["expanded_url"]
#URL5 = tweet ["entities"]["urls"][4]["expanded_url"]
c.execute("INSERT INTO news (timestamp, screen_name, created_at, id, text, hashtag_1) VALUES (%s,%s,%s,%s,%s,%s)",
(time.time(), screen_name, created_at, identity, text, hashtag1))
conn.commit()
print((text))
return True
except BaseException, e:
print 'failed on data,',str(e)
time.sleep(5)
def on_error(self, status):
print status
auth = OAuthHandler(ckey, csecret)
auth.set_access_token(atoken, asecret)
twitterStream = Stream(auth, listener())
twitterStream.filter(track=["#football", "#soccer"])
您可以像这样使用 for
循环:
hashtags = [] #make an empty list
for hashtag in tweet["entities"]["hashtags"]: #iterate over the list
hashtags.append(hashtag["text"]) #append each hashtag to 'hashtags'
c.execute("INSERT INTO news (timestamp, screen_name, created_at, id, text, hashtag_1) VALUES (%s,%s,%s,%s,%s,%s)", (time.time(), screen_name, created_at, identity, text, str(hashtags)))
它只是遍历主题标签列表并将文本附加到名为 'hashtags' 的列表中。因为我不知道如何在 SQL 数据库中存储未定义长度的列表,所以我基本上使用 str()
将列表转换(序列化)为字符串并将其存储在列 hashtag_1.
如果您正在寻找更详细的 python 课程:我真的很喜欢 codecademy
编辑:
如果推文包含单引号,文本将只被部分保存。随后你应该把下面的代码放在for循环的前面:
#I presume your tweet is saved in the variable text
txt = []
if "'" in text:
for item in text:
if not item=="'":
txt.append(item)
else:
txt.append("''")
text = ''.join(txt)
我是一个完全的编程菜鸟,正在尝试配置 Twitter-Tweepy-MySQL 收集机制。我已经查看了很多关于此的类似帖子,但我无法完全得到答案,所以我希望我不会在这里重复......
我对我得到的基本脚本很满意 运行,现在我正在尝试改进它以构建我想要的确切模式。
我花了几个令人沮丧的时间来整理主题标签提取。我可以提取一个主题标签 ok - 问题是一条推文通常有六个,我需要它们。我的问题是它们是 Tweet 对象中数组的一部分,我不太明白如何告诉 Python 将它们全部提取出来并填充 MySQL。我很确定我需要使用其中一个条件,但不能让 TRY 或 IF 在每个主题标签行上工作...
当你看我的脚本时,请不要笑,如下 - 我知道它非常业余,但 YouTube 只能带你到此为止。我希望我想做的事情很明显,我会留下评论来展示我以前的一些尝试/想法。
非常感谢任何建议!罗宾
脚本如下:
from tweepy import Stream
from tweepy import OAuthHandler
from tweepy.streaming import StreamListener
import MySQLdb
import time
import json
conn = MySQLdb.connect("snarf","snarf","snarf","snarf", charset='utf8')
c = conn.cursor()
#consumer key, consumer secret, access token, access secret.
ckey = 'snarf'
csecret = 'snarf'
atoken = 'snarf'
asecret = 'snarf'
class listener(StreamListener):
def on_data(self, data):
try:
tweet = json.loads(data)
screen_name = tweet["user"]["screen_name"]
created_at = tweet ["created_at"]
identity = tweet ["id"]
text = tweet ["text"]
hashtag1 = tweet ["entities"]["hashtags"][0]["text"]
#hashtag2 = tweet ["entities"]["hashtags"][1]["text"]
#hashtag3 = tweet ["entities"]["hashtags"][2]["text"]
#hashtag4 = tweet ["entities"]["hashtags"][3]["text"]
#hashtag5 = tweet ["entities"]["hashtags"][4]["text"]
#URL1 = tweet ["entities"]["urls"][0]["expanded_url"]
#URL2 = tweet ["entities"]["urls"][1]["expanded_url"]
#URL3 = tweet ["entities"]["urls"][2]["expanded_url"]
#URL4 = tweet ["entities"]["urls"][3]["expanded_url"]
#URL5 = tweet ["entities"]["urls"][4]["expanded_url"]
c.execute("INSERT INTO news (timestamp, screen_name, created_at, id, text, hashtag_1) VALUES (%s,%s,%s,%s,%s,%s)",
(time.time(), screen_name, created_at, identity, text, hashtag1))
conn.commit()
print((text))
return True
except BaseException, e:
print 'failed on data,',str(e)
time.sleep(5)
def on_error(self, status):
print status
auth = OAuthHandler(ckey, csecret)
auth.set_access_token(atoken, asecret)
twitterStream = Stream(auth, listener())
twitterStream.filter(track=["#football", "#soccer"])
您可以像这样使用 for
循环:
hashtags = [] #make an empty list
for hashtag in tweet["entities"]["hashtags"]: #iterate over the list
hashtags.append(hashtag["text"]) #append each hashtag to 'hashtags'
c.execute("INSERT INTO news (timestamp, screen_name, created_at, id, text, hashtag_1) VALUES (%s,%s,%s,%s,%s,%s)", (time.time(), screen_name, created_at, identity, text, str(hashtags)))
它只是遍历主题标签列表并将文本附加到名为 'hashtags' 的列表中。因为我不知道如何在 SQL 数据库中存储未定义长度的列表,所以我基本上使用 str()
将列表转换(序列化)为字符串并将其存储在列 hashtag_1.
如果您正在寻找更详细的 python 课程:我真的很喜欢 codecademy
编辑:
如果推文包含单引号,文本将只被部分保存。随后你应该把下面的代码放在for循环的前面:
#I presume your tweet is saved in the variable text
txt = []
if "'" in text:
for item in text:
if not item=="'":
txt.append(item)
else:
txt.append("''")
text = ''.join(txt)