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

本文涉及的产品
实时计算 Flink 版,5000CU*H 3个月
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
大数据开发治理平台 DataWorks,不限时长
简介: 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()

目录
相关文章
|
3天前
|
数据采集 XML 数据处理
使用Python实现简单的Web爬虫
本文将介绍如何使用Python编写一个简单的Web爬虫,用于抓取网页内容并进行简单的数据处理。通过学习本文,读者将了解Web爬虫的基本原理和Python爬虫库的使用方法。
|
1天前
|
数据采集 Web App开发 数据可视化
Python爬虫技术与数据可视化:Numpy、pandas、Matplotlib的黄金组合
Python爬虫技术与数据可视化:Numpy、pandas、Matplotlib的黄金组合
|
2天前
|
机器学习/深度学习 数据采集 算法
Python对中国电信消费者特征预测:随机森林、朴素贝叶斯、神经网络、最近邻分类、逻辑回归、支持向量回归(SVR)
Python对中国电信消费者特征预测:随机森林、朴素贝叶斯、神经网络、最近邻分类、逻辑回归、支持向量回归(SVR)
|
5天前
|
API 调度 开发者
Python中的并发编程:使用asyncio库实现异步IO
传统的Python编程模式中,使用多线程或多进程实现并发操作可能存在性能瓶颈和复杂性问题。而随着Python 3.5引入的asyncio库,开发者可以利用异步IO来更高效地处理并发任务。本文将介绍如何利用asyncio库实现异步IO,提升Python程序的并发性能。
|
8天前
|
数据采集 存储 JSON
Python爬虫面试:requests、BeautifulSoup与Scrapy详解
【4月更文挑战第19天】本文聚焦于Python爬虫面试中的核心库——requests、BeautifulSoup和Scrapy。讲解了它们的常见问题、易错点及应对策略。对于requests,强调了异常处理、代理设置和请求重试;BeautifulSoup部分提到选择器使用、动态内容处理和解析效率优化;而Scrapy则关注项目架构、数据存储和分布式爬虫。通过实例代码,帮助读者深化理解并提升面试表现。
15 0
|
11天前
|
数据采集 Web App开发 开发者
探秘Python爬虫技术:王者荣耀英雄图片爬取
探秘Python爬虫技术:王者荣耀英雄图片爬取
|
11天前
|
存储 数据采集 NoSQL
使用Python打造爬虫程序之数据存储与持久化:从网络到硬盘的无缝对接
【4月更文挑战第19天】本文探讨了爬虫中的数据存储与持久化技术,包括文本文件存储、数据库(关系型与非关系型)、NoSQL数据库和键值存储,以及ORM框架的使用。根据数据类型、规模和访问需求选择合适存储方式,并注意数据安全、备份和恢复策略。正确选择和应用这些技术能有效管理和利用爬取数据。
|
11天前
|
数据采集 缓存 算法
使用Python打造爬虫程序之Python中的并发与异步IO:解锁高效数据处理之道
【4月更文挑战第19天】本文探讨了Python中的并发与异步IO,区分了并发(同时处理任务)与并行(同时执行任务)的概念。Python的多线程受限于GIL,适合IO密集型任务,而多进程适用于CPU密集型任务。异步IO通过非阻塞和回调/协程实现高效IO,Python的asyncio库提供了支持。应用场景包括Web开发和网络爬虫等。实践指南包括理解任务类型、使用asyncio、避免阻塞操作、合理设置并发度和优化性能。理解并运用这些技术能提升Python程序的效率和性能。
|
11天前
|
数据采集 JavaScript 前端开发
使用Python打造爬虫程序之破茧而出:Python爬虫遭遇反爬虫机制及应对策略
【4月更文挑战第19天】本文探讨了Python爬虫应对反爬虫机制的策略。常见的反爬虫机制包括User-Agent检测、IP限制、动态加载内容、验证码验证和Cookie跟踪。应对策略包括设置合理User-Agent、使用代理IP、处理动态加载内容、验证码识别及维护Cookie。此外,还提到高级策略如降低请求频率、模拟人类行为、分布式爬虫和学习网站规则。开发者需不断学习新策略,同时遵守规则和法律法规,确保爬虫的稳定性和合法性。
|
11天前
|
数据采集 前端开发 JavaScript
使用Python打造爬虫程序之揭开动态加载内容的神秘面纱:Python爬虫进阶技巧
【4月更文挑战第19天】本文探讨了如何用Python爬虫抓取动态加载内容。动态加载内容常由JavaScript异步加载,传统爬虫无法捕获。文章介绍了两种方法:1) 使用Selenium模拟浏览器行为,等待动态内容出现并提取数据;2) 分析网页API请求,直接模拟请求获取数据。同时,提醒注意性能、反爬策略和API变动等问题,强调持续学习与实践的重要性。

热门文章

最新文章