使用HTML和Web API

许多网站都有一些通过JSON或其他格式提供数据的公共API。通过Python访问这些API的办法有不少。一个简单易用的办法(推荐)是requests包(http://docs.python-requests.org)。为了在Twitter上搜索"python pandas",我们可以发送一个HTTP GET请求,如下所示:

  1. In [944]: import requests
  2.  
  3. In [945]: url = 'http://search.twitter.com/search.json?q=python%20pandas'
  4.  
  5. In [946]: resp = requests.get(url)
  6.  
  7. In [947]: resp
  8. Out[947]: <Response [200]>

Response对象的text属性含有GET请求的内容。许多Web API返回的都是JSON字符串,我们必须将其加载到一个Python对象中:

  1. In [948]: import json
  2.  
  3. In [949]: data = json.loads(resp.text)
  4.  
  5. In [950]: data.keys()
  6. Out[950]:
  7. [u'next_page',
  8. u'completed_in',
  9. u'max_id_str',
  10. u'since_id_str',
  11. u'refresh_url',
  12. u'results',
  13. u'since_id',
  14. u'results_per_page',
  15. u'query',
  16. u'max_id',
  17. u'page']

响应结果中的results字段含有一组tweet,每条tweet被表示为一个Python字典,如下所示:

  1. {u'created_at': u'Mon, 25 Jun 2012 17:50:33 +0000',
  2. u'from_user': u'wesmckinn',
  3. u'from_user_id': 115494880,
  4. u'from_user_id_str': u'115494880',
  5. u'from_user_name': u'Wes McKinney',
  6. u'geo': None,
  7. u'id': 217313849177686018,
  8. u'id_str': u'217313849177686018',
  9. u'iso_language_code': u'pt',
  10. u'metadata': {u'result_type': u'recent'},
  11. u'source': u'<a href="http://twitter.com/">web</a>',
  12. u'text': u'Lunchtime pandas-fu http://t.co/SI70xZZQ #pydata',
  13. u'to_user': None,
  14. u'to_user_id': 0,
  15. u'to_user_id_str': u'0',
  16. u'to_user_name': None}

我们用一个列表定义出感兴趣的tweet字段,然后将results列表传给DataFrame:

  1. In [951]: tweet_fields = ['created_at', 'from_user', 'id', 'text']
  2.  
  3. In [952]: tweets = DataFrame(data['results'], columns=tweet_fields)
  4.  
  5. In [953]: tweets
  6. Out[953]:
  7. <class 'pandas.core.frame.DataFrame'>
  8. Int64Index: 15 entries, 0 to 14
  9. Data columns:
  10. created_at 15 non-null values
  11. from_user 15 non-null values
  12. id 15 non-null values
  13. text 15 non-null values
  14. dtypes: int64(1), object(3)

现在,DataFrame中的每一行就有了来自一条tweet的数据:

  1. In [121]: tweets.ix[7]
  2. Out[121]:
  3. created_at Thu, 23 Jul 2012 09:54:00 +0000
  4. from_user deblike
  5. id 227419585803059201
  6. text pandas: powerful Python data analysis toolkit
  7. Name: 7

要想能够直接得到便于分析的DataFrame对象,只需再多费些精力创建出对常见Web API的更高级接口即可。