python:利用asyncio进行快速抓取(1)(2)
结论
好了,现在我们来到了这个部分。你有了一个异步工作的小抓取器。这意味着多个页面可以同时被下载,所以这个例子要比使用请求的相同代码快3倍。现在你应该可以用相同的方法写出你自己的抓取器了。
你可以在这里找到生成的代码,也包括一些额外的建议。
你一旦熟悉了这一切,我建议你看一看asyncio的文档和aiohttp的范例,这些都能告诉你 asyncio拥有怎样的潜力。
这种方法事实上是所有手动的方法)的一个局限在于,没有一个独立的库可以用来处理表单。机械化的方法拥有很多辅助工具,这使得提交表单变得十分简单,但是如果你不使用它们,你将不得不自己去处理这些事情。这可能会导致一些bug的出现,所以同时我可能会写一个这样的库不过目前为止无需为此担心)。
额外的建议:不要敲打服务器
同时做3个请求很酷,但是同时做5000个就不那么好玩了。如果你打算同时做太多的请求,链接有可能会断掉。你甚至有可能会被禁止链接网络。
为了避免这些,你可以使用semaphore。这是一个可以被用来限制同时工作的协同程序数量的同步工具。我们只需要在建立循环之前创建一个semaphore ,同时把我们希望允许的同时请求的数量作为参数传给它既可:
- sem = asyncio.Semaphore(5)
然后,我们只需要将下面
- page = yield from get(url, compress=True)
替换成被semaphore 保护的同样的东西。
- with (yield from sem):
- page = yield from get(url, compress=True)
这就可以保证同时最多有5个请求会被处理。
额外建议:进度条
这个东东是免费的哦:tqdm是一个用来生成进度条的优秀的库。这个协同程序就像asyncio.wait一样工作,不过会显示一个代表完成度的进度条。
- @asyncio.coroutine
- def wait_with_progress(coros):
- for f in tqdm.tqdm(asyncio.as_completed(coros), total=len(coros)):
- yield from f
译文链接: http://blog.jobbole.com/63897/
评论关闭