pycurl和许多回调函数

时间:2010-03-04 12:35:21

标签: python libcurl pycurl

我有大的URL列表,我必须并行下载并检查每个响应返回的标题之一。

我可以使用CurlMulti进行并行化。 我可以使用/dev/null作为fb,因为我对身体不感兴趣,只对标题感兴趣。

但我如何检查每个标题?

要接收标头,我必须设置HEADERFUNCTION回调。我知道了。

但是在这个回调函数中我只得到带头的缓冲区。我如何区分一个请求与另一个请求?

我不喜欢创建与URL一样多的回调函数。我应该创建一些类和该类的实例吗?也不是很聪明。

3 个答案:

答案 0 :(得分:1)

我会使用Python内置的httplib和线程模块。我认为不需要第三方模块。

答案 1 :(得分:0)

我知道你在询问pycurl,但我觉得使用它太难了,而且非常麻烦。 API很奇怪。

这是一个twisted示例:

from twisted.web.client import Agent
from twisted.internet import reactor, defer

def get_headers(response, url):
    '''Extract a dict of headers from the response'''
    return url, dict(response.headers.getAllRawHeaders())

def got_everything(all_headers):
    '''print results and end program'''
    print dict(all_headers)
    reactor.stop()

agent = Agent(reactor)
urls = (line.strip() for line in open('urls.txt'))
reqs = [agent.request('HEAD', url).addCallback(get_headers, url) for url in urls if url]
defer.gatherResults(reqs).addCallback(got_everything)
reactor.run()

此示例异步启动所有请求,并收集所有结果。这是一个包含3个网址的文件的输出:

{'http://debian.org': {'Content-Type': ['text/html; charset=iso-8859-1'],
                       'Date': ['Thu, 04 Mar 2010 13:27:25 GMT'],
                       'Location': ['http://www.debian.org/'],
                       'Server': ['Apache'],
                       'Vary': ['Accept-Encoding']},
 'http://google.com': {'Cache-Control': ['public, max-age=2592000'],
                       'Content-Type': ['text/html; charset=UTF-8'],
                       'Date': ['Thu, 04 Mar 2010 13:27:25 GMT'],
                       'Expires': ['Sat, 03 Apr 2010 13:27:25 GMT'],
                       'Location': ['http://www.google.com/'],
                       'Server': ['gws'],
                       'X-Xss-Protection': ['0']},
 'http://stackoverflow.com': {'Cache-Control': ['private'],
                              'Content-Type': ['text/html; charset=utf-8'],
                              'Date': ['Thu, 04 Mar 2010 13:27:24 GMT'],
                              'Expires': ['Thu, 04 Mar 2010 13:27:25 GMT'],
                              'Server': ['Microsoft-IIS/7.5']}}

答案 2 :(得分:0)

解决方案是使用一些函数式编程来“粘贴”一些额外的信息到我们的回调函数。

functools.partial