2011年11月21日月曜日

【Python】入門ソーシャルデータ

オライリーの「入門ソーシャルデータ」を購入。



早速、第1章を読んで楽しもう!
。。。って思ったところ、1.2.1のtwitter ウェブAPIのラッパーを取得して、「Twitterの検索トレンドの取得」ってとこではまった。。。w

ターミナルで、

>>> import twitter
>>> twitter_api = twitter.Twitter(domain="api.twitter.com", api_version='1')
>>> trends = twitter_api.trends()

って本では入れるようになってるけど、どうにも

Traceback (most recent call last):
File "", line 1, in
File "/Library/Python/2.7/site-packages/twitter-1.7.1-py2.7.egg/twitter/api.py", line 155, in __call__
File "/Library/Python/2.7/site-packages/twitter-1.7.1-py2.7.egg/twitter/api.py", line 170, in _handle_response
twitter.api.TwitterHTTPError: Twitter sent status 404 for URL: 1/trends.json using parameters: ()
details:

ってエラーを吐いてるよ。。。orz

ってか「status 404 for URL:」って書いてあるよ?
あれ??
そんなわけで、Twitter本家のサイトを見に行くと、


うん、リクエストURL違うね?w

ラッパーだと、1/trends.json
でも、公式ガイドだと、1/trends/1.json

www


ってことで、仕方なく、easy_installしたtwitterのラッパーの「api.py」を見に行き、該当箇所を修正。
まぁ「api.py」の121行目の「uri = '/'.join(uriparts)」の後に改行いれて、122行目に「uri = uri + '/1'」っていれてあげるだけなんだけどね。

これで
(略)
>>> trends = twitter_api.trends()
っていれてもエラーはかなくなった!うん、よし!

で、続けて本にある通り、
>>> [ trend['name'] for trend in trends['trends'] ]
とリスト内包表記で、Go!!

。。。っと??またエラーだよ?w

>>> [trend['name'] for trend in trends['trends']]
Traceback (most recent call last):
File "", line 1, in
TypeError: list indices must be integers, not str

んーー??
インデックスエラー??

そんなわけで、さっき代入したtrendsの中を見てみる。

>>> trends
[{u'created_at': u'2011-11-20T16:32:46Z', u'as_of': u'2011-11-20T16:38:38Z', u'trends': [{u'url': u'http://twitter.com/search/%23HappyBirthdayJaxon', u'query': u'%23HappyBirthdayJaxon', u'events': None, u'promoted_content': None, u'name': u'#HappyBirthdayJaxon'}, {u'url': u'http://twitter.com/search/%22Katy%20is%20AMAzing%22', u'query': u'%22Katy%20is%20AMAzing%22', u'name': u'Katy is AMAzing', u'promoted_content': None, u'events': None}, {u'url': u'http://twitter.com/search/%23excaz', u'query': u'%23excaz', u'events': None, u'promoted_content': None, u'name': u'#excaz'}, {u'url': u'http://twitter.com/search/%22Get%20Ariana%20On%20Ellen%22', u'query': u'%22Get%20Ariana%20On%20Ellen%22', u'events': None, u'promoted_content': None, u'name': u'Get Ariana On Ellen'}, {u'url': u'http://twitter.com/search/%23MaisFeioQueORonaldinho', u'query': u'%23MaisFeioQueORonaldinho', u'events': None, u'promoted_content': None, u'name': u'#MaisFeioQueORonaldinho'}, {u'url': u'http://twitter.com/search/%22Edgar%20Allen%20Poe%22', u'query': u'%22Edgar%20Allen%20Poe%22', u'events': None, u'promoted_content': None, u'name': u'Edgar Allen Poe'}, {u'url': u'http://twitter.com/search/%22Excelsior%20-%20AZ%22', u'query': u'%22Excelsior%20-%20AZ%22', u'name': u'Excelsior - AZ', u'promoted_content': None, u'events': None}, {u'url': u'http://twitter.com/search/Jaxon', u'query': u'Jaxon', u'events': None, u'promoted_content': None, u'name': u'Jaxon'}, {u'url': u'http://twitter.com/search/%22David%20Luiz%22', u'query': u'%22David%20Luiz%22', u'events': None, u'promoted_content': None, u'name': u'David Luiz'}, {u'url': u"http://twitter.com/search/AMA's", u'query': u"AMA's", u'events': None, u'promoted_content': None, u'name': u"AMA's"}], u'locations': [{u'woeid': 1, u'name': u'Mundial'}]}]


あや??
u'trends': [{u'url': u'http://twitter.com/search/%23HappyBirthdayJaxon', u'query': u'%23HappyBirthdayJaxon', u'events': None, u'promoted_content': None, u'name': u'#HappyBirthdayJaxon'}, 。。。

ってなってる。

twitterの返してくる形が変わったのかな?

ということで、リスト内包表記を

>>> [ trend[u'name'] for trend in trends[0]["trends"] ]

に変えてあげると、見事、

[u'#HappyBirthdayJaxon', u'Katy is AMAzing', u'#excaz', u'Get Ariana On Ellen', u'#MaisFeioQueORonaldinho', u'Edgar Allen Poe', u'Excelsior - AZ', u'Jaxon', u'David Luiz', u"AMA's"]

本が期待してる結果になったね!!


真夜中にこんなハマるとは思わなかったw

そんなわけで、今日はここで寝ることに。

さてさて、明日もがんばるぞー!





追記:
また不具合起きたので、コードを追加しました。
こちら

0 件のコメント:

コメントを投稿