我想从twitter下载tweet作为使用Python Twitter API进行情绪分析的数据集。
我正在使用SemEval 2016任务6数据集。所以我下载了“Domain corpus for task B”,我发现了一个描述步骤的自述文件..
我只是一个初学者,我在python中不太了解..我安装了python 3.4.3,我已经在脚本文件夹中找到了easy_install.exe和pip.exe ..
我输入了cmd:“easy_install twitter”,因为它是用自述文件写的...然后我尝试应用自述文件中的步骤,以下是步骤:
第一次运行时,它应该打开一个Web浏览器,让您登录
Twitter,并显示一个PIN码,供您输入
生成的提示脚本。
使用您的默认浏览器中的用户名登录Twitter。
运行此类脚本下载您的凭据:
python download_tweets_api.py --dist=Donald_Trump.txt -- output=downloaded_Donald_Trump.txt
- 醇>
下载这样的推文:
python download_tweets_api.py --dist=Donald_Trump.txt --output=downloaded_Donald_Trump.txt
我完成了第1步,然后输入了cmd“download_tweets_api.py --dist = Donald_Trump.txt --output = downloaded_Donald_Trump.txt”,但我在文件的最后一行收到错误
TypeError:序列项1:预期的str实例,找到的字节
以下是“download_tweets_api.py”文件的内容
import sys
import os
import time
import datetime
import argparse
from twitter import *
parser = argparse.ArgumentParser(description="downloads tweets")
parser.add_argument('--partial', dest='partial', default=None, type=argparse.FileType('r'))
parser.add_argument('--dist', dest='dist', default=None, type=argparse.FileType('r'), required=True)
parser.add_argument('--output', dest='output', default=None,type=argparse.FileType('w'), required=True)
args = parser.parse_args()
CONSUMER_KEY='xxxxxxxxxxx'
CONSUMER_SECRET='xxxxxxxxxxxxxxxxx'
MY_TWITTER_CREDS = os.path.expanduser('~/.my_app_credentials')
if not os.path.exists(MY_TWITTER_CREDS):
oauth_dance("Semeval sentiment analysis", CONSUMER_KEY, CONSUMER_SECRET, MY_TWITTER_CREDS)
oauth_token, oauth_secret = read_token_file(MY_TWITTER_CREDS)
t = Twitter(auth=OAuth(oauth_token, oauth_secret, CONSUMER_KEY, CONSUMER_SECRET))
cache = {}
if args.partial != None:
for line in args.partial:
fields = line.strip().split("\t")
text = fields[-1]
sid = fields[0]
cache[sid] = text
for line in args.dist:
fields = line.strip().split('\t')
sid = fields[0]
while not sid in cache:
try:
text = t.statuses.show(_id=sid)['text'].replace('\n', ' ').replace('\r', ' ')
cache[sid] = text.encode('utf-8')
except TwitterError as e:
if e.e.code == 429:
rate = t.application.rate_limit_status()
reset = rate['resources']['statuses']['/statuses/show/:id'] ['reset']
now = datetime.datetime.today()
future = datetime.datetime.fromtimestamp(reset)
seconds = (future-now).seconds+1
if seconds < 10000:
sys.stderr.write("Rate limit exceeded, sleeping for %s seconds until %s\n" % (seconds, future))
time.sleep(seconds)
else:
cache[sid] = 'Not Available'
text = cache[sid]
args.output.write("\t".join(fields + [text]) + '\n')
请注意,您可以在“domain corpus for task B”中找到download_tweets_api.py和自述文件
答案 0 :(得分:0)
问题出在download_tweets_api.py
脚本的最后一行。该脚本是用Python 2编写的,可能会在Python 2中无缝运行。它在Python 3中运行的主要原因是最后一行是尝试join
字符串的字符串。但是,在Python 3中,bytes
明显与strings
不同,因为您不能将字节连接到字符串而不将其强制转换为另一个字符串。对于此脚本,text
变量或fields
变量(或两者)都是字节元素。因此,在对其应用字符串text
函数之前,您可能必须修改变量fields
和join
。
基本上,您必须使用以下内容替换脚本的最后一行:
#Create a function that converts the byte elements of the list fields into strings.
def convert(s):
try:
return str(s,encoding='utf8')
except:
return s
text = convert(text)
fields = list(map(lambda x: convert(x), fields))
args.output.write("\t".join(fields + [text]) + '\n')
如果您不想修改脚本,则可能必须在Python 2中运行它,或使用2to3
模块将代码转换为Python 3。
希望这有帮助。