如何在Python中创建异步HTTP GET请求并将响应对象传递给函数

Ker*_*nic 2 python asynchronous http python-requests

更新:问题是文档不完整,事件调度程序将kwargs传递给钩子函数.

我有一个大约30k网址的列表,我想检查各种字符串.我使用Requests&BeautifulSoup有一个这个脚本的工作版本,但它不使用线程或异步请求所以它非常慢.

最后我想要做的是为每个URL缓存html,这样我就可以运行多次检查,而不会向每个站点发出冗余的HTTP请求.如果我有一个存储html的函数,那么异步发送HTTP GET请求然后传递响应对象的最佳方法是什么?

我一直在尝试使用Grequests(如此处所述)和"hooks"参数,但我收到错误,文档也没有深入.所以我希望有更多经验的人可以解释一下.

这是我想要完成的一个简化示例:

import grequests

urls = ['http://www.google.com/finance','http://finance.yahoo.com/','http://www.bloomberg.com/']

def print_url(r):
    print r.url

def async(url_list):
    sites = []
    for u in url_list:
        rs = grequests.get(u, hooks=dict(response=print_url))
        sites.append(rs)
    return grequests.map(sites)

print async(urls)
Run Code Online (Sandbox Code Playgroud)

它会产生以下TypeError:

TypeError: print_url() got an unexpected keyword argument 'verify'
<Greenlet at 0x32803d8L: <bound method AsyncRequest.send of <grequests.AsyncRequest object at 0x00000000028D2160>>
(stream=False)> failed with TypeError
Run Code Online (Sandbox Code Playgroud)

不确定为什么它默认将'verify'作为关键字参数发送; 得到一些有用的东西会很棒,所以如果有人有任何建议(使用问候或其他)请分享:)

提前致谢.

Mat*_*ias 11

我尝试了你的代码,可以通过在你的print_url函数中添加一个额外的参数kwargs来实现它.

def print_url(r, **kwargs):
    print r.url
Run Code Online (Sandbox Code Playgroud)

我想到了这个其他stackoverlow问题的错误:使用Requests Python包的钩子问题.

看来,当您在grequests中使用响应挂钩时,需要在回调定义中添加**kwargs.