【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
      

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/874751.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Java+SpringMvc+Vue技术的慈善捐赠平台设计与实现(源码+LW+部署讲解)

项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功以及课程答疑&#xff01; 软件开发环境及开发工具&#xff1a; 操作系统&#xff1a;Windows 10、Windows 7、Windows 8 开发语言&#xff1a;java 前端技术&#xff1a;JavaScript、VUE.j…

vue的this.$forceUpdate()和this.$set()

目录 this.$forceUpdate() 下面举个例子&#xff1a; 改变数组的7种方法&#xff1a; this.$set() 基本用法&#xff1a; 向对象添加属性 向数组添加属性 总的来说&#xff1a; this.$forceUpdate() 使用this.$forceUpdate()可以强制组件重新渲染。在Vue.js中&#xff0…

列举excel中调整行高列宽的五种方法

列举excel中调整行高列宽的五种方法 在Excel中调整行高列宽的方法有以下五种&#xff1a; 使用鼠标手动调整行高列宽&#xff1a;将鼠标悬停在行或列的边界上&#xff0c;光标会变成双向箭头&#xff0c;此时按住鼠标左键并拖动边界即可调整行高或列宽。 使用快捷键调整行高列…

工具(linux)

Yum 软件包管理器 介绍 yum Yum 是一个在 Red Hat 和 CentOS 等 Linux 发行版中常用的软件包管理器&#xff0c;它可以方便地进行软件包的安装、更新和删除。 安装软件包 使用 yum install 命令可以安装指定的软件包&#xff0c;例如&#xff1a; yum install package_nam…

DataLoader的使用 Pytorch

在 PyTorch 中&#xff0c;tensor.shape 返回一个包含张量各维度大小的元组。 所以&#xff0c;当你执行 print(img.shape)&#xff0c;你看到的 (3, 32, 32) 实际上是在告诉你&#xff1a; 这是一个三维张量第一维&#xff08;通道&#xff09;的大小是 3第二维&#xff08;…

“论软件测试中缺陷管理及其应用”写作框架,软考高级论文,系统架构设计师论文

原创范文 软件缺陷指的是计算机软件或程序中存在的某种破坏正常运行能力的问题、错误&#xff0c;或者隐藏的功能缺陷。缺陷的存在会导致软件产品在某种程度上不能满足用户的需要。在目前的软件开发过程中&#xff0c;缺陷是不可避免的。软件测试是发现缺陷的主要手段&#xf…

【北航主办丨本届SPIE独立出版丨已确认ISSN号】第三届智能机械与人机交互技术学术会议(IHCIT 2024,7月27)

由北京航空航天大学指导&#xff0c;北京航空航天大学自动化科学与电气工程学院主办&#xff0c;AEIC学术交流中心承办的第三届智能机械与人机交互技术学术会议&#xff08;IHCIT 2024&#xff09;将定于2024年7月27日于中国杭州召开。 大会面向基础与前沿、学科与产业&#xf…

路由表与IP数据报转发:基础小白指南

目录 1. 路由表的基本概念 2. 路由表中的默认路由 3. IP数据报的转发流程 4. 路由聚合 5. 最长前缀匹配 总结 在网络世界中&#xff0c;IP数据报的转发是如何进行的&#xff1f; 这篇文章将带你深入了解路由表的基本概念和IP数据报的转发流程。我们会用简洁明了的语言和实…

nodejs启动项目报错 Error: listen EACCES: permission denied 0.0.0.0:5000

nodejs启动项目报错 Error: listen EACCES: permission denied 0.0.0.0:5000&#xff0c;截图如下&#xff1a; 解决方法 在管理员权限下打开 CMD&#xff08;命令行&#xff09;并运行&#xff1a; net stop winnatnet start winnat 执行完成后在此通过nodejs启动项目即可…

centos系统mysql数据库差异备份与恢复

文章目录 差异备份mysql数据一、 安装 Percona XtraBackup数据库中创建一些数据三、创建全备份四、创建差异备份1. 在数据库中添加数据&#xff0c;让数据发生一些改变2. 创建第一个差异备份3. 数据库中再次添加一些数据4. 创建第二个差异备份 五、模拟数据丢失&#xff0c;删库…

【测开能力提升-Javascript】JavaScript介绍+数值类型

注释&#xff1a; 作为一名合格的测试&#xff0c;首先得会一些基础的后端语言&#xff0c;当然我选择了python&#xff0c;作为测试开发&#xff0c;对代码运行效率要求并不是很高&#xff0c;以及python强大的第三方库&#xff0c;如上一家公司&#xff0c;处理rtcm数据&…

minio 服务docker配置

用minio docker配置了一个服务&#xff0c;分享链接始终是127.0.01开始的&#xff0c; 改成docker的host的ip则提示签名不匹配&#xff0c; 好在这个文件主要是用来下载的&#xff0c;所以可以通过设置bucket的匿名访问权限来实现下载&#xff1b; 这样不需要后面的地址参数就…

UM960硬件设计,最小系统推荐设计

备注&#xff1a; l L1&#xff1a;推荐使用 0603 封装的 68 nH 射频电感l C1&#xff1a;推荐使用 100 nF 100 pF 两个电容并联l C2&#xff1a;推荐使用 100 pF 电容l C3&#xff1a;推荐使用 n 10 μF 1 100 nF 电容并联&#xff0c;总容值不小于 30 μFl R1&#xff1…

Mysql sql技巧与优化

1、解决mysql同时更新、查询问题 2、控制查询优化 hint 3、 优化 特定类型的查 优化 COUNT() 查询 使用 近似值 业务能接受近似值的话&#xff0c;使用explain拿到近似值 优化关联查询 优化子查询 4、优化group by和distinct 优化GROUP BY WITH ROLLUP 5、优化 limit分页 其他…

AI智能名片微信小程序在品牌战略与私域流量构建中的应用与深度探索

摘要&#xff1a;在数字经济时代&#xff0c;私域流量的价值日益凸显&#xff0c;成为企业和个人实现可持续增长的重要驱动力。品牌&#xff0c;作为私域流量的核心&#xff0c;其稳定性和影响力直接关系到流量的质量与转化效率。AI智能名片微信小程序&#xff0c;作为数字营销…

为什么样本方差(sample variance)的分母是 n-1?

样本均值与样本方差的定义 首先来看一下均值&#xff0c;方差&#xff0c;样本均值与样本方差的定义 总体均值的定义&#xff1a; μ 1 n ∑ i 1 n X i \mu\frac{1}{n}\sum_{i1}^{n} X_i μn1​i1∑n​Xi​ 也就是将总体中所有的样本值加总除以个数&#xff0c;也可以叫做总…

倚天屠龙记高手排名

张无忌&#xff1a;其武功配置堪称无双&#xff0c;乾坤大挪移、完全版九阳神功、太极拳剑&#xff0c;再加上后来习得的降龙十八掌&#xff0c;使他成为当之无愧的武林至尊。九阳神功的内力绵绵不绝&#xff0c;使他连拍一千招降龙十八掌也不觉疲累&#xff0c;其威力甚至超过…

vuepress搭建个人文档

vuepress搭建个人文档 文章目录 vuepress搭建个人文档前言一、VuePress了解二、vuepress-reco主题个人博客搭建三、vuepress博客部署四、vuepress后续补充 总结 vuepress搭建个人文档 所属目录&#xff1a;项目研究创建时间&#xff1a;2024/7/23作者&#xff1a;星云<Xing…

git配置代理

git配置代理 添加全局代理&#xff1a; #我在本地7890端口配置了代理&#xff0c;通过该端口转发&#xff0c;这里转发的地址和端口可根据自己的实际情况进行配置 git config --global http.proxy http://127.0.0.1:7890 git config --global https.proxy http://127.0.0.1:7…

Java毕业设计 基于SSM和Vue的跑腿系统小程序

Java毕业设计 基于SSM和Vue的跑腿系统小程序 这篇博文将介绍一个基于SSM框架和Vue开发的跑腿系统微信小程序&#xff0c;适合用于Java毕业设计。 功能介绍 跑腿员 登录 注册 忘记密码 首页 图片轮播 校友动态 校友动态详情 任务 在线接单 任务订单 我的 我的收藏 联系客…