如何将容错引入美丽的汤中

时间:2014-12-24 09:27:30

标签: python beautifulsoup

我有兴趣尽快抓取很多不同的网站。 URL可能有任何数量的网页抓取问题;例如,他们可能会引用文件而不是网站,或者他们可能根本不指任何真实的东西。我无法解决的问题是当BeautifulSoup挂起或由于某种原因失败并且无法退出时该怎么办。如果在X秒之后它似乎无法执行,那么需要有一种方法来停止html解析。这似乎非常重要,但似乎我不是唯一一个,这个网站似乎提供了最相关的信息:http://eli.thegreenplace.net/2011/08/22/how-not-to-set-a-timeout-on-a-computation-in-python

所以,鉴于在一段时间过后很难杀死诸如BeautifulSoup(文本)之类的悬挂过程,我该怎么办?

1 个答案:

答案 0 :(得分:0)

在bs4中没有某种内置功能,你总是可以使用多处理。

In [1]: from bs4 import BeautifulSoup

In [2]: from multiprocessing import Pool

In [3]: p = Pool(1)

In [4]: j = p.apply_async(BeautifulSoup, ["<html></html>"])

In [5]: j.get(timeout=5)
Out[5]: <html></html>

编辑:解释

如果没有支持bs4解析超时的内置功能,那么多处理是你唯一的选择,因为如果你要天真地运行它只是说

BeautifulSoup(html)

然后你将在一个python进程中运行此指令。如果在这个过程中,你的任何一条指令都失败了它只是咀嚼CPU并且没有退出那么你就会看到它发生,因为它在你的shell里面,并且不可避免地会出现挫败感。在你的情况下bs4可能会遇到某种类型的循环试图解析你的html,所以如果你在没有多处理的情况下运行它,那么你没有任何追索权而不是a。杀死这个过程,b。等待过程结束。

多处理允许您摆脱单一流程范例。多处理将生成在创建池时在后台运行的新python实例。生成的实例数与您分配给池的工作数相对应。在我们的例子中,我们只给了一个工人池。多处理基本上表示,如果其后台进程之一需要太长时间才能从命令返回一些结果,我们可以选择将其终止。这基本上就是你在这里所做的。

Pool.map,Pool.apply和Pool.apply_async之间的区别最好留给documentation。 map函数对你正在做的事情没有真正的目的,因为你只需要一个线程来完成你的工作。 apply可以正常工作,但它本质上是一个同步动作,它等待结果在继续之前返回。 apply_async是异步的,这意味着它可以并行执行工作。我不确定您对您工作的具体要求是什么,所以我将决定使用哪种功能。