scrapy爬虫框架

news2024/9/21 17:42:03

scrapy爬虫框架

  • 一 scrapy架构介绍
  • 二 安装指南
  • 三 创建项目
    • 3.1 创建爬虫项目
    • 3.2 创建爬虫
    • 3.3 启动爬虫
    • 3.4 pycharm中运行
  • 四 scrapy解析数据
  • 五 settings相关配置
  • 六 持久化方案
  • 七 全站爬取cnblogs文章
  • 八 中间件

一 scrapy架构介绍

Scrapy一个开源和协作的框架,其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的,使用它可以以快速、简单、可扩展的方式从网站中提取所需的数据。但目前Scrapy的用途十分广泛,可用于如数据挖掘、监测和自动化测试等领域,也可以应用在获取API所返回的数据(例如 Amazon Associates Web Services ) 或者通用的网络爬虫。

Scrapy 是基于twisted框架开发而来,twisted是一个流行的事件驱动的python网络框架。因此Scrapy使用了一种非阻塞(又名异步)的代码来实现并发。整体架构大致如下。

在这里插入图片描述

The data flow in Scrapy is controlled by the execution engine, and goes like this:

数据流:

  1. The Engine gets the initial Requests to crawl from the Spider.
    引擎从爬行器获取要爬取的初始请求。

  2. The Engine schedules the Requests in the Scheduler and asks for the next Requests to crawl.
    引擎在调度器中调度请求,并请求抓取下一个请求。

  3. The Scheduler returns the next Requests to the Engine.
    调度器将下一个请求返回给引擎。

  4. The Engine sends the Requests to the Downloader, passing through the Downloader Middlewares (see process_request()).
    引擎将请求发送给下载程序,通过下载程序中间件(参见process_request())。

  5. Once the page finishes downloading the Downloader generates a Response (with that page) and sends it to the Engine, passing through the Downloader Middlewares (see process_response()).
    一旦页面完成下载,下载器将生成一个响应(使用该页面)并将其发送给引擎,通过下载器中间件(参见process_response())。

  6. The Engine receives the Response from the Downloader and sends it to the Spider for processing, passing through the Spider Middleware (see process_spider_input()).
    引擎接收来自下载程序的响应,并通过Spider中间件将其发送给Spider进行处理(请参见process_spider_input())。

  7. The Spider processes the Response and returns scraped items and new Requests (to follow) to the Engine, passing through the Spider Middleware (see process_spider_output()).
    爬行器处理响应,并通过爬行器中间件(参见process_spider_output())将抓取的项目和新请求返回给引擎。

  8. The Engine sends processed items to Item Pipelines, then send processed Requests to the Scheduler and asks for possible next Requests to crawl.
    引擎将处理过的项目发送到项目管道,然后将处理过的请求发送给调度器,并请求可能的下一个请求进行抓取。

  9. The process repeats (from step 1) until there are no more requests from the Scheduler.
    该过程重复(从步骤1开始),直到没有来自调度器的请求为止。

组件:
引擎(EGINE)
引擎负责控制系统所有组件之间的数据流,并在某些动作发生时触发事件。有关详细信息,请参见上面的数据流部分。

调度器(SCHEDULER)
用来接受引擎发过来的请求, 压入队列中, 并在引擎再次请求的时候返回. 可以想像成一个URL的优先级队列, 由它来决定下一个要抓取的网址是什么, 同时去除重复的网址。

下载器(DOWLOADER)
用于下载网页内容, 并将网页内容返回给EGINE,下载器是建立在twisted这个高效的异步模型上的。

爬虫(SPIDERS)
SPIDERS是开发人员自定义的类,用来解析responses,并且提取items,或者发送新的请求。

项目管道(ITEM PIPLINES)
在items被提取后负责处理它们,主要包括清理、验证、持久化(比如存到数据库)等操作。

下载器中间件(Downloader Middlewares)
位于Scrapy引擎和下载器之间,主要用来处理从EGINE传到DOWLOADER的请求request,已经从DOWNLOADER传到EGINE的响应response,你可用该中间件做以下几件事。

  1. process a request just before it is sent to the Downloader (i.e. right before Scrapy sends the request to the website);
    在请求发送给下载程序之前处理请求(即在Scrapy将请求发送给网站之前);
  2. change received response before passing it to a spider;
    在传递给爬行器之前更改接收到的响应;
  3. send a new Request instead of passing received response to a spider;
    发送新请求,而不是将接收到的响应传递给爬行器;
  4. pass response to a spider without fetching a web page;
    将响应传递给爬行器,而不获取网页;
  5. silently drop some requests.
    悄悄删除一些请求。

爬虫中间件(Spider Middlewares)
位于EGINE和SPIDERS之间,主要工作是处理SPIDERS的输入(即responses)和输出(即requests)。

中文文档:https://www.w3cschool.cn/scrapy2_3/scrapy2_3-31uw3fn1.html

官网:https://docs.scrapy.org/en/latest/topics/architecture.html

二 安装指南

安装 Scrapy

pip install scrapy

在Windows下安装可能会安装失败,也可以使用wheel文件安装。

wheel文件的安装及使用

  1. 使用pip安装wheel这个库。

    pip install whell
    
  2. 打开网址 https://www.lfd.uci.edu/~gohlke/pythonlibs/
    选择要下载的whl文件。
    在这里插入图片描述

  3. 使用whl文件安装。

    pip install whl文件路径
    

    在这里插入图片描述
    已经安装了twisted模块,下变安装一个pygame,先下载whl文件。

    在这里插入图片描述

三 创建项目

在安装了scrapy框架后,会在python解释器路径下的Script文件夹下产生一个scrapy.exe可执行文件。(相当于django框架的django-admin.exe)
在这里插入图片描述

3.1 创建爬虫项目

# cd到要创建的目录下
# scrapy startproject 项目名

scrapy startproject tutorial

在这里插入图片描述

目录包含以下内容

tutorial/
    scrapy.cfg            # deploy configuration file

    tutorial/             # project's Python module, you'll import your code from here
        __init__.py

        items.py          # project items definition file

        middlewares.py    # project middlewares file

        pipelines.py      # project pipelines file

        settings.py       # project settings file

        spiders/          # a directory where you'll later put your spiders
            __init__.py

3.2 创建爬虫

# cd到爬虫项目里
# scrapy genspider 爬虫名 url

scrapy genspider cnblogs www.cnblogs.com

在这里插入图片描述
在这里插入图片描述

3.3 启动爬虫

# scrapy crawl 爬虫名--nolog(不输出日志)

scrapy crawl cnblogs --nolog

在这里插入图片描述

3.4 pycharm中运行

新建run.py

from scrapy.cmdline import execute

execute(['scrapy', 'crawl', 'cnblogs', '--nolog'])
# execute(['scrapy', 'crawl', 'cnblogs'])

四 scrapy解析数据

当你抓取网页时,你需要执行的最常见的任务是从HTML源代码中提取数据。有几个库可以实现这一点,例如:

BeautifulSoup 在Python程序员中是一个非常流行的Web抓取库,它基于HTML代码的结构构造了一个Python对象,并且能够很好地处理错误的标记,但是它有一个缺点:速度慢。lxml 是一个XML解析库(它也解析HTML),使用基于 ​ElementTree​ . (LXML不是Python标准库的一部分。)

Scrapy有自己的数据提取机制。它们被称为选择器,因为它们“选择”HTML文档的某些部分 XPath 或 CSS 表达。

XPath 是一种在XML文档中选择节点的语言,也可以与HTML一起使用。 CSS 是用于将样式应用于HTML文档的语言。它定义选择器,将这些样式与特定的HTML元素相关联。

response对象有css方法和xpath方法

重点1-xpath取文本内容
	'.//a[contains(@class,"link-title")]/text()'
	-xpath取属性
	'.//a[contains(@class,"link-title")]/@href'

	-css取文本
	'a.link-title::text'
    -css取属性
    'img.image-scale::attr(src)'

重点2.extract_first()  取一个
    .extract()        取所有
import scrapy


class CnblogsSpider(scrapy.Spider):
    name = 'cnblogs'
    allowed_domains = ['www.cnblogs.com']
    start_urls = ['http://www.cnblogs.com/']

    def parse(self, response):
        # article_list = response.css('article.post-item')
        # for article in article_list:
            # # css选择器
            # article_title = article.css('section>div>a::text').extract_first()
            # author_icon = article.css('section>div>p>a>img::attr(src)').extract_first()
            # article_desc_list = article.css('section>div>p::text').extract()
            # author_name = article.css('section>footer>a>span::text').extract_first()
            # date = article.css('section>footer>span>span::text').extract_first()
            # article_desc = article_desc_list[0].replace('\n', '').replace(' ', '')
            # if not article_desc:
            #     article_desc = article_desc_list[1].replace('\n', '').replace(' ', '')
            # print(f"""
            # 作者名:{author_name}
            # 作者头像:{author_icon}
            # 文章标题:{article_title}
            # 文章描述:{article_desc}
            # 发布时间:{date}
            # """)
        article_list = response.xpath('//article[contains(@class,"post-item")]')
        for article in article_list:
            # xpath选择器
            article_title = article.xpath('./section/div/a/text()').extract_first()
            author_icon = article.xpath('./section/div/p/a/img/@src').extract_first()
            article_desc_list = article.xpath('./section/div/p/text()').extract()
            author_name = article.xpath('./section/footer/a/span/text()').extract_first()
            date = article.xpath('./section/footer/span/span/text()').extract_first()
            article_desc = article_desc_list[0].replace('\n', '').replace(' ', '')
            if not article_desc:
                article_desc = article_desc_list[1].replace('\n', '').replace(' ', '')
            print(f"""
                        作者名:{author_name}
                        作者头像:{author_icon}
                        文章标题:{article_title}
                        文章描述:{article_desc}
                        发布时间:{date}
                        """)

五 settings相关配置

基础:

ROBOTSTXT_OBEY = False 是否遵循爬虫协议

LOG_LEVEL = 'ERROR' 日志级别(报错如果不打印日志,在控制台看不到错误)

USER_AGENT 用户代理

USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36'

DEFAULT_REQUEST_HEADERS 默认请求头

DEFAULT_REQUEST_HEADERS = {
  'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
  'Accept-Language': 'en',
}

SPIDER_MIDDLEWARES 爬虫中间件

# 爬虫中间件
SPIDER_MIDDLEWARES = {
   'tutorial.middlewares.TutorialSpiderMiddleware': 543,
}

# 下载器中间件
DOWNLOADER_MIDDLEWARES = {
   'tutorial.middlewares.TutorialDownloaderMiddleware': 543,
}

ITEM_PIPELINES 持久化配置

ITEM_PIPELINES = {
   'tutorial.pipelines.TutorialPipeline': 300,
}

BOT_NAME = 'tutorial' 项目名

SPIDER_MODULES = ['myfirstscrapy.spiders']
NEWSPIDER_MODULE = 'myfirstscrapy.spiders' 指定爬虫类的py文件的位置

增加爬虫的爬取效率

  1. 增加并发:
    CONCURRENT_REQUESTS = 32
    增加并发,默认16。scrapy开启的并发线程为32个,可以适当进行增加。在settings配置文件中修改CONCURRENT_REQUESTS参数。

  2. 降低日志级别:
    LOG_LEVEL = 'INFO'
    在运行scrapy时,会有大量日志信息的输出,为了减少CPU的使用率。可以设置log输出信息为INFO或者ERROR即可。

  3. 禁止cookie:
    COOKIES_ENABLED = False
    如果不是真的需要cookie,则在scrapy爬取数据时可以禁止cookie从而减少CPU的使用率,提升爬取效率。

  4. 禁止重试:
    RETRY_ENABLED = False
    对失败的HTTP进行重新请求(重试)会减慢爬取速度,因此可以禁止重试。

  5. 减少下载超时:
    DOWNLOAD_TIMEOUT = 10 超时时间为10s
    如果对一个非常慢的链接进行爬取,减少下载超时可以能让卡住的链接快速被放弃,从而提升效率。

六 持久化方案

方案一:

import scrapy


class CnblogsSpider(scrapy.Spider):
    name = 'cnblogs'
    allowed_domains = ['www.cnblogs.com']
    start_urls = ['http://www.cnblogs.com/']

    def parse(self, response):
        data_list = []
        article_list = response.xpath('//article[contains(@class,"post-item")]')
        for article in article_list:
            # xpath选择器
            article_title = article.xpath('./section/div/a/text()').extract_first()
            author_icon = article.xpath('./section/div/p/a/img/@src').extract_first()
            article_desc_list = article.xpath('./section/div/p/text()').extract()
            author_name = article.xpath('./section/footer/a/span/text()').extract_first()
            date = article.xpath('./section/footer/span/span/text()').extract_first()
            article_desc = article_desc_list[0].replace('\n', '').replace(' ', '')
            if not article_desc:
                article_desc = article_desc_list[1].replace('\n', '').replace(' ', '')
            data_list.append({
                'author_name': author_name,
                'author_icon': author_icon,
                'article_title': article_title,
                'article_desc': article_desc,
                'date': date,

            })
        return data_list

在这里插入图片描述

在这里插入图片描述

方案二:使用pipline,管道形式,可以同时存到多个位置。

1.在items.py中写一个类[相当于写django的表模型],继承scrapy.Item。
2.在类中写属性,写字段,所有字段都是scrapy.Field类型.

name = scrapy.Field()

3.在爬虫中导入类,实例化得到对象,把要保存的数据放到对象中。

# 使用[]给对象添加属性,不能使用.
item['name'] = name

4.修改配置文件,指定pipline,数字表示优先级,越小越大。

ITEM_PIPELINES = {
   'tutorial.pipelines.TutorialPipeline': 300,
}

5.写一个pipline:TutorialPipeline。

- open_spider:数据初始化,打开文件,打开数据库链接
- process_item:真正存储的地方
- 一定不要忘了return item,交给后续的pipline继续使用
- close_spider:销毁资源,关闭文件,关闭数据库链接

七 全站爬取cnblogs文章

spiders/cnblogs.py

import scrapy
from tutorial.items import TutorialItem
from scrapy import Request


class CnblogsSpider(scrapy.Spider):
    name = 'cnblogs'
    allowed_domains = ['www.cnblogs.com']
    start_urls = ['http://www.cnblogs.com/']

    def detail_parse(self, response):
        item = response.meta.get('item')
        # 解析出文章详情
        article_content = response.css('div.post').extract_first()
        item['article_content'] = str(article_content)
        yield item

    def parse(self, response):
        article_list = response.xpath('//article[contains(@class,"post-item")]')
        for article in article_list:
            item = TutorialItem()
            # xpath选择器
            article_title = article.xpath('./section/div/a/text()').extract_first()
            author_icon = article.xpath('./section/div/p/a/img/@src').extract_first()
            article_desc_list = article.xpath('./section/div/p/text()').extract()
            author_name = article.xpath('./section/footer/a/span/text()').extract_first()
            date = article.xpath('./section/footer/span/span/text()').extract_first()
            article_desc = article_desc_list[0].replace('\n', '').replace(' ', '')
            # 文章详情
            url = article.xpath('./section/div/a/@href').extract_first()
            if not article_desc:
                article_desc = article_desc_list[1].replace('\n', '').replace(' ', '')
            item['article_title'] = article_title
            item['author_icon'] = author_icon
            item['author_name'] = author_name
            item['date'] = date
            item['article_desc'] = article_desc
            item['url'] = url
            yield Request(url=url, callback=self.detail_parse, meta={'item': item})

        # 获取下一页
        next_url = 'https://www.cnblogs.com/' + response.css('div.pager>a:last-child::attr(href)').extract_first()
        yield Request(url=next_url)

tutorial/items.py

# Define here the models for your scraped items
#
# See documentation in:
# https://docs.scrapy.org/en/latest/topics/items.html

import scrapy


class TutorialItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    article_title = scrapy.Field()
    author_icon = scrapy.Field()
    author_name = scrapy.Field()
    date = scrapy.Field()
    article_desc = scrapy.Field()
    url = scrapy.Field()
    article_content = scrapy.Field()

tutorial/pipelines.py

import pymysql


class TutorialPipeline:
    def open_spider(self, spider):
        self.conn = pymysql.connect(
            user='root',
            password='',
            host='127.0.0.1',
            database='tutorial',
            port=3306,
            autocommit=True,
        )
        self.course = self.conn.cursor()

    def process_item(self, item, spider):
        self.course.execute(
            "insert into article (`article_title`,`author_icon`,`author_name`,`date`,`article_desc`,`url`, `article_content`) values(%s,%s,%s,%s,%s,%s,%s)",
            args=[
                item['article_title'],
                item['author_icon'],
                item['author_name'],
                item['date'],
                item['article_desc'],
                item['url'],
                item['article_content'],
            ])
        return item

    def close_spider(self, spider):
        self.course.close()
        self.conn.close()

八 中间件

SpiderMiddleware

def process_spider_input(self, response, spider):  # 进入爬虫会执行它

def process_spider_output(self, response, result, spider):  # 从爬虫出来会执行它

def process_spider_exception(self, response, exception, spider):  # 出了异常会执行

def process_start_requests(self, start_requests, spider):  # 第一次爬取执行

def spider_opened(self, spider):  # 爬虫开启执行
# 下载中间件

DownloaderMiddleware

def process_request(self, request, spider):  # request对象从引擎进入到下载器会执行

def process_response(self, request, response, spider):  # response对象从下载器进入到引擎会执行

def process_exception(self, request, exception, spider):  # 出异常执行它

def spider_opened(self, spider):  # 爬虫开启执行它
class TutorialDownloaderMiddleware:
    # Not all methods need to be defined. If a method is not defined,
    # scrapy acts as if the downloader middleware does not modify the
    # passed objects.

    @classmethod
    def 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

    def process_request(self, request, spider):
        # Called for each request that goes through the downloader
        # middleware.

        # Must either:
        # - return None: continue processing this request
        # - or return a Response object
        # - or return a Request object
        # - or raise IgnoreRequest: process_exception() methods of
        #   installed downloader middleware will be called
        return None

    def process_response(self, request, response, spider):
        # Called with the response returned from the downloader.

        # Must either;
        # - return a Response object
        # - return a Request object
        # - or raise IgnoreRequest
        return response

    def process_exception(self, request, exception, spider):
        # Called when a download handler or a process_request()
        # (from other downloader middleware) raises an exception.

        # Must either:
        # - return None: continue processing this exception
        # - return a Response object: stops process_exception() chain
        # - return a Request object: stops process_exception() chain
        pass

    def spider_opened(self, spider):
        spider.logger.info('Spider opened: %s' % spider.name)

DownloaderMiddleware的process_request

返回值:
	- return None: 继续执行下面的中间件的process_request
	- return a Response object: 不进入下载中间件了,直接返回给引擎,引擎在返回给爬虫
	- return a Request object:不进入中间件了,直接返回给引擎,引擎把它放到调度器中

DownloaderMiddleware的process_response

返回值:
	- return a Response object:正常,会进入到引擎,引擎把它给爬虫
	- return a Request object: 会进入到引擎,引擎把它放到调度器中,等待下次爬取
	- raise IgnoreRequest :    会执行process_exception

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

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

相关文章

在线购物电商网站毕业设计,网上购物商城系统设计与实现,毕业设计怎么写论文毕设源码开题报告需求分析怎么做

项目背景和意义 目的:伴随着互联网技术的不断发展和完善,在人们的生活和工作的各个方面,互联网都有着非常重大的影响。伴随着国内电子商务行业的迅猛发展,消费者现在能够轻松的实现足不出户的,仅仅通过网络购物平台就可…

【工作经历分享】软件测试求职真的难,但是我还是从7K涨到了14K

上个礼拜刚好转正了,三个月试用期,五月份换的工作。 现在这份工作,相比上一份确实好很多,比如工资直接涨了一倍,7到14,13薪,朝九晚六,从不加班,项目也简单,包…

Kubernetes基础概念

什么是Kubernetes 1.用于自动部署、扩展和管理“容器化( containerized) 应用程序”的开源系统 2.可以理解成K8S是负责自动化运维管理多个容器化程序(比如Docker)的集群,是–个生态极其丰富的容器编排框架工具 Kubernetes作用 1.用于自动部署、扩展和管理“容器化…

2022下半年的软考成绩公布时间?

今年软考下半年成绩公布时间预估在12月15-20日左右。 软考成绩一般并没有一个固定的时间点公布,不过从近几年软考办成绩查询通知公布时间来看,大多是下午出的成绩。一般来说,成绩查询通知公布之前的几分钟,考生已经可以查成绩了。…

使用Golang语言walk框架开发一个简单的windowsGUI

1、前言 最近使用golang语言开发了一个windowsGUI的Demo,由于golang语言属于比较新的语言,对GUI开发这一块并没有原生库也没有推荐库,因此我在github上找到了一个叫做walk的GUI开发框架。 github原址为:http://github.com/lxn/w…

定时执行专家 —— 定时循环发送TCP消息(例如:控制设备的开关机等场景)

《定时执行专家》是一款制作精良、功能强大、简单易用、毫秒级精度、专业级的定时任务执行软件。软件具有 21 种【任务类型】、12 种【触发器】触发方式,并且全面支持界面化Cron表达式设置。软件采用多线程并发方式检测任务触发和任务执行,能够达到毫秒级…

带你快速入门JDBC

1,JDBC概述 在开发中我们使用的是java语言,那么势必要通过java语言操作数据库中的数据。这就是接下来要学习的JDBC。 1.1 JDBC概念 JDBC 就是使用Java语言操作关系型数据库的一套API 全称:( Java DataBase Connectivity ) Java 数据库连接 …

Win11的两个实用技巧系列之开机后桌面无响应怎么办?

目录 win10开机后桌面无响应怎么办?win10开机后桌面无响应点什么都不行 win10开机后桌面无响应点什么都不行怎么办? Win10和Win11 22H2如何关闭文字热门搜索? Win11 22H2关闭文字热门搜索 Win10 22H2关闭文字热门搜索 点击拿去 win10开机后桌面无响应怎么办…

NR PUSCH power control

这篇看下NR PUSCH power control的相关内容,主要内容集中在38.213 7.1章节,功率计算无非就是一个长公式,根据RRC配置的参数及后续DCI field 的内容作出功率的调整;最初这部分看的就云里雾里的,最近再看,相比…

环境土壤物理模型HYDRUS

HYDRUS是由著名土壤学家Rien van Genuchten和Jirka Simunek等人基于Windows系统界面开发的环境土壤物理模拟软件,是模拟一维和多维变饱和多孔介质的水流、溶质运移、根系吸水和溶质吸收、热量传输等的强有力工具。除基础功能以外,该模型还附有一系列扩展…

交叉验证、网格搜索、模型选择与调优、鸢尾花案例增加K值调优与Facebook人造世界签到位置train.csv数据预测代码实现

一、交叉验证 交叉验证(cross validation):将拿到的训练数据分为训练和验证集,以下图为例,将数据分成4份,其中一份作为验证集,经过4次(组)的测试,每次都更换不同的验证集,即得到4组模型的结果&…

One-shot就能做事件抽取?ChatGPT在信息抽取上的强大应用

One-shot就能做事件抽取?ChatGPT在信息抽取上的强大应用0. 前言1. 灵感2. 实验3. 结论0. 前言 近期,OpenAI发布的chat GPT可谓是各种刷屏,很多人都在关注这种模式是否可以应用于搜索引擎,这给做搜索的朋友们带来了很大的危机感。…

强大的VS插件DevExpress CodeRush v22.1 - 让代码编程更智能

DevExpress CodeRush是一个强大的Visual Studio .NET 插件,它利用整合技术,通过促进开发者和团队效率来提升开发者体验。为Visual Studio IDE增压、消除重复的代码并提高代码质量,可以快速思考、自动化测试、可视化调试和重构。 CodeRush v2…

vue学习笔记(一)-vue基础语法

视频教程:尚硅谷Vue2.0Vue3.0全套教程丨vuejs从入门到精通_哔哩哔哩_bilibili 相关文档:Vue核心 Vue简介 初识 (yuque.com) 兼容性 Vue 不支持 IE8 及以下版本,因为 Vue 使用了 IE8 无法模拟的 ECMAScript 5 特性。但它支持所有兼容 ECMAS…

RabbitMQ入门

1. 什么是MQ 消息队列(Message Queue,简称MQ),从字面意思上看,本质是个队列,FIFO先入先出,只不过队列中存放的内容是message而已 作用:应用程序“对”应用程序的通信方法。 2. 应用场景 主要解决异步处理…

pixel 3xl 手机如何烧录自己编译的android 12代码

pixel 3xl 手机如何烧录自己编译的android 12代码 一.查看pixel 3xl手机支持的Android 12版本 通过浏览器访问android版本跟代号网页查看对应的pixel 3XL 手机支持的android 版本跟代号 可以看出,pixel 3XL手机支持Adnroid 12的有Android 12.0.0_r31, Android 12.…

华为机试 - 区间交叠问题

目录 题目描述 输入描述 输出描述 用例 题目解析 算法源码 题目描述 给定坐标轴上的一组线段,线段的起点和终点均为整数并且长度不小于1,请你从中找到最少数量的线段,这些线段可以覆盖柱所有线段。 输入描述 第一行输入为所有线段的数…

键盘输入保护器:KeyScrambler

创新技术屏蔽数字资产 KeyScrambler 开创性的击键加密技术可在 Windows 操作系统、所有浏览器和数百个关键应用程序中实时深入地保护用户键入的信息。 值得信赖的软件让用户安心 KeyScrambler 已经被世界各地的专家、博主和用户测试和使用了 16 年,并被证明对最阴险…

ANSYS_Dsigner仿真串扰

1、边沿RT的大小对串扰的影响 仿真电路如下图所示: V1为V_Pulse电压源,设置如图所示: A4为耦合微带线 这里一定要设置为9.6mil,因为介质厚度我设置的是4.8mil,如果没阻抗匹配会在串扰的基础上增加信号的反射&#xff…

【计算机视觉】完整版复习

计算机标定 齐次坐标 齐次坐标,将欧氏空间的无穷远点,与投影空间中有实际意义的消失点,建立起映射关系。 把齐次坐标转化为笛卡尔坐标的方法:是前面n-1个坐标分量分别除以最后一个分量即可 一些解释和性质: 比较好的…