从零开始学python(十四)百万高性能框架scrapy框架

前言

回顾之前讲述了python语法编程 必修入门基础和网络编程,多线程/多进程/协程等方面的内容,后续讲到了数据库编程篇MySQL,Redis,MongoDB篇,和机器学习,全栈开发,数据分析,爬虫数据采集/自动化和抓包前面没看的也不用往前翻,系列文已经整理好了:

1.跟我一起从零开始学python(一)编程语法必修
2.跟我一起从零开始学python(二)网络编程
3.跟我一起从零开始学python(三)多线程/多进程/协程
4.跟我一起从零开始学python(四)数据库编程:MySQL数据库
5.跟我一起从零开始学python(五)数据库编程:Redis数据库
6.跟我一起从零开始学python(六)数据库编程:MongoDB数据库
7.跟我一起从零开始学python(七)机器学习
8.跟我一起从零开始学python(八)全栈开发
9.跟我一起从零开始学python(九)数据分析
10.跟我一起从零开始学python(十)Hadoop从零开始入门
11.跟我一起从零开始学python(十一)简述spark
12.跟我一起从零开始学python(十二)如何成为一名优秀的爬虫工程师
13.跟我一起从零开始学python(十三)爬虫工程师自动化和抓包

适用于零基础学习和进阶人群的python资源:

① 腾讯认证python完整项目实战教程笔记PDF
② 十几个大厂python面试专题PDF
③ python全套视频教程(零基础-高级进阶JS逆向)
④ 百个项目实战+源码+笔记
⑤ 编程语法-机器学习-全栈开发-数据分析-爬虫-APP逆向等全套项目+文档

本系列文根据以下学习路线展开讲述,由于内容较多,:

从零开始学python到高级进阶路线图

框架源码专题

一丶scrapy框架

一丶框架基本使用

Scrapy是一个用于爬取网站数据的Python框架。它提供了一套强大的工具和API,可以简化爬取、处理和存储数据的过程。下面我将详细解释Scrapy框架的基本使用。

1.安装Scrapy:

首先,确保已在Python环境中安装了pip(Python包管理器)。然后,可以使用以下命令在命令行中安装Scrapy:

pip install scrapy

2.创建Scrapy项目:

在命令行中,使用以下命令创建一个新的Scrapy项目:

scrapy startproject project_name

这将在当前目录下创建一个名为project_name的文件夹,其中包含Scrapy项目的基本结构。

3.定义爬虫:

在Scrapy项目中,爬虫是用于定义如何爬取特定网站的类。在项目的spiders目录中,可以创建一个新的Python文件来定义你的爬虫。下面是一个简单的示例:

import scrapyclass MySpider(scrapy.Spider):name = 'example'start_urls = ['http://www.example.com']def parse(self, response):# 在这里处理网页响应,提取数据等pass

在上面的示例中,我们定义了一个名为MySpider的爬虫,指定了名称为example,并指定了起始URL为http://www.example.com。在parse方法中,你可以处理网页响应,并提取你需要的数据。

4.提取数据:

在parse方法中,可以使用Scrapy提供的选择器来提取网页中的数据。Scrapy支持多种选择器,如XPath和CSS选择器。下面是一个使用XPath提取数据的示例:

def parse(self, response):titles = response.xpath('//h1/text()').getall()for title in titles:yield {'title': title}

在上面的示例中,我们使用XPath选择器提取网页中所有

标签的文本内容,并将其封装为一个字典。然后使用yield语句将字典作为一个数据项返回。

5.定义数据存储:

Scrapy提供了多种数据存储的方式,如存储为JSON、CSV或数据库。你可以在项目的pipelines.py文件中定义数据存储管道。下面是一个简单的示例:

import jsonclass JsonWriterPipeline:def open_spider(self, spider):self.file = open('data.json', 'w')def close_spider(self, spider):self.file.close()def process_item(self, item, spider):line = json.dumps(dict(item)) + '\n'self.file.write(line)return item

在上面的示例中,我们定义了一个将爬取的数据存储为JSON格式的管道。在process_item方法中,我们将数据项转换为JSON格式,并写入文件。你也可以根据需要自定义其他存储管道,如存储到数据库中。

6.运行爬虫:

如何运行爬虫取决于你的需求。在命令行中,可以使用以下命令运行爬虫:

scrapy crawl example

这里的example是爬虫的名称,对应MySpider类的name属性。Scrapy将会开始运行爬虫,并根据设定的规则爬取网页并处理数据。

这些是Scrapy框架的基本使用方法。通过定义爬虫、提取数据和设置数据存储管道,你可以利用Scrapy框架快速、高效地爬取和处理网站数据。你还可以进一步研究Scrapy的高级功能,如设置请求头、处理页面间的链接、使用中间件等。官方文档为进一步学习Scrapy提供了详细的介绍和示例代码:https://docs.scrapy.org/

二丶scrapy功能学习

1.Selector数据处理

在Scrapy框架中,使用Selector类对网页进行数据提取和处理是常见的操作之一。Selector提供了强大的API,支持使用XPath选择器或CSS选择器来定位和提取网页中的数据。下面我将详细解释Selector的使用方法。

首先,你需要导入Selector类:

from scrapy import Selector

然后,你可以使用Selector类来创建一个选择器对象,并将网页的内容作为参数传入:

# 以网页内容创建Selector对象
selector = Selector(text=html_content)

这里的html_content是网页的内容,可以是字符串形式的HTML代码或网页响应的文本。

接下来,可以使用选择器对象来提取和处理数据。

  • 使用XPath选择器提取数据
# 使用XPath选择器提取
data = selector.xpath('//h1/text()').get()

  • 使用CSS选择器提取数据
# 使用CSS选择器提取
data = selector.css('h1::text').get()
  • 提取多个数据
# 提取多个数据
data_list = selector.xpath('//div[@class="item"]/text()').getall()

  • 嵌套选择器
# 嵌套选择器
parent_element = selector.xpath('//div[@class="parent"]')
data = parent_element.xpath('./span/text()').get()

2.xpath选择器

在Scrapy框架源码中,XPath选择器被广泛用于网页数据的提取和处理。XPath是一种用于在HTML/XML文档中定位元素的查询语言,通过使用XPath选择器,可以方便地定位和提取网页中的数据。下面我将详细解释XPath选择器的用法和功能。

1.XPath基本语法:

XPath使用路径表达式来描述元素的位置,路径表达式由一系列的节点选择器和轴运算符组成。以下是XPath的一些基本语法规则:

  • /: 表示从根节点开始的绝对路径,例如:/html/body/div.
  • //: 表示在整个文档中搜索符合条件的元素,例如://div.
  • .: 表示当前节点,例如:./span.
  • …: 表示当前节点的父节点,例如:…/div.
  • @: 表示获取元素的属性值,例如:@href.

2.XPath节点选择器:

XPath提供了多种节点选择器,用于选择和匹配不同类型的元素。以下是一些常用的节点选择器:

  • nodename: 选择所有指定节点名称的元素,例如:div.
  • : 选择所有子元素,例如:.
  • @attribute: 选择指定属性的元素,例如:@href.
  • [@attribute=‘value’]: 根据属性值选择元素,例如:- [@class=‘container’].

3.XPath轴运算符:

轴运算符用于根据元素的相对位置选择元素。以下是一些常用的轴运算符:

  • ancestor::: 选择所有祖先节点,例如:ancestor::div.
  • parent::: 选择当前节点的父节点,例如:parent::div.
  • preceding-sibling::: 选择当前节点之前的所有同级节点,例如:preceding-sibling::div.

4.使用XPath选择器提取数据:

在Scrapy中,可以使用Selector类的xpath()方法来执行XPath选择器。下面是一些示例:

from scrapy.selector import Selector# 创建Selector对象
selector = Selector(text=html_content)# 提取文本内容
data = selector.xpath('//h1/text()').get()# 提取属性值
href = selector.xpath('//a/@href').get()# 提取多个数据
data_list = selector.xpath('//div[@class="item"]/text()').getall()

在上面的示例中,我们首先创建了一个Selector对象,其中html_content是网页的内容。然后使用xpath()方法并传入XPath表达式来选择和提取数据。get()方法用于获取第一个匹配项,而getall()方法用于获取所有匹配项的列表。

XPath选择器的功能非常强大,你可以根据具体的网页结构和需求编写自己的选择器表达式来提取和处理网页中的数据。同时,XPath还支持诸如谓语(Predicates)、逻辑运算符(and、or、not)、函数(contains、starts-with、normalize-space)等高级功能,可以进一步扩展和定制你的选择器。

3.CSS选择器

在Scrapy框架源码中,CSS选择器也是一种常用的方法来提取和处理网页数据。与XPath选择器相比,CSS选择器使用起来更简洁直观。下面我将详细讲解CSS选择器的用法和功能。

1.基本语法:

CSS选择器使用简洁的语法来选择元素。以下是一些基本的CSS选择器语法:

  • tagname: 选择指定标签名的元素,例如:div.
  • .#id: 选择具有指定id的元素,例如:#container.
  • .class: 选择具有指定class的元素,例如:.item.
  • *: 选择所有元素.
  • element1, element2: 同时选择多个元素,例如:div, span.

2.层级关系和子元素选择:

CSS选择器支持选择元素的子元素和后代元素。以下是一些示例:

  • parent > child: 选择父元素下的直接子元素,例如:div > span.
  • ancestor descendant: 选择祖先元素下的后代元素,例如:body span.

3.属性选择器:

CSS选择器还支持根据元素的属性进行选择。以下是一些常见的属性选择器:

4.伪类选择器:

伪类选择器用于选择具有特殊状态或特定位置的元素。以下是一些常见的伪类选择器:

  • :first-child: 选择父元素的第一个子元素.
  • :last-child: 选择父元素的最后一个子元素.
  • :nth-child(n): 选择父元素的第n个子元素.
  • :not(selector): 选择不匹配给定选择器的元素.

5.使用CSS选择器提取数据:

在Scrapy中,可以使用Selector类的css()方法来执行CSS选择器。下面是一些示例:

from scrapy.selector import Selector# 创建Selector对象
selector = Selector(text=html_content)# 提取文本内容
data = selector.css('h1::text').get()# 提取属性值
href = selector.css('a::attr(href)').get()# 提取多个数据
data_list = selector.css('div.item::text').getall()

在上面的示例中,我们首先创建了一个Selector对象,其中html_content是网页的内容。然后使用css()方法并传入CSS选择器表达式来选择和提取数据。get()方法用于获取第一个匹配项,而getall()方法用于获取所有匹配项的列表。

CSS选择器的语法简洁明了,易于理解和使用。通过灵活运用CSS选择器,你可以在Scrapy框架中方便地提取和处理网页数据。

4.scrapy对接MySQL

在Scrapy框架中,将数据存储到MySQL数据库是一种常见的需求。Scrapy提供了一个方便的方式来实现与MySQL数据库的对接。下面我将详细说明如何在Scrapy框架中对接MySQL数据库。

1.安装MySQL驱动:

首先,确保已经安装了Python的MySQL驱动程序。在Scrapy中,常用的MySQL驱动包括mysql-connector-pythonpymysql。你可以使用以下命令来安装其中一个驱动程序:

pip install mysql-connector-python

pip install pymysql

2.配置数据库连接:

在Scrapy项目的settings.py文件中,可以配置MySQL数据库连接信息。例如,你需要指定数据库主机、数据库名称、用户名和密码等。以下是一个示例的配置:

# MySQL数据库连接信息
MYSQL_HOST = 'localhost'
MYSQL_PORT = 3306
MYSQL_DATABASE = 'mydatabase'
MYSQL_USER = 'myuser'
MYSQL_PASSWORD = 'mypassword'

3.创建数据库连接:

在Scrapy的爬虫代码中,你可以使用以上配置信息来创建与MySQL数据库的连接。在Spider类的__init__方法中,可以使用MySQL驱动来建立数据库连接。以下是一个示例代码:

import mysql.connectorclass MySpider(scrapy.Spider):def __init__(self, *args, **kwargs):super(MySpider, self).__init__(*args, **kwargs)self.conn = mysql.connector.connect(host=settings.MYSQL_HOST,port=settings.MYSQL_PORT,database=settings.MYSQL_DATABASE,user=settings.MYSQL_USER,password=settings.MYSQL_PASSWORD)self.cursor = self.conn.cursor()

4.存储数据到数据库:

在Scrapy的爬虫代码中,当你需要将数据存储到MySQL数据库时,可以通过执行SQL语句来实现。以下是一个示例代码:

class MySpider(scrapy.Spider):# ...def parse(self, response):# 解析响应数据data = {'title': response.xpath('//title/text()').get(),'content': response.xpath('//div[@class="content"]/text()').get()}# 执行插入数据的SQL语句sql = "INSERT INTO mytable (title, content) VALUES (%s, %s)"values = (data['title'], data['content'])self.cursor.execute(sql, values)self.conn.commit()

在上面的示例中,我们定义了一个parse方法,从响应中提取数据,并将其存储到MySQL数据库中。我们执行了一个插入数据的SQL语句,并使用execute()方法执行该语句,然后使用commit()方法提交事务。

需要注意的是,当爬虫关闭时,你应该在爬虫的closed方法中关闭数据库连接,以释放资源。以下是一个示例代码:

class MySpider(scrapy.Spider):# ...def closed(self, reason):self.cursor.close()self.conn.close()

以上就是在Scrapy框架中对接MySQL数据库的详细步骤。通过配置数据库连接信息,创建数据库连接,然后执行SQL语句来存储数据,你可以方便地将爬取到的数据保存到MySQL数据库中。

5.Scrapy对接MongoDB

在Scrapy框架中,对接MongoDB数据库是一种常见的需求。Scrapy提供了一个方便的方式来实现与MongoDB的对接。下面我将详细说明如何在Scrapy框架中对接MongoDB数据库。

1.安装MongoDB驱动:
首先,确保已经安装了Python的MongoDB驱动程序。在Scrapy中,常用的MongoDB驱动包括pymongo和mongoengine。你可以使用以下命令来安装其中一个驱动程序:

pip install pymongo

pip install mongoengine

2.配置数据库连接:

在Scrapy项目的settings.py文件中,可以配置MongoDB数据库连接信息。例如,你需要指定数据库主机、数据库名称等。以下是一个示例的配置:

# MongoDB数据库连接信息
MONGO_URI = 'mongodb://localhost:27017/'
MONGO_DATABASE = 'mydatabase'

3.创建数据库连接:

在Scrapy的爬虫代码中,你可以使用以上配置信息来创建与MongoDB数据库的连接。在Spider类的__init__方法中,可以使用MongoDB驱动来建立数据库连接。以下是一个示例代码:

from pymongo import MongoClientclass MySpider(scrapy.Spider):def __init__(self, *args, **kwargs):super(MySpider, self).__init__(*args, **kwargs)self.client = MongoClient(settings.MONGO_URI)self.db = self.client[settings.MONGO_DATABASE]

4.存储数据到数据库:

在Scrapy的爬虫代码中,当你需要将数据存储到MongoDB数据库时,可以使用相应的MongoDB驱动提供的方法来实现。以下是一个示例代码:

class MySpider(scrapy.Spider):# ...def parse(self, response):# 解析响应数据data = {'title': response.xpath('//title/text()').get(),'content': response.xpath('//div[@class="content"]/text()').get()}# 存储数据到MongoDB集合collection = self.db['mycollection']collection.insert_one(data)

在上面的示例中,我们定义了一个parse方法,从响应中提取数据,并将其存储到MongoDB数据库中。我们通过insert_one()方法将数据插入到指定的集合中。

需要注意的是,当爬虫关闭时,你应该在爬虫的closed方法中关闭数据库连接,以释放资源。以下是一个示例代码:

class MySpider(scrapy.Spider):# ...def closed(self, reason):self.client.close()

以上就是在Scrapy框架中对接MongoDB数据库的详细步骤。通过配置数据库连接信息,创建数据库连接,然后使用相应的驱动方法存储数据,你可以方便地将爬取到的数据保存到MongoDB数据库中。

6.Scrapy文件存储

在Scrapy框架中,文件存储是一个常见的需求,特别是在网络爬虫中,我们经常需要将爬取到的数据以文件的形式保存下来。Scrapy提供了多种方式来实现文件存储,包括保存为本地文件、存储到云存储服务(如Amazon S3)、存储到FTP服务器等。下面我将详细介绍Scrapy框架中文件存储的几种方式。

1.保存为本地文件:

最简单的文件存储方式是将数据保存为本地文件。在Scrapy的爬虫代码中,你可以通过在settings.py文件中配置FEED_URI和FEED_FORMAT来实现。以下是一个示例配置:

# 保存为本地文件
FEED_URI = 'result.json'
FEED_FORMAT = 'json'

在以上配置中,FEED_URI指定了保存的文件路径和文件名,FEED_FORMAT指定了保存的文件格式。你可以将格式设为json、csv、xml等等。

2.存储到云存储服务(如Amazon S3):

如果你希望将文件存储到云存储服务,如Amazon S3,Scrapy也提供了相应的方式来实现。首先,你需要安装scrapy-extensions扩展包,可以通过以下命令进行安装:

pip install scrapy-extensions

然后,在settings.py文件中配置相应的信息。以下是一个示例配置:

# 存储到Amazon S3
FEED_URI = 's3://mybucket/result.json'
FEED_FORMAT = 'json'
AWS_ACCESS_KEY_ID = 'your_access_key_id'
AWS_SECRET_ACCESS_KEY = 'your_secret_access_key'

在以上配置中,FEED_URI指定了存储的目标位置,这里是Amazon S3的桶和文件名,FEED_FORMAT指定了保存的文件格式。同时,你需要提供有效的Amazon S3访问凭证,即AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY。

3.存储到FTP服务器:

如果你希望将文件存储到FTP服务器,Scrapy同样提供了支持。在settings.py文件中,你可以配置FTP服务器的连接信息。以下是一个示例配置:

# 存储到FTP服务器
FEED_URI = 'ftp://username:password@ftp.example.com/result.json'
FEED_FORMAT = 'json'

在以上配置中,FEED_URI指定了FTP服务器的连接信息,包括用户名、密码、服务器地址和保存的文件名,FEED_FORMAT指定了保存的文件格式。

需要注意的是,以上配置项是在settings.py文件中进行配置的,具体的文件存储方式取决于你的需求。你可以根据自己的实际情况选择适合的文件存储方式。在爬虫代码中,当爬取到数据后,Scrapy会自动将数据保存到指定的文件位置。

三丶scrapy中间件

Scrapy框架中的中间件(Middleware)是其强大灵活的机制之一,它允许开发者在请求(Request)和响应(Response)的处理过程中进行拦截、修改或扩展。中间件可以用于实现各种功能,如请求和响应的处理、User-Agent的随机切换、代理设置、错误处理等。在本文中,我将为你详细解释Scrapy中间件的原理和使用方法。

1、什么是中间件?

在Scrapy中,中间件是一系列组件,可以对每个请求和响应进行处理。Scrapy的请求和响应经过一系列中间件的处理,每个中间件可以在请求或响应经过自己时执行预定义的操作,然后继续将请求或响应传递给后续的中间件。中间件以管道(Pipeline)的方式连接在一起,形成一个处理链。Scrapy默认提供了一些中间件,同时也允许开发者定制自己的中间件。

2、Scrapy中的中间件类型

Scrapy中的中间件分为两类:请求中间件(Request Middleware)和响应中间件(Response Middleware)。请求中间件在请求发送之前执行,可以对请求进行修改、拦截或进行预处理。响应中间件在得到响应后执行,可以对响应进行修改、拦截或进行后处理。

3、中间件的执行顺序

Scrapy中的中间件执行顺序可以通过在settings.py文件中的DOWNLOADER_MIDDLEWARES和SPIDER_MIDDLEWARES配置项中设置中间件的顺序来控制。数值越小的中间件会越早执行。这些配置项是一个包含中间件类路径的字典,可以对其中的中间件进行排序和启用/禁用。同时,还可以通过process_request、process_response等方法的priority属性控制中间件方法的执行顺序。

4、中间件的编写

为了编写一个自定义的中间件,你需要创建一个类并实现Scrapy提供的中间件基类的方法。以下是一个简单示例:

class MyMiddleware:def process_request(self, request, spider):# 处理请求的自定义逻辑return Nonedef process_response(self, request, response, spider):# 处理响应的自定义逻辑return response

在上述示例中,MyMiddleware是一个自定义的中间件类。其中,process_request()方法在发起请求前会被调用,可以对请求进行修改或拦截。process_response()方法在收到响应后会被调用,可以对响应进行修改或后处理。注意,需要在方法中返回相应的请求或响应对象,以便中间件链的下一个中间件继续处理。

5、中间件的配置

为了启用和配置自定义的中间件,你需要在settings.py文件中进行相应的配置。以下是一个示例配置:

DOWNLOADER_MIDDLEWARES = {'myproject.middlewares.MyMiddleware': 543,# 其他中间件...
}

在上述示例中,DOWNLOADER_MIDDLEWARES配置项指定了下载器中间件的配置。其中,543是中间件的优先级,数值越小的中间件会越早执行。myproject.middlewares.MyMiddleware是自定义中间件的类路径。

6、常见的中间件应用场景

  • 请求预处理:可以在请求中间件中进行一些通用的预处理操作,如添加通用的请求头信息、设置代理等。
  • User-Agent随机切换:可以在请求中间件中随机选择User-Agent,以避免被大量请求的网站识别为爬虫。
  • 代理设置:可以在请求中间件中设置代理,以实现IP的轮换或匿名性。
  • 防止重复请求:可以在请求中间件中根据一定的规则过滤掉重复的请求。
  • 错误处理:可以在响应中间件中对处理请求时发生的错误进行处理,如超时、连接错误等。

以上是中间件的一些常见应用场景,你可以根据自己的需求开发相应的中间件来实现这些功能。

总结
Scrapy中的中间件是其强大灵活的机制之一,可以通过编写自定义的中间件来实现各种功能。中间件分为请求中间件和响应中间件,可以对每个请求和响应进行拦截、修改或扩展。通过配置中间件的顺序和优先级,可以控制中间件的执行顺序。常见的中间件应用场景包括请求预处理、User-Agent随机切换、代理设置、防止重复请求和错误处理等

适用于零基础学习和进阶人群的python资源:

① 腾讯认证python完整项目实战教程笔记PDF
② 十几个大厂python面试专题PDF
③ python全套视频教程(零基础-高级进阶JS逆向)
④ 百个项目实战+源码+笔记
⑤ 编程语法-机器学习-全栈开发-数据分析-爬虫-APP逆向等全套项目+文档

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

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

相关文章

Java多线程面试21题

并行和并发有什么区别? 并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔发生。 并行是在不同实体上的多个事件,并发是在同一实体上的多个事件。 在一台处理器上“同时”处理多个任务,在多台处理…

C++多线程环境下的单例类对象创建

使用C无锁编程实现多线程下的单例模式 贺志国 2023.8.1 一、尺寸较小的类单例对象创建 如果待创建的单例类SingletonForMultithread内包含的成员变量较少,整个类占用的内存空间较小,则可以使用如下方法来创建单例对象(如果类的尺寸较大&am…

新SDK平台下载开源全志D1-H/D1s的SDK

获取SDK SDK 使用 Repo 工具管理,拉取 SDK 需要配置安装 Repo 工具。 Repo is a tool built on top of Git. Repo helps manage many Git repositories, does the uploads to revision control systems, and automates parts of the development workflow. Repo is…

C语言的转义字符

转义字符也叫转移序列&#xff0c;包含如下&#xff1a; 转移序列 \0oo 和 \xhh 是 ASCII 码的特殊表示。 八进制数示例&#xff1a; 代码&#xff1a; #include<stdio.h> int main(void) {char beep\007;printf("%c\n",beep);return 0; }结果&#xff1a; …

机器视觉初步14:相机标定原理及应用

相机标定是指通过已知的相机参数&#xff0c;解算相机内部参数矩阵和外部参数矩阵。 文章目录 1.为什么要标定&#xff1f;2.工业场景中常见的标定方法2.1. 使用棋盘格标定板&#xff08;Checkerboard Markers&#xff09;2.2 使用相机自标定2.3. 使用三维物体标定2.4.九孔标…

【Linux】—— 进程的创建和退出

序言&#xff1a; 在上期&#xff0c;我们已经对 Linux的进程的相关知识进行了相关的学习。接下来&#xff0c;我们要学习的便是关于进程控制 的基本知识&#xff01;&#xff01;&#xff01; 目录 &#xff08;一&#xff09;进程创建 1、fork函数初识 2、写时拷贝 3、f…

Docker中容器数据卷

容器数据卷 一.什么是容器数据卷二.使用数据卷方式一&#xff1a;直接使用命令来挂载 -v 三.具名和匿名挂载 一.什么是容器数据卷 docker理念 将应用和环境打包成一个镜像&#xff01; 数据&#xff1f;如果数据都在容器中&#xff0c;那么我们的容器删除&#xff0c;数据就会…

oracle 19c打补丁遭遇OPATCHAUTO-72043OPATCHAUTO-68061

最近&#xff0c;在AIX上的新装oracle 19C数据库基础版本&#xff0c;使用opatchauto打PSU补丁集35037840时遇到了OPATCHAUTO-72043报错&#xff0c;无法正常应用GI补丁。 一、环境描述 操作系统&#xff1a;AIX 数据库版本&#xff1a;oracle rac 19.3.0新装基础版 应用PS…

2023拒绝内卷!两年转行网络安全真实看法!

我目前转行网络安全两年&#xff0c;没啥天分&#xff0c;全靠努力&#xff0c;基本能够得上中级的水平了。看到大家对转行网络安全挺感兴趣&#xff0c;也有挺多争议&#xff0c;想把我的建议和经验告诉大家。 有很多人觉得网络安全已经饱和了&#xff0c;现在选择这个工作&a…

Spring Boot : ORM 框架 JPA 与连接池 Hikari

数据库方面我们选用 Mysql &#xff0c; Spring Boot 提供了直接使用 JDBC 的方式连接数据库&#xff0c;毕竟使用 JDBC 并不是很方便&#xff0c;需要我们自己写更多的代码才能使用&#xff0c;一般而言在 Spring Boot 中我们常用的 ORM 框架有 JPA 和 Mybaties &#xff0c;本…

面试之多线程案例(四)

1.单例模式 单例模式是指在内存中只会创建且仅创建一次对象的设计模式。在程序中多次使用同一个对象且作用相同时&#xff0c;为了防止频繁地创建对象使得内存飙升&#xff0c;单例模式可以让程序仅在内存中创建一个对象&#xff0c;让所有需要调用的地方都共享这一单例对象。…

[React]生命周期

前言 学习React&#xff0c;生命周期很重要&#xff0c;我们了解完生命周期的各个组件&#xff0c;对写高性能组件会有很大的帮助. Ract生命周期 React 生命周期分为三种状态 1. 初始化 2.更新 3.销毁 初始化 1、getDefaultProps() 设置默认的props&#xff0c;也可以用duf…

【数据结构】实现单链表的增删查

目录 1.定义接口2.无头单链表实现接口2.1 头插addFirst2.2 尾插add2.3 删除元素remove2.4 修改元素set2.5 获取元素get 3.带头单链表实现接口3.1 头插addFirst3.2 尾插add3.3 删除元素remove3.4 判断是否包含元素element 1.定义接口 public interface SeqList<E>{//默认…

关于拓扑排序

又重新学了一下拓扑排序&#xff0c;这次发现就十分简单了&#xff0c;拓扑排序的步骤 1.他必须是一个有向无环图&#xff0c;起点我们就是入度为0的点 2.我们首先要输出的就是入度为0的点&#xff0c;然后依次删除这些点连向的点&#xff0c;使这些点的入度-1&#xff0c;如果…

Java集合数组相互转换

1.集合转换成数组 &#xff08;1&#xff09;集合a通过toArray()方法进行转换为数组&#xff0c;可以转换成为指定类型的数组&#xff0c;但是这些类型都必须是object类型的子类&#xff0c;基本类型不可以。 必要时我们使用强制类型转换&#xff0c;转成我们需要的类型。 Li…

葡萄叶病害数据集

1.数据集 分成训练集和测试集 训练集有四个文件夹 第一个文件夹为 Grape Black Measles&#xff08;葡萄黑麻疹&#xff09;病害&#xff08;3783张&#xff09; Grape Black rot葡萄黑腐病病害数据集&#xff08;3596张&#xff09; Grape Healthy 健康葡萄叶&#xff08;25…

Maven项目解决cannot resolve plugin maven-deploy-plugin:2.7

导入maven项目后&#xff0c;编辑的时候提示一些插件加载失败&#xff01;大概率是你的网络有问题&#xff0c;插件下载失败。 如下图&#xff1a;&#xff08;网络突然好了&#xff0c;我想截图但是没有复现&#xff0c;用网上找到的截图代替&#xff0c;明白意思就行&#x…

Anaconda创建虚拟环境

参考文章 1 Win10RTX3060配置CUDA等深度学习环境 pytorch 管网&#xff1a;PyTorch 一 进入 Anaconda 二 创建虚拟环境 conda create -n pytorch python3.9注意要注意断 VPN切换镜像&#xff1a; 移除原来的镜像 # 查看当前配置 conda config --show channels conda config…

4-百度地图

4-百度地图 一 百度地图 1 前期准备 H5端和PC端,对接百度提供JavaScript API。 移动端,对接百度android SDK或ios SDK (1)打开百度地图开放平台 地址:https://lbsyun.baidu.com/ (2)选中开发文档——JavaScript Api 按照文档步骤开通百度开放平台并申请密钥 2 展示地…

Java多线程(四)

目录 一、线程的状态 1.1 观察线程的所有状态 1.2 线程状态和状态转移的意义 1.2.1 NEW、RUNNABLE、TERMINATED状态转换 1.2.2 WAITING、BLOCKED、TIMED_WAITING状态转换 1.2.3 yield()大公无私让出cpu 一、线程的状态 1.1 观察线程的所有状态 public class Demo9 {public st…