结论

好了,现在我们来到了这个部分。你有了一个异步工作的小抓取器。这意味着多个页面可以同时被下载,所以这个例子要比使用请求的相同代码快3倍。现在你应该可以用相同的方法写出你自己的抓取器了。

你可以在这里找到生成的代码,也包括一些额外的建议。

你一旦熟悉了这一切,我建议你看一看asyncio的文档和aiohttp的范例,这些都能告诉你 asyncio拥有怎样的潜力。

这种方法事实上是所有手动的方法)的一个局限在于,没有一个独立的库可以用来处理表单。机械化的方法拥有很多辅助工具,这使得提交表单变得十分简单,但是如果你不使用它们,你将不得不自己去处理这些事情。这可能会导致一些bug的出现,所以同时我可能会写一个这样的库不过目前为止无需为此担心)。

额外的建议:不要敲打服务器

同时做3个请求很酷,但是同时做5000个就不那么好玩了。如果你打算同时做太多的请求,链接有可能会断掉。你甚至有可能会被禁止链接网络。

为了避免这些,你可以使用semaphore。这是一个可以被用来限制同时工作的协同程序数量的同步工具。我们只需要在建立循环之前创建一个semaphore ,同时把我们希望允许的同时请求的数量作为参数传给它既可:

  1. sem = asyncio.Semaphore(5

然后,我们只需要将下面

  1. page = yield from get(url, compress=True)  

替换成被semaphore 保护的同样的东西。

  1. with (yield from sem):  
  2.     page = yield from get(url, compress=True

这就可以保证同时最多有5个请求会被处理。

额外建议:进度条

这个东东是免费的哦:tqdm是一个用来生成进度条的优秀的库。这个协同程序就像asyncio.wait一样工作,不过会显示一个代表完成度的进度条。

  1. @asyncio.coroutine  
  2. def wait_with_progress(coros):  
  3.     for f in tqdm.tqdm(asyncio.as_completed(coros), total=len(coros)):  
  4.         yield from f 

译文链接: http://blog.jobbole.com/63897/


评论关闭