Python异步HTTP请求

7

我正在尝试在Python中使用Twitter搜索Web服务。我想调用一个类似于以下的Web服务:

http://search.twitter.com/search.json?q=blue%20angels&rpp=5&include_entities=true&result_type=mixed

来自我的 Python 程序。

有人能告诉我:

  1. 如何在 Python 中使用 xmlhttprequest 对象?

  2. 如何向它传递参数?

  3. 如何以字典形式获取数据?

这是我的尝试:

import urllib
import sys
url = "http://search.twitter.com/search.json?q=blue%20angels&rpp=5&include_entities=true&result_type=mixed"
urlobj = urllib.urlopen(url)
data = urlobj.read()
print data

感谢您的选择。

你可以使用http://eventlet.net/doc/进行异步调用。 - dm03514
尝试了urllib和stackoverflow搜索。请随意标记为重复,我很乐意知道可以解决我的问题的重复链接。 - hrishikeshp19
@hrishikeshp19,看起来你正在寻找可以复制粘贴的代码,而不是试图通过理解它来解决这个问题。这通常是被反对的。 - Tomalak
已经编辑以显示我尝试过了什么。 - hrishikeshp19
2个回答

8

您不需要使用“异步http请求”来使用Twitter搜索API:

import json
import urllib
import urllib2

# make query
query = urllib.urlencode(dict(q="blue angel", rpp=5, include_entities=1,
                              result_type="mixed"))  
# make request
resp = urllib2.urlopen("http://search.twitter.com/search.json?" + query)

# make dictionary (parse json response)
d = json.load(resp)

可能有几个库可以提供一个漂亮的OO接口来处理这些http请求。

为了并发地进行多个请求,你可以使用gevent

import gevent
import gevent.monkey; gevent.monkey.patch_all() # patch stdlib

import json
import urllib
import urllib2

def f(querystr):
    query = urllib.urlencode(dict(q=querystr, rpp=5, include_entities=1,
                                  result_type="mixed"))
    resp = urllib2.urlopen("http://search.twitter.com/search.json?" + query)
    d = json.load(resp)
    print('number of results %d' % (len(d['results']),))

jobs = [gevent.spawn(f, q) for q in ['blue angel', 'another query']]
gevent.joinall(jobs) # wait for completion

4
我建议查看 requests 和其 async 模块

简单请求:

import json
import requests

params = {'rpp': 5, 'include_entities': 1, 'result_type': 'mixed',
          'q': 'blue angel'}

r = requests.get('http://search.twitter.com/search.json', params=params)

print json.loads(r.text)

异步:

import json
from requests import async

def add_option_params(args):
    options = {'rpp': 5, 'include_entities': 1, 'result_type': 'mixed'}
    args['params'].update(options)
    return args

requests = []

for search_term in ['test1', 'test2', 'test3']:
    request = async.get('http://search.twitter.com/search.json',
                        params={'q': search_term},
                        hooks={'args': add_option_params})
    requests.append(request)

for result in async.map(requests):
    print result.url, json.loads(result.text)['completed_in']

不幸的是,自从发布这个答案以来,Twitter已经删除了他们的REST API,因此简单请求方法不再适用:Twitter REST API v1不再活跃。请迁移到API v1.1。https://dev.twitter.com/docs/api/1.1/overview. 此外,似乎自那时起,requests中的async也被删除了; ImportError: cannot import name async - ssc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接