在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
方法恢复任务。