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

本文涉及的产品
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
实时计算 Flink 版,5000CU*H 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()

目录
相关文章
|
1月前
|
数据采集 存储 XML
Python爬虫:深入探索1688关键词接口获取之道
在数字化经济中,数据尤其在电商领域的价值日益凸显。1688作为中国领先的B2B平台,其关键词接口对商家至关重要。本文介绍如何通过Python爬虫技术,合法合规地获取1688关键词接口,助力商家洞察市场趋势,优化营销策略。
|
1天前
|
数据采集 消息中间件 Java
python并发编程:什么是并发编程?python对并发编程有哪些支持?
并发编程能够显著提升程序的效率和响应速度。例如,网络爬虫通过并发下载将耗时从1小时缩短至20分钟;APP页面加载时间从3秒优化到200毫秒。Python支持多线程、多进程、异步I/O和协程等并发编程方式,适用于不同场景。线程通信方式包括共享变量、消息传递和同步机制,如Lock、Queue等。Python的并发编程特性使其在处理大规模数据和高并发访问时表现出色,成为许多领域的首选语言。
|
7天前
|
数据采集 存储 缓存
如何使用缓存技术提升Python爬虫效率
如何使用缓存技术提升Python爬虫效率
|
8天前
|
数据采集 Web App开发 监控
Python爬虫:爱奇艺榜单数据的实时监控
Python爬虫:爱奇艺榜单数据的实时监控
|
17天前
|
数据采集 JSON API
如何利用Python爬虫淘宝商品详情高级版(item_get_pro)API接口及返回值解析说明
本文介绍了如何利用Python爬虫技术调用淘宝商品详情高级版API接口(item_get_pro),获取商品的详细信息,包括标题、价格、销量等。文章涵盖了环境准备、API权限申请、请求构建和返回值解析等内容,强调了数据获取的合规性和安全性。
|
22天前
|
数据采集 存储 API
利用Python爬虫获取1688关键词接口全攻略
本文介绍如何使用Python爬虫技术合法合规地获取1688关键词接口数据,包括环境准备、注册1688开发者账号、获取Access Token、构建请求URL、发送API请求、解析HTML及数据处理存储等步骤,强调遵守法律法规和合理使用爬虫技术的重要性。
|
29天前
|
数据采集 JSON 开发者
Python爬虫京东商品详情数据接口
京东商品详情数据接口(JD.item_get)提供商品标题、价格、品牌、规格、图片等详细信息,适用于电商数据分析、竞品分析等。开发者需先注册账号、创建应用并申请接口权限,使用时需遵循相关规则,注意数据更新频率和错误处理。示例代码展示了如何通过 Python 调用此接口并处理返回的 JSON 数据。
|
2月前
|
XML 数据采集 数据格式
Python 爬虫必备杀器,xpath 解析 HTML
【11月更文挑战第17天】XPath 是一种用于在 XML 和 HTML 文档中定位节点的语言,通过路径表达式选取节点或节点集。它不仅适用于 XML,也广泛应用于 HTML 解析。基本语法包括标签名、属性、层级关系等的选择,如 `//p` 选择所有段落标签,`//a[@href='example.com']` 选择特定链接。在 Python 中,常用 lxml 库结合 XPath 进行网页数据抓取,支持高效解析与复杂信息提取。高级技巧涵盖轴的使用和函数应用,如 `contains()` 用于模糊匹配。
|
1月前
|
机器学习/深度学习 数据采集 TensorFlow
使用Python实现智能食品消费者行为分析的深度学习模型
使用Python实现智能食品消费者行为分析的深度学习模型
85 4
|
2月前
|
数据采集 XML 存储
构建高效的Python网络爬虫:从入门到实践
本文旨在通过深入浅出的方式,引导读者从零开始构建一个高效的Python网络爬虫。我们将探索爬虫的基本原理、核心组件以及如何利用Python的强大库进行数据抓取和处理。文章不仅提供理论指导,还结合实战案例,让读者能够快速掌握爬虫技术,并应用于实际项目中。无论你是编程新手还是有一定基础的开发者,都能在这篇文章中找到有价值的内容。