我有以下代码,我正在抓取多个网站:
while len(newData) > 0:
for i in newData:
try:
thread.start_new_thread(download, (i))
except Exception, thread.error:
pass
然而我的问题是它正在重复并且每个网站每次都要抓几次。在下载函数下载后,我从newData中删除了url,因此不再打开任何线程。如果已经完成某个任务,我该如何杀死所有尝试执行某个任务的线程?这是我第一次尝试线程,并且不确定我是否以正确的方式执行此操作。
答案 0 :(得分:1)
不要自己动手,而是创建一个队列。将对象放入队列中,其中包含启动任务所需的所有数据。创建一个等待队列中元素的工作池。让他们将结果放入另一个(输出/结果)队列。
启动时,创建包含URL等的数据对象,并将它们全部放入队列中。
然后你只需要等待结果进入输出队列。
答案 1 :(得分:0)
首先,您可能需要查看http://scrapy.org/这是一个很好的网页抓取框架。
正如你现在所做的那样,你需要编写一个线程管理器,它将把握所有这些句柄的句柄,里面有一些符号(比如url的校验和),一旦确定了check-sum就完成了kill带有所述校验和的其他线程。
但请记住,杀死这样的线程并不是一个好主意,更好的解决方案是实现一个队列,这将确保你不会解析重复项并仅为那些创建线程。有一些nice examples of worker pooling and queues in the official manual所以看看。