python用生产者消费者模式爬取数据并写入csv
时间: 2024-06-01 12:02:44 浏览: 13
生产者消费者模式是一种常见的多线程编程模式,可以用来解决生产者和消费者之间的生产和消费速度不一致的问题。在爬取数据时,我们可以将爬虫程序分成生产者和消费者两个部分,生产者负责爬取数据并将数据加入到队列中,消费者负责从队列中取出数据并将数据写入到 CSV 文件中。
下面是一个使用生产者消费者模式爬取数据并写入 CSV 文件的示例代码:
```python
import csv
import queue
import threading
import requests
from bs4 import BeautifulSoup
# 创建队列
queue = queue.Queue()
# 生产者线程
class ProducerThread(threading.Thread):
def __init__(self, url):
super().__init__()
self.url = url
def run(self):
# 发送请求并解析 HTML
response = requests.get(self.url)
soup = BeautifulSoup(response.text, 'html.parser')
# 获取数据并加入队列
for tr in soup.select('table tr'):
row = [td.text.strip() for td in tr.select('td')]
if row:
queue.put(row)
# 消费者线程
class ConsumerThread(threading.Thread):
def __init__(self, filename):
super().__init__()
self.filename = filename
def run(self):
# 写入 CSV 文件
with open(self.filename, 'w', newline='') as f:
writer = csv.writer(f)
while True:
try:
row = queue.get(timeout=1)
writer.writerow(row)
queue.task_done()
except queue.Empty:
break
# 创建生产者和消费者线程
producer_thread = ProducerThread('http://example.com')
consumer_thread = ConsumerThread('data.csv')
# 启动线程
producer_thread.start()
consumer_thread.start()
# 等待队列处理完成
queue.join()
# 等待线程结束
producer_thread.join()
consumer_thread.join()
```
以上代码中,我们通过 `ProducerThread` 类来爬取数据并加入到队列中,通过 `ConsumerThread` 类来从队列中取出数据并写入到 CSV 文件中。在主线程中,我们创建了一个队列,并启动了生产者和消费者线程。最后,我们等待队列处理完成并等待线程结束。
需要注意的是,在多线程编程中,我们需要注意线程安全问题。例如,在向队列中添加数据时,我们需要使用线程安全的 `queue.Queue` 类。在写入 CSV 文件时,我们需要使用线程安全的文件操作。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)