当前位置: 首页 > news >正文

【JS逆向课件:第十六课:Scrapy基础2】

ImagePipeLines的请求传参

  • 环境安装:pip install Pillow

  • USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.109 Safari/537.36'
    
  • 需求:将图片的名称和详情页中图片的数据进行爬取,持久化存储。

    • 分析:

      • 深度爬取:请求传参
      • 多页的数据爬取:手动请求的发送
    • 爬虫文件:

    • import scrapyfrom ..items import DeepimgproItem
      class ImgSpider(scrapy.Spider):name = 'img'# allowed_domains = ['www.xxx.com']start_urls = ['https://pic.netbian.com/4kmeinv/']#通用的url模板url_model = 'https://pic.netbian.com/4kmeinv/index_%d.html'page_num = 2def parse(self, response):#解析出了图片的名称和详情页的urlli_list = response.xpath('//*[@id="main"]/div[3]/ul/li')for li in li_list:title = li.xpath('./a/b/text()').extract_first() + '.jpg'detail_url = 'https://pic.netbian.com'+li.xpath('./a/@href').extract_first()item = DeepimgproItem()item['title'] = title#需要对详情页的url发起请求,在详情页中获取图片的下载链接yield scrapy.Request(url=detail_url,callback=self.detail_parse,meta={'item':item})if self.page_num <= 5:new_url = format(self.url_model%self.page_num)self.page_num += 1yield scrapy.Request(url=new_url,callback=self.parse)#解析详情页的数据def detail_parse(self,response):meta = response.metaitem = meta['item']img_src = 'https://pic.netbian.com'+response.xpath('//*[@id="img"]/img/@src').extract_first()item['img_src'] = img_srcyield item
      
    • 管道:

    • # Define your item pipelines here
      #
      # Don't forget to add your pipeline to the ITEM_PIPELINES setting
      # See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html# useful for handling different item types with a single interface
      import scrapy
      from itemadapter import ItemAdapterfrom scrapy.pipelines.images import ImagesPipeline
      class DeepimgproPipeline(ImagesPipeline):# def process_item(self, item, spider):#     return itemdef get_media_requests(self, item, info):img_src = item['img_src']#请求传参,将item中的图片名称传递给file_path方法#meta会将自身传递给file_pathprint(item['title'],'保存下载成功!')yield scrapy.Request(url=img_src,meta={'title':item['title']})def file_path(self, request, response=None, info=None, *, item=None):#返回图片的名称#接收请求传参过来的数据title = request.meta['title']return titledef item_completed(self, results, item, info):return item

如何提高scrapy的爬取效率

增加并发:默认scrapy开启的并发线程为32个,可以适当进行增加。在settings配置文件中修改CONCURRENT_REQUESTS = 100值为100,并发设置成了为100。降低日志级别:在运行scrapy时,会有大量日志信息的输出,为了减少CPU的使用率。可以设置log输出信息为WORNING或者ERROR即可。在配置文件中编写:LOG_LEVEL = ‘ERROR’

post请求发送

  • 问题:在之前代码中,我们从来没有手动的对start_urls列表中存储的起始url进行过请求的发送,但是起始url的确是进行了请求的发送,那这是如何实现的呢?

    • 解答:其实是因为爬虫文件中的爬虫类继承到了Spider父类中的start_requests(self)这个方法,该方法就可以对start_urls列表中的url发起请求:

    • def start_requests(self):for u in self.start_urls:yield scrapy.Request(url=u,callback=self.parse)
      
    • 【注意】该方法默认的实现,是对起始的url发起get请求,如果想发起post请求,则需要子类重写该方法。

      • yield scrapy.Request():发起get请求
      • yield scrapy.FormRequest():发起post请求
    • import scrapy
      class FanyiSpider(scrapy.Spider):name = 'fanyi'# allowed_domains = ['www.xxx.com']start_urls = ['https://fanyi.baidu.com/sug']#父类中的方法:该方法是用来给起始的url列表中的每一个url发请求def start_requests(self):data = {'kw':'dog'}for url in self.start_urls:#formdata是用来指定请求参数yield scrapy.FormRequest(url=url,callback=self.parse,formdata=data)def parse(self, response):result = response.json()print(result)
      

scrapy的核心组件

  • 从中可以大致了解scrapy框架的一个运行机制
- 引擎(Scrapy)用来处理整个系统的数据流处理, 触发事务(框架核心)
- 调度器(Scheduler)用来接受引擎发过来的请求, 压入队列中, 并在引擎再次请求的时候返回. 可以想像成一个URL(抓取网页的网址或者说是链接)的优先队列, 由它来决定下一个要抓取的网址是什么, 同时去除重复的网址
- 下载器(Downloader)用于下载网页内容, 并将网页内容返回给蜘蛛(Scrapy下载器是建立在twisted这个高效的异步模型上的)
- 爬虫(Spiders)爬虫是主要干活的, 用于从特定的网页中提取自己需要的信息, 即所谓的实体(Item)。用户也可以从中提取出链接,让Scrapy继续抓取下一个页面
- 项目管道(Pipeline)负责处理爬虫从网页中抽取的实体,主要的功能是持久化实体、验证实体的有效性、清除不需要的信息。当页面被爬虫解析后,将被发送到项目管道,并经过几个特定的次序处理数据。

中间件

  • scrapy的中间件有两个:

    • 爬虫中间件
    • 下载中间件
    • 中间件的作用是什么?
      • 观测中间件在五大核心组件的什么位置,根据位置了解中间件的作用
        • 下载中间件位于引擎和下载器之间
        • 引擎会给下载器传递请求对象,下载器会给引擎返回响应对象。
        • 作用:可以拦截到scrapy框架中所有的请求和响应。
          • 拦截请求干什么?
            • 修改请求的ip,修改请求的头信息,设置请求的cookie
          • 拦截响应干什么?
            • 可以修改响应数据
  • 中间件重要方法:

  • # Define here the models for your spider middleware
    #
    # See documentation in:
    # https://docs.scrapy.org/en/latest/topics/spider-middleware.htmlfrom scrapy import signals# useful for handling different item types with a single interface
    from itemadapter import is_item, ItemAdapter
    from scrapy.http import HtmlResponseclass MiddleproDownloaderMiddleware:#拦截处理所有的请求对象#参数:request就是拦截到的请求对象,spider爬虫文件中爬虫类实例化的对象#spider参数的作用可以实现爬虫类和中间类的数据交互def process_request(self, request, spider):return None#拦截处理所有的响应对象#参数:response就是拦截到的响应对象,request就是被拦截到响应对象对应的唯一的一个请求对象def process_response(self, request, response, spider):#篡改了拦截到的响应数据:返回一个自定义的新的响应对象response = HtmlResponse(request=request,body='123',url=request.url,encoding='utf-8')return response#拦截和处理发生异常的请求对象#参数:reqeust就是拦截到的发生异常的请求对象def process_exception(self, request, exception, spider):pass#控制日志数据的(忽略)def spider_opened(self, spider):spider.logger.info('Spider opened: %s' % spider.name)
开发代理中间件
  • request.meta[‘proxy’] = proxy

  • # Define here the models for your spider middleware
    #
    # See documentation in:
    # https://docs.scrapy.org/en/latest/topics/spider-middleware.htmlfrom scrapy import signals# useful for handling different item types with a single interface
    from itemadapter import is_item, ItemAdapter
    from scrapy import Requestclass MiddleproDownloaderMiddleware:#类方法:作用是返回一个下载器对象(忽略)@classmethoddef from_crawler(cls, crawler):# This method is used by Scrapy to create your spiders.s = cls()crawler.signals.connect(s.spider_opened, signal=signals.spider_opened)return s#拦截处理所有的请求对象#参数:request就是拦截到的请求对象,spider爬虫文件中爬虫类实例化的对象#spider参数的作用可以实现爬虫类和中间类的数据交互def process_request(self, request, spider):#是的所有的请求都是用代理,则代理操作可以写在该方法中request.meta['proxy'] = 'http://ip:port'#弊端:会使得整体的请求效率变低print(request.url+':请求对象拦截成功!')return None#拦截处理所有的响应对象#参数:response就是拦截到的响应对象,request就是被拦截到响应对象对应的唯一的一个请求对象def process_response(self, request, response, spider):print(request.url+':响应对象拦截成功!')return response#拦截和处理发生异常的请求对象#参数:reqeust就是拦截到的发生异常的请求对象#方法存在的意义:将发生异常的请求拦截到,然后对其进行修正def process_exception(self, request, exception, spider):print(request.url+':发生异常的请求对象被拦截到!')#修正操作#只有发生了异常的请求才使用代理机制,则可以写在该方法中request.meta['proxy'] = 'https://ip:port'return request #对请求对象进行重新发送#控制日志数据的(忽略)def spider_opened(self, spider):spider.logger.info('Spider opened: %s' % spider.name)
开发UA中间件
  • request.headers[‘User-Agent’] = ua

  •     def process_request(self, request, spider):request.headers['User-Agent'] = '从列表中随机选择的一个UA值'print(request.url+':请求对象拦截成功!')return None
    
开发Cookie中间件
  • request.cookies = cookies

  • def process_request(self, request, spider):request.headers['cookie'] = 'xxx'#request.cookies = 'xxx'print(request.url+':请求对象拦截成功!')return None
    

CrawlSpider

  • 实现网站的全站数据爬取

    • 就是将网站中所有页码对应的页面数据进行爬取。
  • crawlspider其实就是scrapy封装好的一个爬虫类,通过该类提供的相关的方法和属性就可以实现全新高效形式的全站数据爬取。

  • 使用流程:

    • 新建一个scrapy项目

    • cd 项目

    • 创建爬虫文件(*):

      • scrapy genspider -t crawl spiderName www.xxx.com

      • 爬虫文件中发生的变化有哪些?

        • 当前爬虫类的父类为CrawlSpider
        • 爬虫类中多了一个类变量叫做rules
          • LinkExtractor:链接提取器
            • 可以根据allow参数表示的正则在当前页面中提取符合正则要求的链接
          • Rule:规则解析器
            • 可以接收链接提取器提取到的链接,并且对每一个链接进行请求发送
            • 可以根据callback指定的回调函数对每一次请求到的数据进行数据解析
        • 思考:如何将一个网站中所有的链接都提取到呢?
          • 只需要在链接提取器的allow后面赋值一个空正则表达式即可
        • 目前在scrapy中有几种发送请求的方式?
          • start_urls列表可以发送请求
          • scrapy.Request()
          • scrapy.FormRequest()
          • Rule规则解析器
  • 注意:

    • 链接提取器和规则解析器是一一对应的(一对一的关系)
    • 建议在使用crawlSpider实现深度爬取的时候,需要配合手动请求发送的方式进行搭配!
  • USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36'
    
  • 爬取不同页码下的标题数据

    • import scrapy
      from time import sleep
      from scrapy.linkextractors import LinkExtractor
      from scrapy.spiders import CrawlSpider, Rule
      #LinkExtractor链接提取器:可以根据指定的规则进行链接的提取
      #Rule规则解析器:可以根据指定规则对请求到的数据进行数据解析
      class SunSpider(CrawlSpider):name = 'sun'# allowed_domains = ['www.xxx.com']start_urls = ['https://wz.sun0769.com/political/index/politicsNewest?id=1&page=1']#link就表示创建出来的一个链接提取器#allow参数后面要跟一个正则表达式,就可以作为链接提取的规则#link首先会去start_urls表示的页面中进行链接的提取link = LinkExtractor(allow=r'id=1&page=(\d+)')rules = (#创建了一个规则解析器#链接提取器提取到的链接会发送给Rule这个规则解析器#规则解析器接收到链接后,会对链接进行请求发送,并且根据callback指定的函数进行数据解析Rule(link, callback='parse_item', follow=True),)#解析方法的调用次数取决于link提取到的链接的个数def parse_item(self, response):li_list = response.xpath('/html/body/div[2]/div[3]/ul[2]/li')for li in li_list:title = li.xpath('./span[3]/a/text()').extract_first()print(title)
      
  • 爬取页码对应页面的标题数据和详情页中的详细内容数据(深度爬取)

    • import scrapy
      from time import sleep
      from scrapy.linkextractors import LinkExtractor
      from scrapy.spiders import CrawlSpider, Rule
      from crawlPro.items import CrawlproItem
      #LinkExtractor链接提取器:可以根据指定的规则进行链接的提取
      #Rule规则解析器:可以根据指定规则对请求到的数据进行数据解析
      class SunSpider(CrawlSpider):name = 'sun'# allowed_domains = ['https://wz.sun0769.com']start_urls = ['https://wz.sun0769.com/political/index/politicsNewest?id=1&page=1']#链接提取器和规则解析器一定是一对一关系#提取页码链接link = LinkExtractor(allow=r'id=1&page=\d+')rules = (#解析页面对应页面中的标题数据Rule(link, callback='parse_item', follow=False),)#解析方法的调用次数取决于link提取到的链接的个数def parse_item(self, response):li_list = response.xpath('/html/body/div[2]/div[3]/ul[2]/li')for li in li_list:title = li.xpath('./span[3]/a/text()').extract_first()detail_url = 'https://wz.sun0769.com' + li.xpath('./span[3]/a/@href').extract_first()item = CrawlproItem()item['title'] = titleyield scrapy.Request(url=detail_url, callback=self.parse_detail,meta={'item':item})def parse_detail(self,response):item = response.meta['item']detail_content = response.xpath('/html/body/div[3]/div[2]/div[2]/div[2]//text()').extract()item['content'] = detail_contentyield item
      

分布式

  • 分布式在日常开发中并不常用,只是一个噱头!

  • 概念:

    • 可以使用多台电脑搭建一个分布式机群,使得多台对电脑可以对同一个网站的数据进行联合且分布的数据爬取。
  • 声明:

    • 原生的scrapy框架并无法实现分布式操作!why?
      • 多台电脑之间无法共享同一个调度器
      • 多台电脑之间无法共享同一个管道
  • 如何是的scrapy可以实现分布式呢?

    • 借助于一个组件:scrapy-redis
    • scrapy-redis的作用是什么?
      • 可以给原生的scrapy框架提供可被共享的调度器和管道!
      • 环境安装:pip install scrapy-redis
        • 注意:scrapy-redis该组件只可以将爬取到的数据存储到redis数据库
  • 编码流程(重点):

    • 1.创建项目

    • 2.cd 项目

    • 3.创建基于crawlSpider的爬虫文件

      • 3.1 修改爬虫文件
        • 导包:from scrapy_redis.spiders import RedisCrawlSpider
        • 修改当前爬虫类的父类为 RedisCrawlSpider
        • 将start_urls替换成redis_key的操作
          • redis_key变量的赋值为字符串,该字符串表示调度器队列的名称
        • 进行常规的请求操作和数据解析
    • 4.settings配置文件的修改

      • 常规内容修改(robots和ua等),先不指定日志等级

      • 指定可以被共享的管道类

        • ITEM_PIPELINES = {'scrapy_redis.pipelines.RedisPipeline': 400
          }
          
      • 指定可以被共享的调度器

        • # 使用scrapy-redis组件的去重队列
          DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
          # 使用scrapy-redis组件自己的调度器
          SCHEDULER = "scrapy_redis.scheduler.Scheduler"
          # 是否允许暂停
          SCHEDULER_PERSIST = True
          
      • 指定数据库

        • REDIS_HOST = '127.0.0.1'
          REDIS_PORT = 6379
          
    • 5.修改redis数据库的配置文件(redis.windows.conf)

      • 在配置文件中改行代码是没有没注释的:

        • bind 127.0.0.1
          #将上述代码注释即可(解除本机绑定,实现外部设备访问本机数据库如果配置文件中还存在:protected-mode = true,将true修改为false,
          修改为false后表示redis数据库关闭了保护模式,表示其他设备可以远程访问且修改你数据库中的数据
          
    • 6.启动redis数据库的服务端和客户端

    • 7.运行项目,发现程序暂定一直在等待,等待爬取任务

    • 8.需要向可以被共享的调度器的队列(redis_key的值)中放入一个起始的url

      • 在redis数据库的客户端执行如下操作:

        • lpush 队列名称 起始的url

        • 起始url:https://wz.sun0769.com/political/index/politicsNewest?id=1&page=1

          增量式

  • 爬虫应用场景分类

    • 通用爬虫

    • 聚焦爬虫

    • 功能爬虫

    • 分布式爬虫

    • 增量式:

      • 用来监测网站数据更新的情况(爬取网站最新更新出来的数据)。
      • 只是一种程序设计的思路,使用什么技术都是可以实现的。
      • 核心:
        • 去重。
          • 使用一个记录表来实现数据的去重:
            • 记录表:存储爬取过的数据的记录
            • 如何构建和设计一个记录表:
              • 记录表需要具备的特性:
                • 去重
                • 需要持久保存的
              • 方案1:使用Python的set集合充当记录表?
                • 不可以的!因为set集合无法实现持久化存储
              • 方案2:使用redis的set集合充当记录表?
                • 可以的,因为redis的set既可以实现去重又可以进行数据的持久化存储。
    • import scrapy
      import redis
      from ..items import Zlsdemo2ProItem
      class JianliSpider(scrapy.Spider):name = 'jianli'# allowed_domains = ['www.xxx.com']start_urls = ['https://sc.chinaz.com/jianli/free.html']conn = redis.Redis(host='127.0.0.1',port=6379)def parse(self, response):div_list = response.xpath('//*[@id="container"]/div')for div in div_list:title = div.xpath('./p/a/text()').extract_first()#充当数据指纹detail_url = 'https:'+div.xpath('./p/a/@href').extract_first()ex = self.conn.sadd('data_id',detail_url)item = Zlsdemo2ProItem()item['title'] = titleif ex == 1:print('有最新数据的更新,正在采集......')yield scrapy.Request(url=detail_url,callback=self.parse_detail,meta={'item':item})else:print('暂无数据更新!')def parse_detail(self,response):item = response.meta['item']download_url = response.xpath('//*[@id="down"]/div[2]/ul/li[1]/a/@href').extract_first()item['download_url'] = download_urlyield item
      

相关文章:

【JS逆向课件:第十六课:Scrapy基础2】

ImagePipeLines的请求传参 环境安装&#xff1a;pip install Pillow USER_AGENT Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.109 Safari/537.36需求&#xff1a;将图片的名称和详情页中图片的数据进行爬取&a…...

使用 PowerShell 自动化图像识别与鼠标操作

目录 前言功能概述代码实现1. 引入必要的程序集2. 定义读取文件行的函数3. 定义加载图片的函数4. 定义查找小图像在大图像中的位置的函数5. 定义截取全屏的函数6. 定义模拟鼠标点击的函数7. 定义主函数 配置文件示例运行脚本结语全部代码提示打包exe 下载地址 前言 在日常工作…...

组队学习——支持向量机

本次学习支持向量机部分数据如下所示 IDmasswidthheightcolor_scorefruit_namekind 其中ID&#xff1a;1-59是对应训练集和验证集的数据&#xff0c;60-67是对应测试集的数据&#xff0c;其中水果类别一共有四类包括apple、lemon、orange、mandarin。要求根据1-59的数据集的自…...

【数据中心】数据中心的IP封堵防护:构建网络防火墙的基石

数据中心的IP封堵防护&#xff1a;构建网络防火墙的基石 引言一、理解IP封堵二、IP封堵的功能模块及其核心技术三、实施IP封堵的关键策略四、结论 引言 在当今高度互联的世界里&#xff0c;数据中心成为信息流动和存储的神经中枢&#xff0c;承载着企业和组织的大量关键业务。…...

LangChain的使用详解

一、 概念介绍 1.1 Langchain 是什么&#xff1f; 官方定义是&#xff1a;LangChain是一个强大的框架&#xff0c;旨在帮助开发人员使用语言模型构建端到端的应用程序&#xff0c;它提供了一套工具、组件和接口&#xff0c;可简化创建由大型语言模型 (LLM) 和聊天模型提供…...

Modbus转BACnet/IP网关快速对接Modbus协议设备与BA系统

摘要 在智能建筑和工业自动化领域&#xff0c;Modbus和BACnet/IP协议的集成应用越来越普遍。BA&#xff08;Building Automation&#xff0c;楼宇自动化&#xff09;系统作为现代建筑的核心&#xff0c;需要高效地处理来自不同协议的设备数据&#xff0c;负责监控和管理建筑内…...

万字长文之分库分表里无分库分表键如何查询【后端面试题 | 中间件 | 数据库 | MySQL | 分库分表 | 其他查询】

在很多业务里&#xff0c;分库分表键都是根据主要查询筛选出来的&#xff0c;那么不怎么重要的查询怎么解决呢&#xff1f; 比如电商场景下&#xff0c;订单都是按照买家ID来分库分表的&#xff0c;那么商家该怎么查找订单呢&#xff1f;或是买家找客服&#xff0c;客服要找到对…...

如何查看jvm资源占用情况

如何设置jar的内存 java -XX:MetaspaceSize256M -XX:MaxMetaspaceSize256M -XX:AlwaysPreTouch -XX:ReservedCodeCacheSize128m -XX:InitialCodeCacheSize128m -Xss512k -Xmx2g -Xms2g -XX:UseG1GC -XX:G1HeapRegionSize4M -jar your-application.jar以上配置为堆内存4G jar项…...

科研绘图系列:R语言TCGA分组饼图(multiple pie charts)

介绍 在诸如癌症基因组图谱(TCGA)等群体研究项目中,为了有效地表征和比较不同群体的属性分布,科研人员广泛采用饼图作为数据可视化的工具。饼图通过将一个完整的圆形划分为若干个扇形区域,每个扇形区域的面积大小直接对应其代表的属性在整体中的占比。这种图形化的展示方…...

ReadAgent,一款具有要点记忆的人工智能阅读代理

人工智能咨询培训老师叶梓 转载标明出处 现有的大模型&#xff08;LLMs&#xff09;在处理长文本时受限于固定的最大上下文长度&#xff0c;并且当输入文本越来越长时&#xff0c;性能往往会下降&#xff0c;即使在没有超出明确上下文窗口的情况下&#xff0c;LLMs 的性能也会随…...

构建智能:利用Gradle项目属性控制构建行为

构建智能&#xff1a;利用Gradle项目属性控制构建行为 Gradle作为一款强大的构建工具&#xff0c;提供了丰富的项目属性管理功能。通过项目属性&#xff0c;开发者可以灵活地控制构建行为&#xff0c;实现条件编译、动态配置和多环境构建等高级功能。本文将详细解释如何在Grad…...

如何通过smtp设置使ONLYOFFICE协作空间服务器可以发送注册邀请邮件

什么是ONLYOFFICE协作空间 ONLYOFFICE协作空间&#xff0c;是Ascensio System SIA公司出品的&#xff0c;基于Web的&#xff0c;开源的&#xff0c;跨平台的&#xff0c;在线文档编辑和协作的解决方案。在线Office包含了最基本的办公三件套&#xff1a;文档编辑器、幻灯片编辑…...

SQL labs靶场-SQL注入入门

靶场及环境配置参考 一&#xff0c;工具准备。 推荐下载火狐浏览器&#xff0c;并下载harkbar插件&#xff08;v2&#xff09;版本。hackbar使用教程在此不做过多描述。 补充&#xff1a;url栏内部信息会进行url编码。 二&#xff0c;SQL注入-less1。 1&#xff0c;判断传参…...

HarmonyOS应用开发者高级认证,Next版本发布后最新题库 - 单选题序号4

基础认证题库请移步&#xff1a;HarmonyOS应用开发者基础认证题库 注&#xff1a;有读者反馈&#xff0c;题库的代码块比较多&#xff0c;打开文章时会卡死。所以笔者将题库拆分&#xff0c;单选题20个为一组&#xff0c;多选题10个为一组&#xff0c;题库目录如下&#xff0c;…...

使用LSTM完成时间序列预测

c 在本教程中&#xff0c;我们将介绍一个简单的示例&#xff0c;旨在帮助初学者入门时间序列预测和 PyTorch 的使用。通过这个示例&#xff0c;你可以学习如何使用 LSTMCell 单元来处理时间序列数据。 我们将使用两个 LSTMCell 单元来学习从不同相位开始的正弦波信号。模型在…...

《数据结构:顺序实现二叉树》

文章目录 一、树1、树的结构与概念2、树相关术语 二、二叉树1、概念与结构2、满二叉树3、完全二叉树 三、顺序二叉树存储结构四、实现顺序结构二叉树1、堆的概念与结构2、堆的实现3、堆的排序 一、树 1、树的结构与概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff…...

【HarmonyOS】HarmonyOS NEXT学习日记:六、渲染控制、样式结构重用

【HarmonyOS】HarmonyOS NEXT学习日记&#xff1a;六、渲染控制、样式&结构重用 渲染控制包含了条件渲染和循环渲染&#xff0c;所谓条件渲染&#xff0c;即更具状态不同&#xff0c;选择性的渲染不同的组件。 而循环渲染则是用于列表之内的、多个重复元素组成的结构中。 …...

【防火墙】防火墙NAT、智能选路综合实验

实验拓扑 实验要求 7&#xff0c;办公区设备可以通过电信链路和移动链路上网(多对多的NAT&#xff0c;并且需要保留一个公网IP不能用来转换) 8&#xff0c;分公司设备可以通过总公司的移动链路和电信链路访问到Dmz区的http服务器 9&#xff0c;多出口环境基于带宽比例进行选路…...

VUE之---slot插槽

什么是插槽 slot 【插槽】&#xff0c; 是 Vue 的内容分发机制&#xff0c; 组件内部的模板引擎使用slot 元素作为承载分发内容的出口。slot 是子组件的一个模板标签元素&#xff0c; 而这一个标签元素是否显示&#xff0c; 以及怎么显示是由父组件决定的。 VUE中slot【插槽】…...

linux、windows、macos,命令终端清屏

文章目录 LinuxWindowsmacOS 在Linux、Windows和macOS的命令终端中&#xff0c;清屏的命令或方法各不相同。以下是针对这三种系统的清屏方法&#xff1a; Linux clear命令&#xff1a;这是最常用的清空终端屏幕的命令之一。在终端中输入clear命令后&#xff0c;屏幕上的所有内容…...

【RaspberryPi】树莓派Matlab/Simulink支持包安装与使用

官网支持与兼容性 Raspberry Pi Support from MATLAB - Hardware Support - MATLAB & Simulink Raspberry Pi Support from Simulink - Hardware Support - MATLAB & Simulink Matlab与树莓派兼容性 Simulink与树莓派兼容性 树莓派Matlab&Simulink RaspberryPi支…...

嵌入式人工智能(10-基于树莓派4B的DS1302实时时钟RTC)

1、实时时钟&#xff08;Real Time Clock&#xff09; RTC&#xff0c;全称为实时时钟&#xff08;Real Time Clock&#xff09;&#xff0c;是一种能够提供实时时间信息的电子设备。RTC通常包括一个计时器和一个能够记录日期和时间的电池。它可以独立于主控芯片工作&#xff…...

C++ | Leetcode C++题解之第275题H指数II

题目&#xff1a; 题解&#xff1a; class Solution { public:int hIndex(vector<int>& citations) {int n citations.size();int left 0, right n - 1;while (left < right) {int mid left (right - left) / 2;if (citations[mid] > n - mid) {right m…...

编写DockerFile

将自己的项目或者环境通过Docker部署到服务器需要一下几个步骤&#xff1a; 打包项目或者环境 编写Dockerfile文件 运行Dockerfile文件&#xff0c;构建DockerImages镜像&#xff0c;将DockerImages存入DockerHub或者存入阿里云镜像仓库 服务器pull下DockerImages镜像&#…...

TCP并发服务器多线程

1.创建线程‐‐pthread_create int pthread_create( pthread_t *thread, // 线程 ID 无符号长整型 const pthread_attr_t *attr, // 线程属性&#xff0c; NULL void *(*start_routine)(void *), // 线程处理函数 void *arg); // 线程处理函数 参数&#xff1a; pthrea…...

技术速递|C# 13:探索最新的预览功能

作者&#xff1a;Kathleen Dollard 排版&#xff1a;Alan Wang C# 13 已初具雏形&#xff0c;其新特性侧重于灵活性、性能以及使您最喜欢的功能在日常中变得更容易使用。我们以公开的方式构建 C#&#xff0c;在今年的 Microsoft Build 大会上&#xff0c;我们会让您一睹 C# 13 …...

Python设计模式:巧用元类创建单例模式!

✨ 内容&#xff1a; 今天我们来探讨一个高级且实用的Python概念——元类&#xff08;Metaclasses&#xff09;。元类是创建类的类&#xff0c;它们可以用来控制类的行为。通过本次练习&#xff0c;我们将学习如何使用元类来实现单例模式&#xff0c;确保某个类在整个程序中只…...

构建自主可控的工业操作系统,筑牢我国工业安全堡垒

构建自主可控的工业操作系统&#xff0c;筑牢我国工业安全堡垒&#xff0c;鸿道(Intewell)操作系统为国家工业发展保驾护航。 7月19日&#xff0c;全球多地安装微软操作系统的电脑设备出现大规模宕机&#xff0c;导致“蓝屏”现象&#xff0c;严重影响了航空、铁路、医疗、金…...

WPF串口通讯程序

目录 一 设计原型 二 后台源码 一 设计原型 二 后台源码 using HardwareCommunications; using System.IO.Ports; using System.Windows;namespace PortTest {/// <summary>/// Interaction logic for MainWindow.xaml/// </summary>public partial class MainW…...

汽车技术智能化程度不断提升,线束可靠性如何设计?

随着汽车技术的高速发展&#xff0c;汽车自动化、智能化程度的逐步提高&#xff0c;人们对汽车的安全性、舒适性、娱乐性等要求也不断提高&#xff0c;加上汽车节能减排法规的不断严峻&#xff0c;整车电气设备不断增加&#xff0c;作为连接汽车各种电器设备“神经网络”的整车…...

实现Nginx的反向代理和负载均衡

一、反向代理和负载均衡简介 1.1、反向代理 反向代理(reverse proxy)指:以代理服务器来接受Internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给Internet上请求连接的客户端。此时代理服务器对外就表现为一个反向代理服务器。 反向代…...

【算法】子集

难度&#xff1a;中等 题目&#xff1a; 给你一个整数数组 nums &#xff0c;数组中的元素 互不相同 。返回该数组所有可能的 子集&#xff08;幂集&#xff09;。 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 示例 1&#xff1a; 输入&#xff1a;nums [1,…...

Web前端:HTML篇(一)

HTML简介&#xff1a; 超文本标记语言&#xff08;英语&#xff1a;HyperText Markup Language&#xff0c;简称&#xff1a;HTML&#xff09;是一种用于创建网页的标准标记语言。 您可以使用 HTML 来建立自己的 WEB 站点&#xff0c;HTML 运行在浏览器上&#xff0c;由浏览器…...

ActiViz中的选择点vtkWorldPointPicker

文章目录 1. vtkWorldPointPicker简介2. 类的位置和继承关系3. 选择机制4. 返回的信息5. 选择的条件和参数6. 与屏幕空间选择器的比较7. 性能特征8. 应用场景9. 与其他vtk选择器的集成10. 完整示例总结1. vtkWorldPointPicker简介 vtkWorldPointPicker是Visualization Toolkit…...

如何开启或者关闭 Windows 安全登录?

什么是安全登录 什么是 Windows 安全登录呢&#xff1f;安全登录是 Windows 附加的一个组件&#xff0c;它可以在用户需要登录的之前先将登录界面隐藏&#xff0c;只有当用户按下 CtrlAltDelete 之后才出现登录屏幕&#xff0c;这样可以防止那些模拟登录界面的程序获取密码信息…...

【目标检测】Anaconda+PyTorch配置

前言 本文主要介绍在windows系统上的Anaconda、PyTorch关键步骤安装&#xff0c;为使用yolo所需的环境配置完善。同时也算是记录下我的配置流程&#xff0c;为以后用到的时候能笔记查阅。 Anaconda 软件安装 Anaconda官网&#xff1a;https://www.anaconda.com/ 另外&#…...

什么是离线语音识别芯片?与在线语音识别的区别

离线语音识别芯片是一种不需要联网和其他外部设备支持&#xff0c;‌上电即可使用的语音识别系统。‌它的应用场合相对单一&#xff0c;‌主要适用于智能家电、‌语音遥控器、‌智能玩具等&#xff0c;‌以及车载声控和一部分智能家居。‌离线语音识别芯片的特点包括小词汇量、…...

使用Diffusion Models进行街景视频生成

Diffusion Models专栏文章汇总&#xff1a;入门与实战 前言&#xff1a;街景图生成相当有挑战性&#xff0c;目前的文本到视频的方法仅限于生成有限范围的场景的短视频&#xff0c;文本到3D的方法可以生成单独的对象但不是整个城市。除此之外街景图对一致性的要求相当高&#x…...

UFO:革新Windows操作系统交互的UI聚焦代理

人工智能咨询培训老师叶梓 转载标明出处 人机交互的便捷性和效率直接影响着我们的工作和生活质量。尽管现代操作系统如Windows提供了丰富的图形用户界面&#xff08;GUI&#xff09;&#xff0c;使得用户能够通过视觉和简单的点击操作来控制计算机&#xff0c;但随着应用程序功…...

scp免密复制文件

实现在服务器A和服务器B之间使用scp命令免密互相传输文件 1. 在服务器A中免密复制到服务器B 1.1 生成服务器A的公钥私钥 #在服务器A中执行 ssh-keygen -t rsa -P ""命令执行完毕会在服务器A的 ~/.ssh 目录下生成两个文件&#xff1a;id_rsa 和 id_rsa.pub 1.2 拷…...

Maven 的模块化开发示例

Maven 的模块化开发是一种非常有效的软件开发方式&#xff0c;它允许你将一个大型的项目分割成多个更小、更易于管理的模块&#xff08;modules&#xff09;。每个模块都可以独立地构建、测试和运行&#xff0c;这不仅提高了开发效率&#xff0c;也便于团队协作和项目的维护。以…...

通过QT进行服务器和客户端之间的网络通信

客户端 client.pro #------------------------------------------------- # # Project created by QtCreator 2024-07-02T14:11:20 # #-------------------------------------------------QT core gui network #网络通信greaterThan(QT_MAJOR_VERSION, 4): QT widg…...

【STM32 HAL库】DMA+串口

DMA 直接存储器访问 DMA传输&#xff0c;将数据从一个地址空间复制到另一个地址空间。-----“数据搬运工”。 DMA传输无需CPU直接控制传输&#xff0c;也没有中断处理方式那样保留现场和恢复现场&#xff0c;它是通过硬件为RAM和IO设备开辟一条直接传输数据的通道&#xff0c…...

C#类型基础Part2-对象判等

C#类型基础Part2-对象判等 参考资料引用类型判等简单值类型判等复杂值类型判等 参考资料 《.NET之美-.NET关键技术深入解析》 引用类型判等 先定义两个类型&#xff0c;它们代表直线上的一个点&#xff0c;一个是引用类型class&#xff0c;一个是值类型struct public class…...

13.CSS 打印样式表 悬停下划线动画

CSS 打印样式表 虽然我们不经常从网上实际打印内容,但打印样式表不应被忽视。它们可以用来确保你的网站内容以一种易读和适合打印的方式呈现。这里有一个简单的、独特的打印样式表,你可以用它作为自己的基础: media print {page {size: A4;}body {margin: 0;padding: 0;}body, …...

C#基础:数据库分表的好处和实现方式

一、分表的好处&#xff1a; 1.提升查询速度&#xff1a;分表筛选后再拼接&#xff0c;而不是查大表&#xff0c;速度会显著提升 2.管理容易&#xff1a;根据业务需求&#xff0c;通常会按照时间或者空间来分表 3.提高并发性&#xff1a;降低锁竞争和查询阻塞的风险&#xf…...

基于3D开发引擎HOOPS平台的大型三维PLM系统的设计、开发与应用

产品生命周期管理&#xff08;Product Lifecycle Management&#xff0c;PLM&#xff09;系统在现代制造业中扮演着至关重要的角色。随着工业4.0和智能制造的推进&#xff0c;PLM系统从最初的CAD和PDM系统发展到现在的全面集成、协作和智能化的平台。本文将探讨基于HOOPS平台的…...

学习React(描述 UI)

React 是一个用于构建用户界面&#xff08;UI&#xff09;的 JavaScript 库&#xff0c;用户界面由按钮、文本和图像等小单元内容构建而成。React 帮助你把它们组合成可重用、可嵌套的 组件。从 web 端网站到移动端应用&#xff0c;屏幕上的所有内容都可以被分解成组件。在本章…...

mysql字符类型字段设置默认值为当前时间

-- 2024-07-22 10:22:20 select (DATE_FORMAT(CURRENT_TIMESTAMP, %Y-%m-%d %H:%i:%s)); ALTER TABLE tablename MODIFY COLUNN CREATE_DATE varchar (23) DEFAULT(DATE_FORMAT(CURRENT_TIMESTAMP, %Y-%m-%d %H:%i:%s)) COMMENT "创建日期;...

java题目之数字加密以及如何解密

public class Main6 {public static void main(String[] args) {// 某系统的数字密码&#xff08;大于0&#xff09;&#xff0c;比如1983&#xff0c;采用加密方式进行传输//定义了一个静态数组int []arr{1,9,8,3};//1.加密//先给每位数加上5for (int i 0; i <arr.length …...