2014-07-02 143 views
1

我昨天写了一个Python网页抓取工具,并在我的终端上一夜之间运行了它。它只有5万页。所以现在我只需要在不同的起点和终点处同时运行一些终端。这工作正常,因为主要滞后显然是打开网页,而不是实际的CPU负载。更优雅的方式来做到这一点?特别是如果它可以在本地完成的话如何运行多线程Python脚本

+1

https://docs.python.org/2/library/multiprocessing.html所有你需要的是 –

+1

Python没有真正的“线程化”。由于GIL出现在CPython上(我假设你正在使用这个),所以你必须使用多处理模块。然而,就你而言,'threading'模块可能是有用的,这取决于你如何抓取这些网站,只是因为它听起来像你是I/O绑定。 –

+2

是的,因为这是I/O绑定的,而不是CPU绑定的,'threading'可能会很好地并行化。你也可以通过['twisted'](https://twistedmatrix.com),['tornado'](http://tornadoweb.org)或['asyncio'](https:// docs.python.org/3/library/asyncio.html)(如果你使用的是Python 3.4)。 – dano

回答

4

你有一个I/O绑定进程,所以为了加速它,你需要同时发送请求。这不一定需要多个处理器,您只需要避免等待一个请求完成后再发送下一个请求。

这个问题有很多解决方案。看看this blog post或退出gevent,asyncio(backports到3.4之前版本的Python应该可用)或另一个异步IO库。

但是,在抓取其他网站时,您必须记住:您可以使用并发编程非常快地发送请求,但根据您要抓取的网站,这可能非常粗鲁。您可以轻松地将一个小型网站完全关闭,从而迫使管理员阻止您。尊重robots.txt,尝试一次性在多台服务器之间分配你的努力,而不是把你的整个带宽集中在一台服务器上,除非你确信你不需要,否则请谨慎调整你对单台服务器的请求。