【Python编程】Python实现生产者消费者模式(多线程爬虫)

2023-10-29

Python实现生产者消费者模式(多线程爬虫)

1.多组件的Pipeline技术架构

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

在这里插入图片描述

2.生产者消费者爬虫的架构

在这里插入图片描述

3.多线程数据通信的 queue.Queue

queue.Queue 可以用于多线程之间的、线程安全的数据通信。简单来说,线程安全指的是多个线程并发同时访问数据不会出现数据冲突。

# 导入
import queue

# 创建
q = queue.Queue()

# 添加元素
q.put(item)

# 获取元素
item = q.get()

# 查看元素的多少
q.qsize()

# 判空
q.empty()

# 判满
q.full()

4.代码编写实现生产者消费者爬虫

基础版:blog_spider.py

import requests
from bs4 import BeautifulSoup

urls = [f'https://www.cnblogs.com/#{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]

if __name__ == "__main__":
    for result in parse(craw(urls[2])):
        print(result)

在这里插入图片描述

开始多线程爬虫。

import queue
import blog_spider
import time
import random
import threading

生产者:将每一个连接获取的 html文本 存入 html_queue

def do_craw(url_queue: queue.Queue, html_queue: queue.Queue):
    while True:
        url = url_queue.get()
        html = blog_spider.craw(url)
        html_queue.put(html)
        # 打印相关日志
        print(threading.current_thread().name, f"craw {url}",
              "url_queue.size=", url_queue.qsize())
        time.sleep(random.randint(1, 2))

消费者:解析 html_queue 中的每一个 html文本,获取文章链接和标题,并存入文档中。

def do_parse(html_queue: queue.Queue, fout):
    while True:
        html = html_queue.get()
        results = blog_spider.parse(html)
        for result in results:
            fout.write(str(result) + "\n")
        # 打印当前线程名字
        print(threading.current_thread().name, f"results.size", len(results),
                "html_queue.size=", html_queue.qsize())
        time.sleep(random.randint(1, 2))

生产-消费:设置 3 个生产者进程,2 个消费者进程。

if __name__ == "__main__":
    url_queue = queue.Queue()
    html_queue = queue.Queue()
    for url in blog_spider.urls:
        url_queue.put(url)

    for idx in range(3):
        t = threading.Thread(target=do_craw, args=(url_queue, html_queue), name=f"craw{idx}")
        t.start()

    fout = open("02.data.txt", 'w')
    for idx in range(2):
        t = threading.Thread(target=do_parse, args=(html_queue, fout), name=f"parse{idx}")
        t.start()

控制台上的打印信息。

在这里插入图片描述

最后看一下写入到文本中的内容。

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Python编程】Python实现生产者消费者模式(多线程爬虫) 的相关文章

  • 我怎样才能更多地了解Python的内部原理? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我使用Python编程已经有半年多了 我对Python内部更感兴趣 而不是使用Python开发应用程序
  • python 模拟第三方模块

    我正在尝试测试一些处理推文的类 我使用 Sixohsix twitter 来处理 Twitter API 我有一个类充当 Twitter 类的外观 我的想法是模拟实际的 Sixohsix 类 通过随机生成新推文或从数据库检索它们来模拟推文的
  • 将数据帧行转换为字典

    我有像下面的示例数据这样的数据帧 我正在尝试将数据帧中的一行转换为类似于下面所需输出的字典 但是当我使用 to dict 时 我得到了索引和列值 有谁知道如何将行转换为像所需输出那样的字典 任何提示都非常感激 Sample data pri
  • Django 模型在模板中不可迭代

    我试图迭代模型以获取列表中的第一个图像 但它给了我错误 即模型不可迭代 以下是我的模型和模板的代码 我只需要获取与单个产品相关的列表中的第一个图像 模型 py class Product models Model title models
  • Argparse nargs="+" 正在吃位置参数

    这是我的解析器配置的一小部分 parser add argument infile help The file to be imported type argparse FileType r default sys stdin parser
  • Pandas 数据帧到 numpy 数组 [重复]

    这个问题在这里已经有答案了 我对 Python 很陌生 经验也很少 我已经设法通过复制 粘贴和替换我拥有的数据来使一些代码正常工作 但是我一直在寻找如何从数据框中选择数据 但无法理解这些示例并替换我自己的数据 总体目标 如果有人真的可以帮助
  • python suds SOAP 请求中的名称空间前缀错误

    我使用 python suds 来实现客户端 并且在发送的 SOAP 标头中得到了错误的命名空间前缀 用于定义由element ref 在 wsdl 中 wsdl 正在引用数据类型 xsd 文件 请参见下文 问题出在函数上GetRecord
  • 对图像块进行多重处理

    我有一个函数必须循环遍历图像的各个像素并计算一些几何形状 此函数需要很长时间才能运行 在 24 兆像素图像上大约需要 5 小时 但似乎应该很容易在多个内核上并行运行 然而 我一生都找不到一个有据可查 解释充分的例子来使用 Multiproc
  • 使用鼻子获取设置中当前测试的名称

    我目前正在使用鼻子编写一些功能测试 我正在测试的库操作目录结构 为了获得可重现的结果 我存储了一个测试目录结构的模板 并在执行测试之前创建该模板的副本 我在测试中执行此操作 setup功能 这确保了我在测试开始时始终具有明确定义的状态 现在
  • Numpy 过滤器平滑零区域

    我有一个 0 及更大整数的 2D numpy 数组 其中值代表区域标签 例如 array 9 9 9 0 0 0 0 1 1 1 9 9 9 9 0 7 1 1 1 1 9 9 9 9 0 2 2 1 1 1 9 9 9 8 0 2 2 1
  • 按元组分隔符拆分列表

    我有清单 print L I WW am XX newbie YY ZZ You WW are XX cool YY ZZ 我想用分隔符将列表拆分为子列表 ZZ print new L I WW am XX newbie YY ZZ You
  • 如何在 python 中没有 csv.reader 迭代器的情况下解析单行 csv 字符串?

    我有一个 CSV 文件 需要重新排列和重新编码 我想跑 line line decode windows 1250 encode utf 8 在由 CSV 读取器解析和分割之前的每一行 或者我想自己迭代行 运行重新编码 并仅使用单行解析表单
  • 创建嵌套字典单行

    您好 我有三个列表 我想使用一行创建一个三级嵌套字典 i e l1 a b l2 1 2 3 l3 d e 我想创建以下嵌套字典 nd a 1 d 0 e 0 2 d 0 e 0 3 d 0 e 0 b a 1 d 0 e 0 2 d 0
  • 使用yield 进行字典理解

    作为一个人为的例子 myset set a b c d mydict item yield join item s for item in myset and list mydict gives as cs bs ds a None b N
  • Tkinter - 浮动窗口 - 调整大小

    灵感来自this https stackoverflow com a 22424245 13629335问题 我想为我的根窗口编写自己的调整大小函数 但我刚刚注意到我的代码显示了一些性能问题 如果你快速调整它的大小 你会发现窗口没有像我希望
  • 迭代 my_dict.keys() 并修改字典中的值是否会使迭代器失效?

    我的例子是这样的 for my key in my dict keys my dict my key mutate 上述代码的行为是否已定义 假设my dict是一本字典并且mutate是一个改变其对象的方法 我担心的是 改变字典中的值可能
  • 无法在前端使用 JavaScript Fetch API 将文件上传到 FastAPI 后端

    我正在尝试弄清楚如何将图像发送到我的 API 并验证生成的token那是在header的请求 到目前为止 这就是我所处的位置 app post endreProfilbilde async def endreProfilbilde requ
  • 具有自定义值的 Django 管理外键下拉列表

    我有 3 个 Django 模型 class Test models Model pass class Page models Model test models ForeignKey Test class Question model M
  • Elastic Beanstalk 中的 enum34 问题

    我正在尝试在 Elastic Beanstalk 中设置 django 环境 当我尝试通过requirements txt 文件安装时 我遇到了python3 6 问题 File opt python run venv bin pip li
  • 您可以使用关键字参数而不提供默认值吗?

    我习惯于在 Python 中使用这样的函数 方法定义 def my function arg1 None arg2 default do stuff here 如果我不供应arg1 or arg2 那么默认值None or default

随机推荐

  • Web应用中的状态(会话状态、应用状态、有状态协议、无状态协议、REST无状态约束)

    Web应用中的各种状态 结论先行 1 组件交互层次的 状态 1 1 HTTP是无状态协议 1 2 为什么将HTTP设计为无状态协议 1 3 REST的无状态约束 1 4 为什么REST要包含无状态约束 一 Web的需求 二 利大于弊 1 5
  • 百度地图离线API及地图数据下载工具-尝鲜篇

    上次做了一个谷歌地图离线API和地图数据下载工具 详见 http www cnblogs com liongis archive 2012 04 27 2474194 html 有朋友问是否可以做一个百度地图的离线包 最近抽空弄了弄 花了半
  • CSR867x — 从“吃一堑”中说说我对老外做事的看法

    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XX 作 者 文化人 XX 联系方式 XX 版权声明 原创文章 欢迎评论和转载 转载时能告诉我一声就最好了 XX 要说的话
  • 虚拟机VMware怎么完全卸载干净,如何彻底卸载VMware虚拟机

    亲测好使 1 禁用VM虚拟机服务 首先 需要停止虚拟机VMware相关服务 按下快捷键WIN R 打开windows运行对话框 输入 services msc 点击确定 如下图 在服务管理中 找到VM开头的所有服务类别如下图 将所有VM开头
  • vue3全局引入element-plus后怎么使用Message进行消息提示(超简单)

    vue3全局引入element plus后怎么使用Message进行消息提示 超简单 全局引入element plus请看其他 第一步 import ref getCurrentInstance from vue 第二步 在setup中声明
  • (二)主板BIOS设置与硬盘分区、调整

    1 主板BIOS设置 前提 你得有一台电脑 台式机或笔记本电脑都行 BIOS负责开机时对系统中各个硬件进行初始化设置和测试 以确保系统能正常工作 是电脑硬件与软件程序之间的一座桥梁 电脑在开机启动之前 首先要检查BIOS 它是计算机最底层的
  • VishwaCTF 2022 部分wp

    学长推荐的一个相对平易近人的ctf 对我这种菜鸡友好一点 就想着web要多写几道出来毕竟简单的比赛不常见 继续加油积累经验吧 My Useless Website 一个最简单的sql 万能密码注入 Stock Bot 注意源码 有hint
  • 安装了360天擎不能读u盘_关于硬盘/U盘/储存卡格式,你不得不知道的常识!

    https www zhihu com video 942459588977627136 情况一 你手里有一只U盘或者SD卡 存储容量有16G甚至32G 但用它来拷贝东西的时候你发现 文件超过4G之后 就无法拷贝 这时候 你到底该怎么办呢
  • 实现图片的裁剪和融合。

    请参考之前的博客链接 https blog csdn net Helloorld 1 article details 130107465 spm 1001 2014 3001 5502 如何实现裁剪图片 本文主要是讲述如何利用SAM Seg
  • OpenGL学习笔记(五)-投光物-多光源

    参考网址 LearnOpenGL 中文版 哔哩哔哩教程 2 5 投光物 2 5 1 平行光 1 当一个光源处于很远的地方时 来自光源的每条光线就会近似于互相平行 例如太阳 不论物体和 或者观察者的位置 看起来好像所有的光都来自于同一个方向
  • python Flask中返回图片流给前端展示

    场景需求 需要在Flask服务器的本地找一张图片返回给前端展示出来 问题疑点 通常前端的 img 标签只会接受url的形式来展示图片 没试过在返回服务器本地的一张图片给前端 因此写个记录一下这个看起来有点奇葩的场景 通常个人博客 个人网站没
  • centos 7.9 yum 安装最新版docker与dnf安装docker compose v2

    centos 7 9 yum 安装最新版docker与dnf安装docker compose v2 一 环境查看 1 系统内核 uname r 2 系统版本 cat etc redhat release 二 更新yum源 1 备份旧yum仓
  • 网站遭受攻击高防cdn进行防御的原理是什么?

    网站遭受攻击高防cdn进行防御的原理是什么 什么是高防cdn cdn的全称是Content Delivery Network 即内容分发网络 最近这几年 互联网络技术不断改进的同时 网络安全问题日益严峻 在这样的互联网环境下 高防cdn由此
  • 最小二乘法的一般形式和矩阵形式原理推导和代码实现

    转自 作者 金良 golden1314521 gmail com csdn博客 http blog csdn net u012176591 1 线性代数模型 首先给出最小二乘解的矩阵形式的公式 推导过程 条件 矩阵必须是列满秩矩阵 否则的逆
  • Git 命令图形化在线练习

    git 命令在线练习网址如下 http onlywei github io explain git with d3 在master上先提交2个commit 创建3个分支 分支1打5个commit 分支2打6commit 分支3commit
  • 欧式几何与非欧式几何

    欧氏几何 几何学的一门分科 公元前3世纪 古希腊数学家欧几里得把人们公认的一些几何知识作为定义和公理 在此基础上研究图形的性质 推导出一系列定理 组成演绎体系 写出 几何原本 形成了欧氏几何 在其公理体系中 最重要的是平行公理 由于对这一公
  • Java常见的十道语法题-详解

    1 判断 101 200 之间有多少个素数 并输出所有素数 代码如下 判断素数 public static void main String args boolean flag 定义标记语句 for int i 101 i lt 200 i
  • 区块链概述

    一 什么是区块链 区块链是一个信息技术领域的术语 区块链是借由密码学串接以保护内容的自增长的交易记录列表 又称区块 每一个区块包含了前一个区块的哈希值 本区块的时间戳记以及交易数据 通常用默克尔树结构的哈希值表示 这样的设计使得区块内容具有
  • Chromedriver安装和配置

    首先安装Chromedriver 下载网址 http npm taobao org mirrors chromedriver 找到与你chrome浏览器对应版本的下载 上面只是一部分 如果没有的可以上百度查一下 然后指定路径进行安装 这里我
  • 【Python编程】Python实现生产者消费者模式(多线程爬虫)

    Python实现生产者消费者模式 多线程爬虫 1 多组件的Pipeline技术架构 复杂的事情一般都不会一下子做完 而是会分很多中间步骤一步步完成 2 生产者消费者爬虫的架构 3 多线程数据通信的 queue Queue queue Que