如何用Python获取指定用户的所有推文及属性?
我正在尝试从Twitter获取数据,使用Tweepy这个库,通过命令行输入的用户名来获取。我想提取很多关于用户和状态的数据,所以我写了以下代码:
注意,我已经正确导入了所有需要的模块,并且有oauth和密钥(这里没有包含这些信息),文件名也是正确的,只是做了些修改:
# define user to get tweets for. accepts input from user
user = tweepy.api.get_user(input("Please enter the twitter username: "))
# Display basic details for twitter user name
print (" ")
print ("Basic information for", user.name)
print ("Screen Name:", user.screen_name)
print ("Name: ", user.name)
print ("Twitter Unique ID: ", user.id)
print ("Account created at: ", user.created_at)
timeline = api.user_timeline(screen_name=user, include_rts=True, count=100)
for tweet in timeline:
print ("ID:", tweet.id)
print ("User ID:", tweet.user.id)
print ("Text:", tweet.text)
print ("Created:", tweet.created_at)
print ("Geo:", tweet.geo)
print ("Contributors:", tweet.contributors)
print ("Coordinates:", tweet.coordinates)
print ("Favorited:", tweet.favorited)
print ("In reply to screen name:", tweet.in_reply_to_screen_name)
print ("In reply to status ID:", tweet.in_reply_to_status_id)
print ("In reply to status ID str:", tweet.in_reply_to_status_id_str)
print ("In reply to user ID:", tweet.in_reply_to_user_id)
print ("In reply to user ID str:", tweet.in_reply_to_user_id_str)
print ("Place:", tweet.place)
print ("Retweeted:", tweet.retweeted)
print ("Retweet count:", tweet.retweet_count)
print ("Source:", tweet.source)
print ("Truncated:", tweet.truncated)
我希望最终能够遍历一个用户的所有推文(最多3200条)。不过先从基础开始。目前我遇到了两个问题,关于转发推文时出现了以下错误信息:
Please enter the twitter username: barackobamaTraceback (most recent call last):
File " usertimeline.py", line 64, in <module>
timeline = api.user_timeline(screen_name=user, count=100, page=1)
File "C:\Python32\lib\site-packages\tweepy-1.4-py3.2.egg\tweepy\binder.py", line 153, in _call
raise TweepError(error_msg)
tweepy.error.TweepError: Twitter error response: status code = 401
Traceback (most recent call last):
File "usertimeline.py", line 42, in <module>
user = tweepy.api.get_user(input("Please enter the twitter username: "))
File "C:\Python32\lib\site-packages\tweepy-1.4-py3.2.egg\tweepy\binder.py", line 153, in _call
raise TweepError(error_msg)
tweepy.error.TweepError: Twitter error response: status code = 404
将用户名作为变量传递似乎也有问题:
Traceback (most recent call last):
File " usertimleline.py", line 64, in <module>
timeline = api.user_timeline(screen_name=user, count=100, page=1)
File "C:\Python32\lib\site-packages\tweepy-1.4-py3.2.egg\tweepy\binder.py", line 153, in _call
raise TweepError(error_msg)
tweepy.error.TweepError: Twitter error response: status code = 401
我已经把这两个错误分开了,也就是说它们并不是一起出现的。
请原谅我的无知,我对Twitter的API不是很熟悉,但我正在快速学习。Tweepy的文档真的很糟糕,我在网上查了很多资料,就是无法解决这个问题。如果我能解决这个问题,我会发布一些文档。
我知道如何在提取数据后将其转移到MySQL数据库中(它会这样做,而不是打印到屏幕上),并且可以对数据进行处理,以便我能用它做一些事情,问题在于如何提取数据。有没有人有什么建议,或者我应该考虑其他方法吗?
非常感谢任何帮助。谢谢!
编辑:
根据@Eric Olson今天早上的建议,我做了以下操作。
1) 创建了一组全新的Oauth凭证进行测试。
2) 将代码复制到一个新的脚本中,如下所示:
Oauth
consumer_key = "(removed)"
consumer_secret = "(removed)"
access_key="88394805-(removed)"
access_secret="(removed)"
auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_key, access_secret)
api=tweepy.API(auth)
# confirm account being used for OAuth
print ("API NAME IS: ", api.me().name)
api.update_status("Using Tweepy from the command line")
第一次运行这个脚本时,它工作得很好,更新了我的状态,并返回了API名称,如下所示:
>>>
API NAME IS: Chris Howden
但从那时起我就遇到了这个问题:
Traceback (most recent call last):
File "C:/Users/Chris/Dropbox/Uni_2012-3/6CC995 - Independent Studies/Scripts/get Api name and update status.py", line 19, in <module>
api.update_status("Using Tweepy frm the command line")
File "C:\Python32\lib\site-packages\tweepy-1.4-py3.2.egg\tweepy\binder.py", line 153, in _call
raise TweepError(error_msg)
tweepy.error.TweepError: Twitter error response: status code = 403
我能想到的唯一原因是它拒绝了生成的访问令牌。我不应该需要更新访问令牌,对吧?
2 个回答
你收到的是401的响应,这意味着“未授权”。 (查看HTTP状态码)
你的代码看起来没问题。我在我之前的例子中使用 api.user_timeline(screen_name="some_screen_name")
也能正常工作。
我猜你可能需要授权这个应用,或者你的OAuth设置有些问题。
也许你已经找到过这个了,但这是我最开始用的简短代码示例: https://github.com/nloadholtes/tweepy/blob/nloadholtes-examples/examples/oauth.py
如果你愿意尝试其他库,可以试试rauth。这里已经有一个Twitter的示例,不过如果你觉得麻烦,只想要一个可以直接用的例子,我会这样修改那个演示脚本:
from rauth import OAuth1Service
# Get a real consumer key & secret from https://dev.twitter.com/apps/new
twitter = OAuth1Service(
name='twitter',
consumer_key='J8MoJG4bQ9gcmGh8H7XhMg',
consumer_secret='7WAscbSy65GmiVOvMU5EBYn5z80fhQkcFWSLMJJu4',
request_token_url='https://api.twitter.com/oauth/request_token',
access_token_url='https://api.twitter.com/oauth/access_token',
authorize_url='https://api.twitter.com/oauth/authorize',
base_url='https://api.twitter.com/1/')
request_token, request_token_secret = twitter.get_request_token()
authorize_url = twitter.get_authorize_url(request_token)
print 'Visit this URL in your browser: ' + authorize_url
pin = raw_input('Enter PIN from browser: ')
session = twitter.get_auth_session(request_token,
request_token_secret,
method='POST',
data={'oauth_verifier': pin})
params = {'screen_name': 'github', # User to pull Tweets from
'include_rts': 1, # Include retweets
'count': 10} # 10 tweets
r = session.get('statuses/user_timeline.json', params=params)
for i, tweet in enumerate(r.json(), 1):
handle = tweet['user']['screen_name'].encode('utf-8')
text = tweet['text'].encode('utf-8')
print '{0}. @{1} - {2}'.format(i, handle, text)
你可以直接运行这个代码,但一定要记得更新你的账号信息!这些信息只是用来演示的。
顺便说一下,我是rauth的维护者。