爬虫 — Scrapy 框架(一)
目录
- 一、介绍
- 1、同步与异步
- 2、阻塞与非阻塞
- 二、工作流程
- 三、项目结构
- 1、安装
- 2、项目文件夹
- 2.1、方式一
- 2.2、方式二
- 3、创建项目
- 4、项目文件组成
- 4.1、piders/__ init __.py
- 4.2、spiders/demo.py
- 4.3、__ init __.py
- 4.4、items.py
- 4.5、middlewares.py
- 4.6、pipelines.py
- 4.7、settings.py
- 4.8、scrapy.cfg
- 5、运行项目
- 5.1、方式一
- 5.2、方式二
- 四、入门案例
- 五、翻页
- 六、parsel 第三方库
- 1、css 选择器
- 2、xpath
- 3、re
- 七、案例
一、介绍
Scrapy 是一个为了爬取网站数据,提取结构性数据而编写的应用框架。可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。
点击进入官网
1、同步与异步
同步:指的是按照代码的顺序依次执行,每个任务都要等待上一个任务完成后才能执行,处理大量任务或耗时操作时可能导致程序性能下降。
异步:一个任务的执行不会影响到后续任务的执行,允许程序在等待某个操作完成的同时执行其它任务,提高了程序的并发性和性能。
2、阻塞与非阻塞
阻塞:指的是当一个任务执行一个 I/O 操作时,任务会一直等待直到操作完成才能继续执行后续代码,当任务发起一个 I/O 操作(如读取文件、发送网络请求等),任务会被挂起,直到操作完成后才能恢复执行,可能会造成资源浪费和程序响应性下降。
非阻塞:指的是当一个任务执行一个 I/O 操作时,任务不会等待操作完成,而是立即返回并继续执行后续代码,当任务发起一个 I/O 操作,如果操作不能立即完成,任务不会被挂起,而是继续执行后续代码,提高了程序的并发性和响应性。
二、工作流程
各组件作用
组件 | 作用 | 是否需要手写 |
---|---|---|
引擎(Scrapy Engine) | 总指挥:负责数据和信号的在不同模块间的传递 | Scrapy 已经实现 |
调度器(Scheduler) | 一个队列,存放引擎发过来的 request 请求 | Scrapy 已经实现 |
下载器(Downloader) | 下载把引擎发过来的 request 请求,并返回给引擎 | Scrapy 已经实现 |
爬虫(Spider) | 处理引擎发过来的 request,提取数据,提取 url,并交给引擎 | 需要手写 |
管道(Item Pipline) | 处理引擎传过来的数据,比如存储 | 需要手写 |
下载中间件(Downloader Middlewares) | 可以自定义的下载扩展,比如设置 User-Agent 代理 | 一般不用手写 |
爬虫中间件(Spider Middlewares) | 可以自定义 requests 请求和进行 requests 过滤 | 一般不用手写 |
大概流程
- 爬虫(Spider)发起初始请求。
- 下载器(Downloader)下载网页并将响应返回给爬虫(Spider)。
- 爬虫(Spider)解析响应,提取数据和新的请求。
- 新的请求由调度器(Scheduler)进行调度,并交给下载器(Downloader)下载。
- 数据由爬虫(Spider)交给管道(Item Pipline)进行处理。
三、项目结构
1、安装
在终端输入命令:
pip install scrapy==2.5.1
2、项目文件夹
2.1、方式一
在目标文件夹地址栏直接输入 cmd 后,按回车。
2.2、方式二
按 win + r 弹出一个窗口,输入 cmd 命令后按回车,会进入终端,输入命令,进入目标文件夹。
切换盘符:
f:
切换到目标文件夹:
cd F:\Python
3、创建项目
scrapy startproject mySpider
scrapy startproject 是创建一个爬虫项目的固定命令,mySpider 是项目名称,可更改。
cd mySpider
切换到项目文件夹。
scrapy genspider demo baidu.com
scrapy genspider 是生成爬虫文件的固定命令,demo 是爬虫文件名,可更改,baidu.com 是爬取的域名,可更改。
4、项目文件组成
4.1、piders/__ init __.py
这是一个空的 __ init __.py 文件,用于标识 spiders 目录为一个 Python 包。在该目录中,通常存放着 Scrapy 框架中的爬虫(Spider)模块文件。
4.2、spiders/demo.py
这是一个爬虫(Spider)模块文件,包含了定义一个名为 demo 的 Spider 类的代码。该 Spider 类定义了如何发起请求、解析响应和提取数据的逻辑。
4.3、__ init __.py
这是一个空的 __ init __.py 文件,用于标识当前目录为一个 Python 包。
4.4、items.py
这是一个模型(Model)模块文件,用于定义抓取的数据结构。通常,可以在该文件中定义一个名为 Item 的类,描述要抓取的数据的字段和结构。
4.5、middlewares.py
这是一个中间件(Middleware)模块文件,用于定义 Scrapy 框架中的中间件组件。中间件可以在请求和响应的处理过程中进行自定义操作,例如修改请求头、处理代理等。
4.6、pipelines.py
这是一个管道(Pipeline)模块文件,用于定义 Scrapy 框架中的数据处理管道组件。管道负责对爬取的数据进行处理,例如数据清洗、验证和存储等操作。
4.7、settings.py
这是一个配置(Settings)模块文件,包含了 Scrapy 框架的配置选项。可以在该文件中设置爬虫的参数、中间件、管道以及其它框架相关的设置。
4.8、scrapy.cfg
这是 Scrapy 项目的配置文件,包含了项目的基本配置信息,如项目名称、启用的爬虫、管道和中间件等。
5、运行项目
5.1、方式一
在终端运行
scrapy crawl demo # demo 是爬虫文件的名字
5.2、方式二
在当前项目下创建一个 py 文件
from scrapy import cmdline# demo 是爬虫文件的名字
cmdline.execute('scrapy crawl demo'.split())
四、入门案例
目标网站:https://quotes.toscrape.com/
需求:翻页爬取每页的名人,名言,标签
页面分析
1、先获取第一页数据,再实现翻页爬取
2、确定 url,通过分析,可以在源码中看到数据,确定数据是静态加载,所以目标 url 为 https://quotes.toscrape.com/
3、确定数据在网页中的位置,通过 xpath 解析
3.1、每一条数据都存放在 <div class="quote"></div>
标签里面,所以 xpath 语法://div[@class="quote"]
,返回一个元素列表,进行遍历
3.2、名言 xpath 语法为:.//span[1]/text()
3.3、作者 xpath 语法为:.//span[2]/small[1]/text()
3.4、标签 xpath 语法为:.//div[1]/a/text()
项目实现
1、打开终端,进入对应的文件目录下
2、创建 Scrapy 项目:scrapy startproject my_scrapy
3、进入项目:cd my_scrapy
4、创建爬虫文件:scrapy genspider spider quotes.toscrape.com
代码实现
1、在项目目录下创建一个 start.py 文件,用来运行项目。
注意:一定要在 start.py 文件下运行,在其它项目文件下运行,该项目不生效。
# start.py
# 使用 cmdline 模块来执行命令行命令
from scrapy import cmdline# 使用 Scrapy 执行名为 spider 的爬虫
cmdline.execute('scrapy crawl spider'.split())
执行后会打印红色的日志信息,可在 settings.py 文件里设置隐藏日志信息。
# settings.py
# 日志级别调整为警告
LOG_LEVEL = 'WARNING'
2、获取网页源代码,在 spider.py 文件里做相关操作。
# spider.py
import scrapy # 导入 Scrapy 库,用于构建爬虫# 定义一个爬虫类
class SpiderSpider(scrapy.Spider):# 爬虫的名称name = 'spider'# 允许爬取的域名allowed_domains = ['quotes.toscrape.com']# 起始 urlstart_urls = ['https://quotes.toscrape.com/']# 解析函数,处理响应并提取数据def parse(self, response):# 打印响应结果print(response.text)
3、创建项目的相关数据结构,在 items.py 文件里做相关操作。
# items.py
import scrapy # 导入Scrapy库,用于构建爬虫# 自定义的Item类,用于存储爬取的数据
class MyScrapyItem(scrapy.Item):# define the fields for your item here like:# name = scrapy.Field()# 名言text = scrapy.Field() # 用于存储名言文本内容的字段# 名人author = scrapy.Field() # 用于存储名人文本内容的字段# 标签tags = scrapy.Field() # 用于存储标签文本内容的字段
4、确定获取到源码之后,在 spider.py 文件里做解析。
# spider.py
import scrapy # 导入 Scrapy 库,用于构建爬虫
from my_scrapy.items import MyScrapyItem # 导入自定义的 Item 类,用于存储爬取的数据# 定义一个爬虫类
class SpiderSpider(scrapy.Spider):# 爬虫的名称name = 'spider'# 允许爬取的域名allowed_domains = ['quotes.toscrape.com']# 起始 urlstart_urls = ['https://quotes.toscrape.com/']# 解析函数,处理响应并提取数据def parse(self, response):# 使用 XPath 选取所有 class 为 quote 的 div 元素divs = response.xpath('//div[@class="quote"]')# 遍历每个 div 元素for div in divs:# 创建一个 MyScrapyItem 实例,用于存储爬取的数据item = MyScrapyItem()# 获取名言文本item['text'] = div.xpath('.//span[1]/text()').get()# 获取名人文本item['author'] = div.xpath('.//span[2]/small[1]/text()').get()# 获取标签文本item['tags'] = div.xpath('.//div[1]/a/text()').getall()# 打印数据print(item)
注意:在 Scrapy 框架里,get() 返回一条数据,getall() 返回多条数据。
5、确定当前数据获取到之后,进行翻页获取其它数据。
# spider.py
import scrapy # 导入 Scrapy 库,用于构建爬虫
from my_scrapy.items import MyScrapyItem # 导入自定义的 Item 类,用于存储爬取的数据# 定义一个爬虫类
class SpiderSpider(scrapy.Spider):# 爬虫的名称name = 'spider'# 允许爬取的域名allowed_domains = ['quotes.toscrape.com']# 起始 urlstart_urls = ['https://quotes.toscrape.com/']# 解析函数,处理响应并提取数据def parse(self, response):# 使用 XPath 选取所有 class 为 quote 的 div 元素divs = response.xpath('//div[@class="quote"]')# 遍历每个 div 元素for div in divs:# 创建一个 MyScrapyItem 实例,用于存储爬取的数据item = MyScrapyItem()# 获取名言文本item['text'] = div.xpath('.//span[1]/text()').get()# 获取名人文本item['author'] = div.xpath('.//span[2]/small[1]/text()').get()# 获取标签文本item['tags'] = div.xpath('.//div[1]/a/text()').getall()# 返回 item,将其传递给引擎yield item# 翻页爬取,获取下一页按钮next = response.xpath('//li[@class="next"]/a/@href').get()# 拼接下一页链接# 方法一:# url = self.start_urls[0] + next# 方法二:url = response.urljoin(next)# 发起一个新的请求,url 为 next 的绝对 url,并将响应交给 parse 方法处理yield scrapy.Request(url, callback=self.parse)
注意:
正常操作运行项目,代码可能会有报错,这个时候可以考虑是不是允许爬取的域名做了限制,可以将 allowed_domains =[‘quotes.toscrape.com’] 注释掉。
6、保存数据
6.1、方法一
可以在 start.py 文件直接进行保存。
# start.py
# 使用 cmdline 模块来执行命令行命令
from scrapy import cmdline# 使用 Scrapy 执行名为 spider 的爬虫
# cmdline.execute('scrapy crawl spider'.split())# 使用 Scrapy 执行名为 spider 的爬虫,并将结果保存到 demo.csv 文件中
cmdline.execute('scrapy crawl spider -o demo.csv'.split())
6.2、方法二
可以在管道里面保存数据。
# pipelines.py
# 自定义的管道类
class MyScrapyPipeline:# 处理 Item 的方法,负责将数据存储到文件中def process_item(self, item, spider):# 保存数据with open('demo.txt', 'a', encoding='utf-8') as f:# 将 item 中的 text 字段和 author 字段拼接为一个字符串s = item['text'] + item['author']# 将拼接后的字符串写入文件,并在末尾添加换行符f.write(s + '\n')# 返回 item,继续后续的处理过程return item
注意:在管道里面保存数据,要记得在 setting.py 里启用管道,找到以下代码并取消注释。
ITEM_PIPELINES = {'my_scrapy.pipelines.MyScrapyPipeline': 300,
}
五、翻页
目标网站:https://quotes.toscrape.com/
需求:翻页爬取前4页的名人,名言,标签
分析
需要重新构造 url
第一页:https://quotes.toscrape.com/page/1/
第二页:https://quotes.toscrape.com/page/2/
第三页:https://quotes.toscrape.com/page/3/
第四页:https://quotes.toscrape.com/page/4/
方法一:
# spider.py
import scrapy # 导入 Scrapy 库,用于构建爬虫
from my_scrapy.items import MyScrapyItem # 导入自定义的 Item 类,用于存储爬取的数据# 定义一个爬虫类
class SpiderSpider(scrapy.Spider):# 爬虫的名称name = 'spider'# 爬虫的名称allowed_domains = ['quotes.toscrape.com']# 页码page = 1# 链接 urlbase_url = 'https://quotes.toscrape.com/page/{}/'# 起始 urlstart_urls = [base_url.format(page)]# 解析函数,处理响应并提取数据def parse(self, response):# 使用 XPath 选取所有 class 为 quote 的 div 元素divs = response.xpath('//div[@class="quote"]')# 遍历每个 div 元素for div in divs:# 创建一个 MyScrapyItem 实例,用于存储爬取的数据item = MyScrapyItem()# 获取名言文本item['text'] = div.xpath('.//span[1]/text()').get()# 获取名人文本item['author'] = div.xpath('.//span[2]/small[1]/text()').get()# 获取标签文本item['tags'] = div.xpath('.//div[1]/a/text()').getall()# 返回 item,将其传递给引擎yield item# 判断页码if self.page <= 4:# 页码self.page = self.page + 1# 获取数据yield scrapy.Request(self.base_url.format(self.page), callback=self.parse) # callback是回调函数,相当于是发完请求,在那个方法中解析
方法二:
重写内部的方法实现翻页。
# spider.py
import scrapy # 导入 Scrapy 库,用于构建爬虫
from my_scrapy.items import MyScrapyItem # 导入自定义的 Item 类,用于存储爬取的数据# 定义一个爬虫类
class SpiderSpider(scrapy.Spider):# 爬虫的名称name = 'spider'# 允许爬取的域名allowed_domains = ['quotes.toscrape.com']# 页码page = 1# 链接 urlbase_url = 'https://quotes.toscrape.com/page/{}/'# 起始 urlstart_urls = [base_url.format(page)]# start_reqeusts 重写的父类方法,优先执行自己def start_requests(self):# 翻页for page in range(1, 5):# 确定 urlurl = self.base_url.format(page)# 获取数据yield scrapy.Request(url, callback=self.parse)# 解析函数,处理响应并提取数据def parse(self, response):# 使用 XPath 选取所有 class 为 quote 的 div 元素divs = response.xpath('//div[@class="quote"]')# 遍历每个 div 元素for div in divs:# 创建一个 MyScrapyItem 实例,用于存储爬取的数据item = MyScrapyItem()# 获取名言文本item['text'] = div.xpath('.//span[1]/text()').get()# 获取名人文本item['author'] = div.xpath('.//span[2]/small[1]/text()').get()# 获取标签文本item['tags'] = div.xpath('.//div[1]/a/text()').getall()# 返回 item,将其传递给引擎yield item
六、parsel 第三方库
内置了 css 选择器,xpath,re,必须通过 get、getall 获取内容。
模拟数据
import parselhtml_doc = """
<html><head><title>The Dormouse's story</title></head>
<body>
<p class="title"><b>The Dormouse's story</b></p><p class="story">Once upon a time there were three little sisters; and their names were
<a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>,
<a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
and they lived at the bottom of a well.</p><p class="story">...</p>
"""# 创建对象
selector = parsel.Selector(html_doc)
1、css 选择器
# 解析数据,查找 a 标签
print(selector.css('a').get())
print(selector.css('a').getall())
2、xpath
# xpath语法
print(selector.xpath('//a[@class="sister"]/text()').get())
print(selector.xpath('//a[@class="sister"]/text()').getall())
print(selector.xpath('//a[@class="sister"]/@href').get())
print(selector.xpath('//a[@class="sister"]/@href').getall())
3、re
注意:正常解析数据是可以的,但是 sub() 这个方法在这里不能用,如需调用方法,建议使用 import re。
# re
print(selector.re('.*?<a href="(.*?)" class="sister" id="link1">(.*?)</a>')) # 默认返回的数据类型是list
七、案例
目标网站:https://fabiaoqing.com/biaoqing/lists/page/1.html
需求:翻页爬取图片链接、图片,并以图片名字保存。
页面分析
先爬取第一页数据
确定 url:https://fabiaoqing.com/biaoqing/lists/page/1.html
先获取整个页面的 img 标签
遍历获取每一个属性值
代码实现
1、创建项目
2、编写代码
在 settings.py 文件中修改一些参数。
# settings.py
# 不打印日志信息
LOG_LEVEL = 'WARNING'
# Obey robots.txt rules
ROBOTSTXT_OBEY = False
# Override the default request headers:
DEFAULT_REQUEST_HEADERS = {'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8','Accept-Language': 'en','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36'
}
修改 imgspider.py 文件中的网址,并打印网站源代码。
# imgspider.py
import scrapy # 导入 Scrapy 库,用于构建爬虫class ImgspiderSpider(scrapy.Spider):# 爬虫的名称name = 'imgspider'# 允许爬取的域名allowed_domains = ['fabiaoqing.com']# 起始 urlstart_urls = ['https://fabiaoqing.com/biaoqing/lists/page/1.html']def parse(self, response):print(response.text)
新建一个 start.py 用来运行代码。
# start.py
# 使用 cmdline 模块来执行命令行命令
from scrapy import cmdline# 使用 Scrapy 执行名为 spider 的爬虫
cmdline.execute('scrapy crawl imgspider'.split())
确定源码拿到后,开始解析数据。
# imgspider.py
import scrapy # 导入 Scrapy 库,用于构建爬虫
import re # 导入 re 模块,用于进行正则表达式匹配
from Img_Download.items import ImgDownloadItem # 导入自定义的 Item 类,用于存储爬取的数据class ImgspiderSpider(scrapy.Spider):# 爬虫的名称name = 'imgspider'# 允许爬取的域名# allowed_domains = ['fabiaoqing.com']# 起始 urlstart_urls = ['https://fabiaoqing.com/biaoqing/lists/page/1.html']def parse(self, response):# 解析数据,找所有的 img 标签images = response.xpath('//img[@class="ui image lazy"]')# 遍历获取每一个 img 标签,解析里面的图片 url 以及标题for img in images:# 图片 urlimg_url = img.xpath('@data-original').get()# 标题title = img.xpath('@title').get()# 正则表达式替换标题特殊字符title = re.sub(r'[?/\\<>*:(), ]', '', title)# 打印图片 url 和标题,验证内容是否获取到# print(img_url, title)# break# 对获取到的图片 url,再次构造请求,cb_kwargs 传递参数yield scrapy.Request(img_url, callback=self.save_img, cb_kwargs={'title': title})# 重新创建一个方法,获取图片二进制的内容def save_img(self, response, **title):# 写入到文件,保存item = ImgDownloadItem()# 图片 url,在框架获取二进制内容用.bodyitem['content'] = response.body# 标题item['title'] = title['title']yield item
在 items.py 文件里创建项目的相关数据结构。
# items.py
import scrapy # 导入Scrapy库,用于构建爬虫# 自定义的Item类,用于存储爬取的数据
class ImgDownloadItem(scrapy.Item):# define the fields for your item here like:# name = scrapy.Field()# 标题title = scrapy.Field()# 图片内容content = scrapy.Field()
在 pipelines.py 文件里保存数据。
# pipelines.py
# 自定义的管道类
class ImgDownloadPipeline:# 处理 Item 的方法,负责将数据存储到文件中def process_item(self, item, spider):# 保存数据with open(f'images/{item["title"]}.jpg', 'wb') as f:# 写入数据f.write(item['content'])# 打印信息print(f'{item["title"]}下载成功')# 返回 item,继续后续的处理过程return item
在 settings.py 文件里找到以下代码,取消注释,开启使用管道。
# settings.py
# Configure item pipelines
# See https://docs.scrapy.org/en/latest/topics/item-pipeline.html
ITEM_PIPELINES = {'Img_Download.pipelines.ImgDownloadPipeline': 300,
}
提前在文件夹里创建 images 文件夹,运行代码,获取第一页数据。
第一页数据获取到后,进行翻页获取数据。
分析翻页 url
第一页:https://fabiaoqing.com/biaoqing/lists/page/1.html
第二页:https://fabiaoqing.com/biaoqing/lists/page/2.html
第三页:https://fabiaoqing.com/biaoqing/lists/page/3.html
翻页获取数据
# imgspider.py
import scrapy # 导入 Scrapy 库,用于构建爬虫
import re # 导入 re 模块,用于进行正则表达式匹配
from Img_Download.items import ImgDownloadItem # 导入自定义的 Item 类,用于存储爬取的数据class ImgspiderSpider(scrapy.Spider):# 爬虫的名称name = 'imgspider'# 允许爬取的域名# allowed_domains = ['fabiaoqing.com']# 链接 urlbase_url = 'https://fabiaoqing.com/biaoqing/lists/page/{}.html'# 页码page = 1# 起始 urlstart_urls = [base_url.format(page)]def parse(self, response):# 解析数据,找所有的 img 标签images = response.xpath('//img[@class="ui image lazy"]')# 遍历获取每一个 img 标签,解析里面的图片 url 以及标题for img in images:# 图片 urlimg_url = img.xpath('@data-original').get()# 标题title = img.xpath('@title').get()# 正则表达式替换标题特殊字符title = re.sub(r'[?/\\<>*:(), ]', '', title)# 打印图片 url 和标题,验证内容是否获取到# print(img_url, title)# break# 对获取到的图片 url,再次构造请求,cb_kwargs 传递参数yield scrapy.Request(img_url, callback=self.save_img, cb_kwargs={'title': title})# 翻页if self.page <= 10:self.page += 1# 获取数据yield scrapy.Request(self.base_url.format(self.page), callback=self.parse)# 重新创建一个方法,获取图片二进制的内容def save_img(self, response, **title):# 写入到文件,保存item = ImgDownloadItem()# 图片 url,在框架获取二进制内容用.bodyitem['content'] = response.body# 标题item['title'] = title['title']yield item
如果爬取的速度过快,会被服务器识别是一个程序,可以设置一下爬取的速度。
在 settings.py 文件里找到以下代码,取消注释。
# settings.py
# Configure a delay for requests for the same website (default: 0)
# See https://docs.scrapy.org/en/latest/topics/settings.html#download-delay
# See also autothrottle settings and docs
# 设置爬取时间
DOWNLOAD_DELAY = 0.5
记录学习过程,欢迎讨论交流,尊重原创,转载请注明出处~
相关文章:

爬虫 — Scrapy 框架(一)
目录 一、介绍1、同步与异步2、阻塞与非阻塞 二、工作流程三、项目结构1、安装2、项目文件夹2.1、方式一2.2、方式二 3、创建项目4、项目文件组成4.1、piders/__ init __.py4.2、spiders/demo.py4.3、__ init __.py4.4、items.py4.5、middlewares.py4.6、pipelines.py4.7、sett…...

Python编程语言学习笔记
目录 1 书写格式1.1 程序框架格式1.1 注释1.2 保留字 2 数据2.1 整数类型2.2 浮点类型2.3 复数类型2.4 数值运算符2.5 数值运函数2.6 数值类型转换函数2.7 math 库2.8 字符串2.8.1 字符串的表示2.8.2 字符串的区间访问2.8.3 字符串操作符2.8.4 字符串操作函数 2.9 字符串类型的…...
【运维面试100问】(三)说说你在故障排除方面的经历
本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》:python零基础入门学习 《python运维脚本》: python运维脚本实践 《shell》:shell学习 《terraform》持续更新中:terraform_Aws学习零基础入门到最佳实战 《k8…...

Postman 全局配置接口路径变量等
Postman 全局配置接口路径变量等 一、简介 这里主要是介绍通过配置postman接口测试工具,简化每次新增模块等接口时修改url的繁琐过程,方便以后查阅!!! 二、全局变量设置 1、新增测试环境 新增测试环境 2、接口集合设…...

一文掌握CodiMD安装与使用
简介:CodiMD 是一个基于 Markdown 语言的实时协作文档编辑器,它允许多个用户在同一个文档上进行实时编辑。CodiMD 的前身是 HackMD,但为了满足更开放的开源社区需求,CodiMD 作为其社区版本独立出来。 优势: 1. 开源且…...
无人机顶会顶刊2023
无人机顶会顶刊2023 国际期刊1、Science Robotics2、IEEE Transactions on Robotics(TRO)3、IEEE Transactions on Automation Science and Engineering(TASE)4、International Journal of Robotics Research(IJRR)5、IEEE Robotics and Automation Lett…...

【Java毕设项目】基于SpringBoot+Vue校园便利平台的设计与实现
博主主页:一季春秋博主简介:专注Java技术领域和毕业设计项目实战、Java、微信小程序、安卓等技术开发,远程调试部署、代码讲解、文档指导、ppt制作等技术指导。主要内容:毕业设计(Java项目、小程序等)、简历模板、学习资料、面试题…...

03Nginx的静态资源部署,反向代理,负载均衡,动静分离的配置
Nginx具体应用 部署静态资源 Nginx相对于Tomcat处理静态资源的能力更加高效,所以在生产环境下一般都会将Nginx可以作为静态web服务器来部署静态资源 静态资源: 在服务端真实存在并且能够直接展示的一些html页面、css文件、js文件、图片、视频等资源文件将静态资源部署到Ngin…...

刷题笔记24——完全二叉树的节点个数
有些事情是不能告诉别人的,有些事情是不必告诉别人的,有些事情是根本没有办法告诉别人的,而且有些事情是,即使告诉了别人,你也会马上后悔的。——罗曼罗兰 222. 完全二叉树的节点个数 java的幂运算要 (int) Math.pow(2,l1)-1计算满二叉树的节点数量公式:2 ^ height…...

sentinel环境搭建以及微服务接入
• sentinel部署 • sentinel-镜像制造 • sentinel-镜像推送 • sentinel-部署配置文件 • 访问控制台 • 外网访问控制台 • 集群内访问 • 配置规则 • 限流效果 • 微服务接入 • pom文件引入依赖 • pod部署文件添加配置 Sentinel 控制台是流量控制、熔断降级规则统一配置…...
Klotski: Efficient Obfuscated Execution against Controlled-Channel Attacks
标题:Klotski: Efficient Obfuscated Execution against Controlled-Channel Attacks 作者:Pan Zhang,Chengyu Song,Heng Yin,Deqing Zou,Elaine Shi and Hai Jin 发布:ASPLOS【计算机体系结构顶会】 时间:2020 摘要 Intel Soft…...

阿里云无影云电脑角色AliyunServiceRoleForGws什么意思?
阿里云无影云电脑服务关联角色是指角色名称:AliyunServiceRoleForGws,并赋予角色权限策略:AliyunServiceRolePolicyForGws的过程,简单来说,就是允许无影云电脑服务访问您VPC、CEN和NAS中的资源,使用该权限查…...

操作系统--------调度算法篇
目录 一.先来先服务调度算法(FCFS) 二.短作业优先调度算法(SJF) 2.1.SJF调度算法缺点 三.优先级调度算法 3.1优先级调度算法的类型 1.非抢占优先级调度算法 2.抢占优先级调度算法 3.2优先级的类型 3.1静态优先级 3.2动态…...
宝塔composer 安装laravel依赖出现的问题
环境宝塔、PHP版本8.0.2、laravel9 问题1:PHP Fatal error: Uncaught Error: Call to undefined function Composer\XdebugHandler\putenv() 办法:把PHP版本disable_functions这个中的putenv去掉,这个意思就是putenv被PHP对应的版本禁用了&…...
OpenCV自学笔记二十四:支持向量机
在OpenCV中,支持向量机(Support Vector Machine,简称SVM)算法的实现包含在ml模块中。SVM是一种常用的监督学习算法,主要用于分类问题。 SVM的原理:通过在特征空间中找到一个最优超平面,将不同类…...

网络初识
一 IP 地址 概念: IP 地址主要用于表示网络主机、其他网络设备(如路由器)的网络地址。简单说,IP地址用于定位主机的网络地址 格式 IP 地址是一个32为的二进制数,通常被分割为4个“8位二进制数“(也就是4个字节&…...
极坐标和直角坐标的雅克比矩阵推导
我们经常需要在一些问题中研究坐标系的关系,这里讲讲最常见的极坐标和直角坐标的雅克比矩阵的推导。以二维坐标为例,三维坐标也是同理。 1. 直角坐标和极坐标 直角坐标表示为 ( x , y ) (x,y) (x,y),极坐标表示为 ( ρ , φ ) (\rho,\varph…...
经管博士科研基础【25】概率论中的相关基础概念
1. Support 在概率论中,"support"(支撑集)是指随机变量可能取值的集合。对于离散型随机变量,支撑集包含了所有可能的取值;而对于连续型随机变量,支撑集是指其密度函数或概率质量函数非零的区域。…...
计算机网络的相关知识点总结(一)
1.谈一谈对OSI七层模型和TCP/IP四层模型的理解? 不管是OSI七层模型亦或是TCP/IP四层模型,它们的提出都有一个共同的目的:通过分层来将复杂问题细化,通过各个层级之间的相互配合来更好的解决计算机中出现的问题。 说到分层…...

下载github.com上的依赖资源
下载github.com上的依赖资源(需要反复试才能成功,所以单独安装) export GIT_TRACE1 export GIT_CURL_VERBOSE1 pip install githttps://github.com/PanQiWei/AutoGPTQ.git -i https://pypi.mirrors.ustc.edu.cn/simple --trusted-hostpypi.mi…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...

python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

苍穹外卖--缓存菜品
1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: ①每个分类下的菜品保持一份缓存数据…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...