0

我有以下代码,其中我正在抓取多个网站:

while len(newData) > 0:
    for i in newData:
        try:
            thread.start_new_thread(download, (i))
        except Exception, thread.error:
            pass

但是我的问题是它每次都在重复和抓取每个网站几次。在下载功能内部,一旦下载完成,我会从 newData 中删除 url,因此不应打开更多线程。一旦完成某项任务,如何杀死所有尝试执行某项任务的线程?这是我第一次尝试线程,不确定我是否以正确的方式执行此操作。

4

2 回答 2

1

与其自己做,不如创建一个队列。将包含启动任务所需的所有数据的对象放入队列中。创建一个等待队列中元素的工人池。让他们将结果放入另一个(输出/结果)队列。

启动时,创建包含 URL 等的数据对象,并将它们全部放入队列中。

然后你只需要等待结果进入输出队列。

于 2013-10-03T14:58:29.693 回答
0

首先,您可能想查看http://scrapy.org/,这是一个很棒的网络抓取框架。

正如你现在所做的那样,你需要编写线程管理器来保存所有线程的句柄,并使用某种符号表示里面的内容(如 url 的校验和),一旦完成某些校验和,就会杀死其他线程与所述校验和。

但是请记住,像这样杀死线程并不是一个好主意,更好的解决方案是实现一个队列,以确保您不会解析重复项并仅为这些线程创建线程。官方手册中有一些很好的工作池和队列示例,请看一下。

于 2013-10-03T14:58:11.687 回答