在Python中,可以使用threading
库来实现多线程爬虫。为了实现任务取消和恢复,你可以使用threading.Event
对象。Event
对象可以用来在线程之间传递信号,例如取消或恢复任务。
以下是一个简单的示例,展示了如何使用threading.Event
实现任务取消和恢复:
import threading import requests from bs4 import BeautifulSoup class WebCrawler: def __init__(self, urls, event): self.urls = urls self.event = event self.threads = [] def crawl(self, url): try: response = requests.get(url) if response.status_code == 200: soup = BeautifulSoup(response.text, 'html.parser') print(f"Crawled {url}") else: print(f"Failed to crawl {url}") except Exception as e: print(f"Error while crawling {url}: {e}") def start(self): for url in self.urls: thread = threading.Thread(target=self.crawl, args=(url,)) thread.start() self.threads.append(thread) def cancel(self): self.event.set() def resume(self): self.event.clear() def join(self): for thread in self.threads: thread.join() if __name__ == "__main__": urls = [ "https://www.example.com", "https://www.example2.com", "https://www.example3.com" ] event = threading.Event() crawler = WebCrawler(urls, event) # Start crawling crawler.start() # Wait for a while and cancel the task import time time.sleep(5) crawler.cancel() # Wait for all threads to finish crawler.join()
在这个示例中,我们创建了一个名为WebCrawler
的类,它接受一个URL列表和一个Event
对象。crawl
方法用于爬取URL,start
方法用于启动所有线程,cancel
方法用于设置事件以取消任务,resume
方法用于清除事件以恢复任务。join
方法用于等待所有线程完成。
要使用这个类,你需要创建一个WebCrawler
实例,传入URL列表和一个Event
对象。然后,你可以调用start
方法启动爬虫,使用cancel
方法取消任务,以及使用resume
方法恢复任务。