2011年11月21日月曜日

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

前回に引き続き、オライリーの入門ソーシャルデータに関して。

前回は、p6の例1−3で不具合があったので、修正した。
修正箇所は、easy_installしたtwitterのAPIラッパーの、api.pyの121行目あたりにちょろっと手を加えた。
夜も遅かったし、そこで寝てしまったんだけど、次の日、更に進めて行く上で、そのすぐしたの例1−4ですぐにこの手を加えた場所でエラーが起きた。。。

原因はsearch_.twitter.comとapi.twitter.comに投げるリクエストURIの形が違うから、前のをapi.twitter.comだけに都合のよいように書き換えたら、search.twitter.comの方にリクエストを投げるときに不具合が発生するためのよう。。。


そんなわけで、api.pyの121行目あたり、uri = '/'.join(uriparts) の後に次のように継ぎ足す。

uri = '/'.join(uriparts)
if self.domain == "api.twitter.com":
uri = uri + '/1'


これで一応、本で期待している通りには今のところ動く。

また書き直しがあるかな。。。??

【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

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

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





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