python并发编程:Python实现生产者消费者爬虫

本文涉及的产品
实时计算 Flink 版,5000CU*H 3个月
大数据开发治理平台 DataWorks,不限时长
实时数仓Hologres,5000CU*H 100GB 3个月
简介: python并发编程:Python实现生产者消费者爬虫

往期文章:

  1. 并发编程简介
  2. 怎样选择多线程多进程多协程
  3. Python速度慢的罪魁祸首,全局解释器锁GIL
  4. 使用多线程,Python爬虫被加速10倍

多组件的Pipeline技术结构

复杂的事情一般不会一下子做完,而是会分成很多中间步骤一步步完成。

生产者消费者爬虫的架构

多线程数据通信的queue.Queue

在实现生产者消费者模式之前,了解一下多线程数据通信queue。queue.Queue可以用于多线程之间的,线程安全的数据通信。

#1、导入类库
import queue
# 2、创建Queue
q = queue.queue()
#3、添加元素
q.put(item)
#4、获取元素
item = q.get(item)
#5、查询状态
#查询元素多少
q.qsize()
#判断是否为空
q.empty()
#判断是否已满
q.full()

代码实现

假如现在要实现这样的一个需求,现在要提前博客园的文章的标题和链接,这时,需要在cnblogs_spider添加一个函数parse

import requests
from bs4 import BeautifulSoup

urls = [
    "https://www.cnblogs.com/#p{}".format(page)
    for page in range(1,51)
]

def craw(url):
    r =requests.get(url)
    return r.text

def parse(html):
    soup = BeautifulSoup(html,"html.parser")
    links = soup.find_all('a',class_="post-item-title")
    return [ (link['href'],link.get_text())  for link in links]

新建一个文件名为producer_consumer_spider.py,在这个文件中新增两个函数,内容如下:

import queue
import cnblogs_spider
from loguru import logger
import threading


# 生产者生产任务
def do_craw(url_queue:queue.Queue,html_queue:queue.Queue):

    while True:
        url = url_queue.get()
        html = cnblogs_spider.craw(url)
        logger.info("生产者:{},爬取的连接是:{},url_queue.size={}".format(
            threading.current_thread().name,
            url,
            url_queue.qsize()
            ))
        html_queue.put(html)

# 消费者消费任务
def do_parse(html_queue:queue.Queue,fout):
    while True:
        html = html_queue.get()
        results = cnblogs_spider.parse(html)
        for item in results:
            logger.info("item是:{}".format(item))
            fout.write(str(item) + '\n')
        logger.info("消费者:{},results.size:{},html_queue.size={}".format(
            threading.current_thread().name,
            len(results),
            html_queue.qsize()
        ))
if __name__ == "__main__":
    url_queue = queue.Queue()
    html_queue = queue.Queue()

    for url in cnblogs_spider.urls:
        url_queue.put(url)

    # 生产者开启3个线程
    for id in range(3):
        task = threading.Thread(target=do_craw,args=(url_queue,html_queue),name="craw{}".format(id))
        task.start()

    # 消费者开启2个线程
    # 把消费的任务写到文件中
    fout = open("./02.data.txt","w")
    for id in range(2):
        task = threading.Thread(target=do_parse,args=(html_queue,fout),name="parse{}".format(id))
        task.start()

目录
相关文章
|
6天前
|
安全 数据安全/隐私保护 数据中心
Python并发编程大挑战:线程安全VS进程隔离,你的选择影响深远!
【7月更文挑战第9天】Python并发:线程共享内存,高效但需处理线程安全(GIL限制并发),适合IO密集型;进程独立内存,安全但通信复杂,适合CPU密集型。使用`threading.Lock`保证线程安全,`multiprocessing.Queue`实现进程间通信。选择取决于任务性质和性能需求。
19 1
|
10天前
|
数据采集 存储 API
在信息时代,Python爬虫用于自动化网络数据采集,提高效率。
【7月更文挑战第5天】在信息时代,Python爬虫用于自动化网络数据采集,提高效率。基本概念包括发送HTTP请求、解析HTML、存储数据及异常处理。常用库有requests(发送请求)和BeautifulSoup(解析HTML)。基本流程:导入库,发送GET请求,解析网页提取数据,存储结果,并处理异常。应用案例涉及抓取新闻、商品信息等。
30 2
|
4天前
|
数据采集 数据库 Python
Python并发编程新篇章:asyncio库使用全攻略,轻松驾驭异步世界!
【7月更文挑战第11天】Python的asyncio开启异步编程时代,通过案例展示如何用它和aiohttp构建并发爬虫。安装aiohttp后,定义异步函数`fetch`进行HTTP请求,返回状态码和内容长度。在`main`中,并发执行多个`fetch`任务,利用`asyncio.gather`收集结果。使用`async with`管理HTTP会话资源,确保释放。通过这种方式,爬虫性能大幅提升,适用于高并发场景。学习asyncio是提升并发性能的关键。
28 14
|
1天前
|
消息中间件 安全 数据处理
Python中的并发编程:理解多线程与多进程的区别与应用
在Python编程中,理解并发编程是提高程序性能和响应速度的关键。本文将深入探讨多线程和多进程的区别、适用场景及实际应用,帮助开发者更好地利用Python进行并发编程。
|
7天前
|
数据处理 调度 Python
Python并发编程实战指南:深入理解线程(threading)与进程(multiprocessing)的奥秘,打造高效并发应用!
【7月更文挑战第8天】Python并发编程探索:使用`threading`模块创建线程处理任务,虽受限于GIL,适合I/O密集型工作。而`multiprocessing`模块通过进程实现多核利用,适用于CPU密集型任务。通过实例展示了线程和进程的创建与同步,强调了根据任务类型选择合适并发模型的重要性。
|
5天前
|
数据库 数据安全/隐私保护 C++
Python并发编程实战:线程(threading)VS进程(multiprocessing),谁才是并发之王?
【7月更文挑战第10天】Python并发对比:线程轻量级,适合I/O密集型任务,但受GIL限制;进程绕过GIL,擅CPU密集型,但通信成本高。选择取决于应用场景,线程利于数据共享,进程利于多核利用。并发无“王者”,灵活运用方为上策。
|
6天前
|
安全 API 调度
深度剖析:Python并发编程中的线程与进程,那些你不可不知的使用技巧与限制!
【7月更文挑战第9天】Python并发:线程适合IO密集型任务,利用GIL下的多线程同步,如示例中使用锁。进程适用于CPU密集型,通过multiprocessing模块实现多进程,利用进程间通信如队列。线程受限于GIL,进程间通信成本高。选择取决于任务需求和性能目标。
12 2
|
7天前
|
数据采集 Web App开发 前端开发
Python中好用的爬虫框架
**Scrapy** 是一个强大的Python爬虫框架,适合大规模数据采集,提供高度可定制的爬取流程、内置数据提取工具、自动请求调度、分布式爬取支持、中间件扩展及多种数据存储方式。 **Beautiful Soup** 和 **Requests** 结合使用,便于Python中简单网页的请求和HTML解析。Requests发送HTTP请求,Beautiful Soup解析内容,适合小型项目或数据提取。 **Requests-HTML** 是Requests的扩展,支持HTML解析和CSS选择器,自动处理链接,适合网页解析任务。
|
7天前
|
机器学习/深度学习 数据采集 自然语言处理
Python实现循环神经网络SimpleRNN、LSTM进行淘宝商品评论情感分析(含爬虫程序)
Python实现循环神经网络SimpleRNN、LSTM进行淘宝商品评论情感分析(含爬虫程序)
Python实现循环神经网络SimpleRNN、LSTM进行淘宝商品评论情感分析(含爬虫程序)
|
5天前
|
数据采集 数据库连接 调度
从菜鸟到大师:掌握Python asyncio库,并发编程不再是梦!
【7月更文挑战第10天】Python的asyncio库简化了异步编程,通过事件循环和协程实现非阻塞I/O,提升效率。从`async def`定义异步函数到`await`等待操作,如在`main`函数中并发调用`say_hello`。深入学习涉及自定义协程、异步上下文管理器和信号量。结合如aiohttp,能构建高性能并发应用,实现高效的Web服务。开始你的asyncio之旅,成为并发编程专家!**
11 0