【问题标题】:python asynchronous httprequestpython异步http请求
【发布时间】:2012-04-03 00:24:34
【问题描述】:

我正在尝试在 python 中使用 twitter 搜索网络服务。我想调用这样的网络服务:

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

来自我的 python 程序。

谁能告诉我

  1. 如何在python中使用xmlhttprequst对象

  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

谢谢。

【问题讨论】:

  • 你可以使用eventlet.net/doc进行异步调用
  • 试过 urllib 和 stackoverflow 搜索。请随时标记为重复,我很高兴知道可以解决我的问题的重复链接。
  • @hrishikeshp19 看来您正在寻找可以复制和粘贴的代码,而不是试图通过理解它来实际解决这个问题。这通常是不受欢迎的。
  • 已编辑以显示我尝试过的内容。

标签: python xmlhttprequest


【解决方案1】:

你不需要“异步httprequest”来使用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)

可能有几个库围绕这些 http 请求提供了一个很好的 OO 接口。

要同时发出多个请求,您可以使用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

【讨论】:

    【解决方案2】:

    我建议您查看requests 及其async module

    简单请求:

    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:The Twitter REST API v1 is no longer active. Please migrate to API v1.1. https://dev.twitter.com/docs/api/1.1/overview. 此外,似乎 async 已从 requests 中删除; ImportError: cannot import name async
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-23
    • 1970-01-01
    • 2022-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-24
    相关资源
    最近更新 更多