我有很大的 URL 列表,我必须并行下载并检查每个响应返回的标题之一。
我可以使用CurlMulti进行并行化。我可以/dev/null
用作 fb,因为我对正文不感兴趣,只对标题感兴趣。
但是如何检查每个标题?
要接收标头,我必须设置 HEADERFUNCTION 回调。我明白了。
但是在这个回调函数中,我只得到带有标题的缓冲区。如何区分一个请求和另一个请求?
我不喜欢创建与 URL 一样多的回调函数的想法。我应该创建一些类和该类的尽可能多的实例吗?也不是很聪明。
我会使用 Python 内置的 httplib 和线程模块。我认为不需要第 3 方模块。
解决方案是使用一点函数式编程将一些附加信息“粘贴”到我们的回调函数中。
我知道您在询问 pycurl,但我发现它太难使用且不适合使用。API 很奇怪。
这是一个扭曲的例子:
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 个 url 的文件的输出:
{'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']}}