2

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

我有一个大约 30k URL 的列表,我想检查各种字符串。我有一个使用 Requests & BeautifulSoup 的脚本的工作版本,但它不使用线程或异步请求,因此速度非常慢。

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

我一直在尝试使用 Grequests(如此处所述)和“钩子”参数,但我遇到了错误,并且文档没有深入。所以我希望有更多经验的人可以提供一些启示。

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

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)

它会产生以下类型错误:

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

不知道为什么默认将“验证”作为关键字参数发送;不过,让某些东西工作会很棒,所以如果有人有任何建议(使用 grequests 或其他方式),请分享:)

提前致谢。

4

1 回答 1

11

我尝试了您的代码,并且可以通过向您的 print_url 函数添加一个额外的参数kwargs来使其工作。

def print_url(r, **kwargs):
    print r.url

我在另一个 stackoverlow 问题中发现了问题:Problems with hooks using Requests Python package

似乎当您在 grequests 中使用响应挂钩时,您需要在回调定义中添加 **kwargs 。

于 2013-07-31T18:43:29.050 回答