面向对象用python写出分布式爬虫示例
时间: 2023-11-19 20:43:02 浏览: 103
下面是一个简单的分布式爬虫示例,使用 Python 的面向对象编程方式实现:
```python
import requests
from bs4 import BeautifulSoup
import threading
import queue
class Crawler:
def __init__(self, urls, num_threads=5):
self.urls = urls
self.num_threads = num_threads
self.queue = queue.Queue()
self.lock = threading.Lock()
self.results = []
def run(self):
# 将所有 URL 放入队列
for url in self.urls:
self.queue.put(url)
# 创建多个线程来处理队列中的 URL
for i in range(self.num_threads):
t = threading.Thread(target=self.fetch)
t.start()
# 等待所有线程完成
for i in range(self.num_threads):
t.join()
return self.results
def fetch(self):
while True:
try:
url = self.queue.get(block=False)
except queue.Empty:
break
try:
response = requests.get(url)
soup = BeautifulSoup(response.content, 'html.parser')
# 对网页进行解析并提取数据
data = self.parse(soup)
with self.lock:
self.results.append(data)
except:
pass
def parse(self, soup):
# 提取网页中的数据
pass
# 示例:爬取多个网页并提取数据
urls = ['http://example.com/page1', 'http://example.com/page2', 'http://example.com/page3']
crawler = Crawler(urls)
data = crawler.run()
print(data)
```
在这个示例中,我们定义了一个 `Crawler` 类,它包含了爬虫的主要逻辑。在 `run` 方法中,我们将所有 URL 放入一个队列中,并创建多个线程来处理队列中的 URL。每个线程都会从队列中取出一个 URL,对该 URL 对应的网页进行爬取和数据提取,并将提取出的数据存储在 `results` 列表中。在爬取和数据提取的过程中,我们需要使用一个锁来保证多个线程对 `results` 列表的访问不会出现竞争条件。
当所有线程都完成任务后,我们可以通过 `results` 列表来获取所有的爬取结果。在这个示例中,我们只是简单地打印了结果,你可以根据自己的需求来对结果进行处理。
阅读全文