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

Python爬虫:开启数据抓取的奇幻之旅(一)

目录

一、爬虫初印象:揭开神秘面纱​

二、工欲善其事:前期准备​

(一)Python 环境搭建​

1.下载 Python 安装包:​

2.运行安装程序:​

3.配置环境变量(若自动添加失败):​

(二)开发工具推荐​

1.PyCharm:​

2.Jupyter Notebook:​

(三)必备库安装​

1.requests 库:​

2.BeautifulSoup4 库:​

3.Scrapy 框架:​

4.Selenium 库:​

三、爬虫原理剖析:探寻内在机制​

(一)发起请求​

(二)获取响应​

(三)解析内容​

(四)保存数据​


 

一、爬虫初印象:揭开神秘面纱​

在互联网这个广袤无垠的信息宇宙中,数据如同繁星般璀璨繁多。而 Python 网络爬虫,就像是一位神秘而强大的 “数据探险家”,能够按照既定规则,自动穿梭于网络世界,抓取我们所需的数据。​

从定义上来说,网络爬虫是一种自动化程序,它模仿人类在浏览器中的操作行为,向网页服务器发送请求,获取网页内容,并对这些内容进行解析和提取,从而获取有价值的数据。你可以把它想象成一个勤劳的小蜜蜂,在万维网这个大花园里,不知疲倦地采集着 “数据花蜜”。​

Python 作为当下最热门的编程语言之一,在爬虫领域有着无可比拟的优势。首先,Python 的语法简洁明了,就像一本通俗易懂的故事书,即使是编程小白也能轻松上手。相比其他编程语言,Python 代码量更少,结构更加清晰,这使得开发者能够更快速地编写和调试爬虫程序,大大提高了开发效率。例如,在 Python 中,使用requests库发送一个 HTTP 请求只需要短短一行代码:response = requests.get(url),简洁高效,一目了然。​

其次,Python 拥有丰富的爬虫库和框架,这些强大的工具就像是给爬虫配备了各种神奇的装备,让它在数据抓取的道路上如虎添翼。比如BeautifulSoup库,它可以轻松地解析 HTML 和 XML 文档,提取出我们需要的数据,就像一把精准的手术刀,能够在复杂的网页结构中准确地 “切割” 出所需信息;Scrapy框架则提供了更高级的功能,如分布式爬取、自动处理请求队列、中间件机制等,使得我们可以构建大规模、高性能的爬虫系统。​

此外,Python 还具备强大的数据处理和分析能力,这对于爬虫获取到的数据后续处理非常关键。借助Pandas和NumPy等库,我们可以对爬取到的数据进行清洗、筛选、聚合和可视化等操作,将原始数据转化为有价值的信息,为数据分析和决策提供有力支持。而且,Python 拥有庞大的开发者社区和丰富的资源,当我们在开发爬虫过程中遇到问题时,可以很容易地在社区中寻求帮助,借鉴其他开发者的经验和解决方案。​

二、工欲善其事:前期准备​

(一)Python 环境搭建​

在正式开启 Python 网络爬虫之旅前,我们首先得搭建好 Python 运行环境,这就好比为爬虫打造一个坚固的 “战车”。​

1.下载 Python 安装包:​

打开浏览器,访问 Python 官方网站(https://www.python.org/downloads/ )。在下载页面,你会看到不同版本的 Python 可供选择。强烈推荐下载最新的稳定版本,因为新版本通常会修复一些旧版本的漏洞,并且增加了新的功能。如果你不确定选择哪个版本,一般来说,选择带有 “Python 3.x” 字样的版本即可,目前 Python 3.10 及以上版本都是不错的选择 。根据你的操作系统(Windows、Mac OS 或 Linux),点击相应的下载链接。例如,在 Windows 系统下,你可以选择 “Windows installer (64-bit)” 下载 64 位的安装包,如果你的电脑是 32 位系统,则选择 “Windows installer (32-bit)” 。​

2.运行安装程序:​

下载完成后,找到下载的安装包,通常是一个以.exe结尾的文件,双击运行它。在安装向导界面,你会看到一些选项,务必勾选 “Add Python 3.x to PATH” 选项,这一步至关重要,它会自动将 Python 添加到系统的环境变量中,这样我们就可以在命令行中直接使用 Python 命令了。然后点击 “Install Now” 进行默认安装,如果你想自定义安装路径,也可以选择 “Customize installation” 来自行指定安装位置。安装过程可能需要一些时间,请耐心等待。​

3.配置环境变量(若自动添加失败):​

虽然在安装时勾选 “Add Python 3.x to PATH” 选项会自动配置环境变量,但有时可能会出现意外情况导致配置失败。这时,我们就需要手动配置环境变量。​

在 Windows 系统中,右键点击 “此电脑”,选择 “属性”,然后点击 “高级系统设置”,在弹出的窗口中点击 “环境变量” 按钮。在 “系统变量” 中找到 “Path” 变量,点击 “编辑”,在弹出的编辑环境变量窗口中,点击 “新建”,将 Python 的安装路径添加进去。例如,如果你的 Python 安装在 “C:\Python310”,就将 “C:\Python310” 和 “C:\Python310\Scripts” 添加到 Path 变量中(注意:如果你的安装路径不同,请根据实际情况修改)。添加完成后,一路点击 “确定” 保存设置。​

在 Mac OS 系统中,打开 “终端” 应用,编辑.bash_profile文件(如果没有该文件,可以创建一个)。在终端中输入nano ~/.bash_profile,然后在文件中添加export PATH="/Library/Frameworks/Python.framework/Versions/3.10/bin:$PATH"(同样,这里的路径要根据你实际安装的 Python 版本和路径进行修改),保存并退出文件(按Ctrl+X,然后按Y,最后按Enter)。最后,在终端中输入source ~/.bash_profile使配置生效。​

完成以上步骤后,打开命令行(Windows 下按Win+R,输入cmd并回车;Mac OS 下打开 “终端”),输入python --version,如果显示出你安装的 Python 版本号,恭喜你,Python 环境搭建成功!​

(二)开发工具推荐​

拥有了 Python 环境,还需要一款称手的开发工具,就像战士需要一把锋利的宝剑一样。以下两款工具在 Python 爬虫开发中备受青睐:​

1.PyCharm:​

PyCharm 是由 JetBrains 公司开发的一款专门针对 Python 的集成开发环境(IDE),功能强大到超乎想象,堪称 Python 开发者的 “瑞士军刀”。它拥有智能代码补全功能,当你输入代码时,它能自动提示可能的函数、变量和方法,大大提高了编码效率,就像有一个贴心的小助手在旁边随时提醒你一样。比如,当你输入requests.ge,它会自动提示requests.get方法,你只需按下回车键就能快速完成输入。​

它还具备强大的代码分析和调试工具。在调试爬虫程序时,你可以设置断点,逐行执行代码,观察变量的值和程序的执行流程,轻松找出代码中的问题。而且,PyCharm 支持多种 Python 框架和库,对于爬虫开发中常用的requests、BeautifulSoup等库都有很好的支持,让你可以无缝集成各种工具进行开发。此外,它还提供了丰富的插件市场,你可以根据自己的需求安装各种插件,进一步扩展其功能。​

PyCharm 适用于各种规模的项目开发,无论是小型的个人爬虫项目,还是大型的企业级数据采集系统,它都能游刃有余地应对。对于初学者来说,它友好的界面和详细的提示信息也能帮助快速上手。​

2.Jupyter Notebook:​

Jupyter Notebook 是一个开源的交互式计算环境,它以一种独特的方式展示代码和结果,就像是一个可以实时交互的笔记本。在 Jupyter Notebook 中,你可以将代码、文本、图像、数学公式等多种元素组合在一个文档中,并且可以逐行运行代码,立即看到结果,这种交互式的体验非常适合快速验证想法、进行数据分析和可视化,以及教学演示。​

例如,在进行爬虫开发时,你可以先在 Jupyter Notebook 中编写一小段代码来测试网页请求是否成功,然后逐步添加代码进行数据解析和提取,每一步的结果都能直观地展示出来,方便你随时调整和优化代码。它还支持多种编程语言,不过我们主要使用它来进行 Python 编程。​

Jupyter Notebook 特别适合数据科学和机器学习领域的项目,以及需要频繁进行代码测试和探索性开发的场景。它的分享和协作功能也非常强大,你可以将整个 Notebook 文件分享给他人,他人可以直接在自己的环境中打开并运行,方便团队之间的交流和合作。​

(三)必备库安装​

Python 的强大离不开各种丰富的库,对于网络爬虫来说,以下几个库是必不可少的 “秘密武器”:​

1.requests 库:​

requests 库是 Python 中最常用的 HTTP 请求库,它的使命就是让 HTTP 请求变得简单而优雅。使用它,你可以轻松地发送各种类型的 HTTP 请求,如 GET、POST、PUT、DELETE 等,就像给网页服务器发送一封简单的信件一样容易。例如,使用requests.get(url)就可以向指定的url发送一个 GET 请求,获取网页的内容,代码如下:

import requestsurl = 'https://www.example.com'
response = requests.get(url)
if response.status_code == 200:print(response.text)
else:print(f"请求失败,状态码:{response.status_code}")

安装 requests 库非常简单,打开命令行,输入pip install requests即可完成安装。如果你的网络连接较慢,可能需要设置一下超时时间,比如pip --default-timeout=100 install requests 。​

2.BeautifulSoup4 库:​

BeautifulSoup4(简称bs4)是一个用于解析 HTML 和 XML 文档的库,它就像一把神奇的手术刀,能够将复杂的网页结构解析成一个易于操作的树形结构,让你可以轻松地提取出所需的数据。比如,你可以使用它来查找网页中的所有链接、提取特定标签的内容等。​

以下是一个简单的示例,使用BeautifulSoup4解析 HTML 文档并提取所有链接:

from bs4 import BeautifulSouphtml = """
<html>
<head><title>示例网页</title>
</head>
<body><a href="https://www.example1.com">链接1</a><a href="https://www.example2.com">链接2</a>
</body>
</html>
"""soup = BeautifulSoup(html, 'html.parser')
links = soup.find_all('a')
for link in links:print(link.get('href'))

安装BeautifulSoup4库同样使用 pip 命令:pip install beautifulsoup4 。此外,还需要安装一个解析器,常用的解析器有lxml和html.parser,可以通过pip install lxml或pip install html.parser来安装。​

3.Scrapy 框架:​

Scrapy 是一个功能强大的爬虫框架,它为我们提供了一套完整的爬虫解决方案,就像一个装备精良的战斗团队,能够帮助我们高效地构建大型、复杂的爬虫系统。Scrapy 具有分布式爬取的能力,可以利用多台计算机同时进行数据采集,大大提高了爬取效率;它还自带了自动处理请求队列、中间件机制等功能,使得爬虫的管理和扩展更加方便。​

使用 Scrapy 框架,你需要定义爬虫类,指定要爬取的网站、解析规则等。以下是一个简单的 Scrapy 爬虫示例:

import scrapyclass ExampleSpider(scrapy.Spider):name = 'example'start_urls = ['https://www.example.com',]def parse(self, response):for item in response.css('div.item'):yield {'title': item.css('h2.title::text').get(),'link': item.css('a::attr(href)').get(),}

安装 Scrapy 框架:pip install scrapy 。​

4.Selenium 库:​

Selenium 库主要用于自动化测试,但在爬虫领域也有着重要的应用。它可以模拟人类在浏览器中的操作,如点击按钮、输入文本、滚动页面等,这对于一些需要交互才能获取数据的网站非常有用。比如,有些网站的数据是通过 JavaScript 动态加载的,使用普通的爬虫库无法直接获取,这时就可以借助 Selenium 库来驱动浏览器,模拟用户操作,从而获取到完整的数据。​

使用 Selenium 库需要先安装浏览器驱动,例如 Chrome 浏览器需要下载 ChromeDriver。以下是一个使用 Selenium 打开网页并获取标题的示例:

from selenium import webdriverdriver = webdriver.Chrome()
driver.get('https://www.example.com')
print(driver.title)
driver.quit()

安装 Selenium 库:pip install selenium 。​

三、爬虫原理剖析:探寻内在机制​

(一)发起请求​

当我们使用爬虫获取网页数据时,首先要做的就是发起请求,这就好比我们去朋友家拜访,需要先敲敲门询问是否可以进入。爬虫通过 HTTP 协议向目标网站的服务器发送请求,请求中包含了很多信息,如请求的网址(URL)、请求方法(GET、POST 等)、请求头(Headers)等 。​

其中,URL 就像是朋友家的地址,明确告诉爬虫要访问哪个网页;请求方法则决定了我们以何种方式与服务器 “交流”,GET 方法通常用于获取网页的基本信息,就像我们简单地询问朋友家里的情况;POST 方法则更像是带着礼物去朋友家,它可以向服务器发送一些数据,比如登录表单中的用户名和密码等。请求头则包含了更多关于请求的细节信息,例如我们使用的浏览器类型、操作系统等,这些信息就像是我们去朋友家时的自我介绍,让服务器能够更好地 “了解” 我们的请求。​

以使用requests库发送 GET 请求为例,代码如下:

import requestsurl = 'https://www.example.com'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}
response = requests.get(url, headers=headers)

在这段代码中,我们定义了要访问的url,并设置了headers,模拟了一个 Chrome 浏览器的请求头,然后使用requests.get()方法发送请求,服务器会根据这个请求返回相应的内容。​

(二)获取响应​

当爬虫发送请求后,服务器会对这个请求进行处理,并返回一个响应(Response)。这个响应就像是朋友从房间里递给我们的东西,里面包含了我们请求的网页内容。响应内容可能是 HTML 格式的文本,这就像是一份详细的房屋布局图,描述了网页的结构和展示内容;也可能是 JSON 格式的数据,更像是一份简洁的物品清单,以一种结构化的方式存储着数据;还可能是二进制数据,比如图片、视频等,就像朋友给我们的一些实体物品。​

在 Python 中,使用requests库发送请求后,我们可以通过response对象来获取响应的各种信息。例如,通过response.status_code可以获取响应的状态码,200 表示请求成功,就像朋友愉快地开门迎接我们;404 表示页面未找到,意味着我们找错了地址;500 表示服务器内部错误,就像是朋友家里出了点状况。通过response.text可以获取响应的文本内容(如果是 HTML 页面,就是页面的源代码),通过response.json()可以将 JSON 格式的响应内容解析为 Python 的字典或列表对象。​

以下是获取响应内容并判断状态码的示例代码:

import requestsurl = 'https://www.example.com'
response = requests.get(url)if response.status_code == 200:print("请求成功,网页内容如下:")print(response.text)
else:print(f"请求失败,状态码:{response.status_code}")

(三)解析内容​

获取到响应内容后,我们需要从中提取出我们真正需要的数据,这就好比从朋友给的东西里挑选出我们感兴趣的物品。解析网页内容有多种方法,常用的有正则表达式、BeautifulSoup、XPath 等。​

1.正则表达式:正则表达式是一种强大的文本匹配工具,它使用特定的字符和规则来描述文本模式。在解析网页时,我们可以用正则表达式来匹配 HTML 文本中的特定内容。例如,要提取网页中所有的链接,可以使用类似r'href=["\'](.*?)["\']'的正则表达式。不过,正则表达式的语法相对复杂,对于复杂的网页结构,编写和调试正则表达式可能会比较困难,就像是在一堆杂乱的物品中寻找特定的东西,需要花费一些心思。​

以下是使用正则表达式提取网页链接的示例代码:

import re
import requestsurl = 'https://www.example.com'
response = requests.get(url)if response.status_code == 200:pattern = re.compile(r'href=["\'](.*?)["\']')links = pattern.findall(response.text)for link in links:print(link)
else:print(f"请求失败,状态码:{response.status_code}")

2.BeautifulSoup:BeautifulSoup 是一个专门用于解析 HTML 和 XML 文档的库,它将复杂的文档结构转化为一个易于操作的树形结构,就像把一堆杂乱的物品整理成一个有序的货架,我们可以方便地从中找到所需的东西。使用 BeautifulSoup,我们可以通过标签名、属性等方式轻松地查找和提取数据。比如,使用soup.find_all('a')可以找到网页中所有的<a>标签,即链接标签;使用soup.find('div', class_='content')可以找到 class 为content的<div>标签,提取其中的内容。​

以下是使用 BeautifulSoup 提取网页链接的示例代码:

from bs4 import BeautifulSoup
import requestsurl = 'https://www.example.com'
response = requests.get(url)if response.status_code == 200:soup = BeautifulSoup(response.text, 'html.parser')links = soup.find_all('a')for link in links:print(link.get('href'))
else:print(f"请求失败,状态码:{response.status_code}")

3.XPath:XPath 是一种用于在 XML 和 HTML 文档中定位节点的语言,它通过路径表达式来选取文档中的元素,就像在一个地图上通过坐标来找到特定的地点。例如,//a表示选取所有的<a>标签,//div[@class='content']表示选取 class 为content的<div>标签。XPath 在处理复杂的网页结构时非常强大,能够准确地定位到我们需要的数据节点 。​

以下是使用 XPath 提取网页链接的示例代码:

from lxml import etree
import requestsurl = 'https://www.example.com'
response = requests.get(url)if response.status_code == 200:html = etree.HTML(response.text)links = html.xpath('//a/@href')for link in links:print(link)
else:print(f"请求失败,状态码:{response.status_code}")

(四)保存数据​

解析出所需的数据后,我们需要将这些数据保存起来,以便后续使用,这就像是把挑选好的物品妥善存放起来。数据可以保存为多种格式,常见的有文本文件、CSV 文件、数据库等。​

1.保存为文本文件:将数据保存为文本文件是最基本的方式,适合保存一些简单的数据,比如提取的网页标题、文本内容等。使用 Python 的内置函数open()可以创建一个文本文件,并使用write()方法将数据写入文件。​

以下是将提取的网页标题保存为文本文件的示例代码:

from bs4 import BeautifulSoup
import requestsurl = 'https://www.example.com'
response = requests.get(url)if response.status_code == 200:soup = BeautifulSoup(response.text, 'html.parser')title = soup.title.stringwith open('title.txt', 'w', encoding='utf-8') as f:f.write(title)
else:print(f"请求失败,状态码:{response.status_code}")

2.保存为 CSV 文件:CSV(Comma-Separated Values)文件是一种常用的表格数据格式,适合保存结构化的数据,比如从网页中提取的商品列表、新闻列表等。使用 Python 的csv库可以方便地将数据保存为 CSV 文件。​

以下是将提取的商品信息保存为 CSV 文件的示例代码:

import csv
from bs4 import BeautifulSoup
import requestsurl = 'https://www.example.com/products'
response = requests.get(url)if response.status_code == 200:soup = BeautifulSoup(response.text, 'html.parser')products = []for product in soup.find_all('div', class_='product'):name = product.find('h2', class_='product-name').text.strip()price = product.find('span', class_='product-price').text.strip()products.append([name, price])with open('products.csv', 'w', newline='', encoding='utf-8') as f:writer = csv.writer(f)writer.writerow(['商品名称', '价格'])writer.writerows(products)
else:print(f"请求失败,状态码:{response.status_code}")

3.保存到数据库:如果数据量较大或者需要进行复杂的数据查询和管理,将数据保存到数据库是更好的选择。常见的数据库有 MySQL、MongoDB 等。以 MySQL 为例,使用pymysql库可以连接 MySQL 数据库,并将数据插入到数据库表中。​

以下是将提取的用户评论保存到 MySQL 数据库的示例代码:

import pymysql
from bs4 import BeautifulSoup
import requestsurl = 'https://www.example.com/comments'
response = requests.get(url)if response.status_code == 200:soup = BeautifulSoup(response.text, 'html.parser')comments = []for comment in soup.find_all('div', class_='comment'):author = comment.find('span', class_='comment-author').text.strip()content = comment.find('p', class_='comment-content').text.strip()comments.append((author, content))conn = pymysql.connect(host='localhost', user='root', password='password', database='test')cursor = conn.cursor()for comment in comments:sql = "INSERT INTO comments (author, content) VALUES (%s, %s)"cursor.execute(sql, comment)conn.commit()cursor.close()conn.close()
else:print(f"请求失败,状态码:{response.status_code}")

相关文章:

Python爬虫:开启数据抓取的奇幻之旅(一)

目录 一、爬虫初印象&#xff1a;揭开神秘面纱​ 二、工欲善其事&#xff1a;前期准备​ &#xff08;一&#xff09;Python 环境搭建​ 1.下载 Python 安装包&#xff1a;​ 2.运行安装程序&#xff1a;​ 3.配置环境变量&#xff08;若自动添加失败&#xff09;&#x…...

分布式ID服务实现全面解析

分布式ID生成器是分布式系统中的关键基础设施&#xff0c;用于在分布式环境下生成全局唯一的标识符。以下是各种实现方案的深度解析和最佳实践。 一、核心需求与设计考量 1. 核心需求矩阵 需求 重要性 实现难点 全局唯一 必须保证 时钟回拨/节点冲突 高性能 高并发场景…...

浏览器与网络模块实践

浏览器渲染步骤 浏览器渲染大致分为以下四个步骤&#xff1a; 1. 构建 DOM 树 • 过程&#xff1a;当浏览器接收到 HTML 文档后&#xff0c;会从上到下依次解析 HTML 代码。每遇到一个开始标签&#xff0c;就会创建一个对应的 DOM 节点&#xff0c;并根据标签的嵌套关系将这些…...

谈谈Minor GC、Major GC和Full GC

目录 一、背景 二、三者之间的区分 1、Minor GC 2、Major GC &#xff08;1&#xff09;老年代空间不足&#xff1a; &#xff08;2&#xff09;晋升&#xff08;Promotion&#xff09;失败&#xff1a; &#xff08;3&#xff09;空间分配担保失败&#xff1a; &#x…...

基于SpringBoot实现的高校实验室管理平台功能四

一、前言介绍&#xff1a; 1.1 项目摘要 随着信息技术的飞速发展&#xff0c;高校实验室的管理逐渐趋向于信息化、智能化。传统的实验室管理方式存在效率低下、资源浪费等问题&#xff0c;因此&#xff0c;利用现代技术手段对实验室进行高效管理显得尤为重要。 高校实验室作为…...

梯度裁剪(Gradient Clipping)

梯度裁剪&#xff08;Gradient Clipping&#xff09;是一种用于防止梯度爆炸&#xff08;Gradient Explosion&#xff09;的技术&#xff0c;具体来说&#xff1a; 1. 梯度裁剪的作用 问题背景&#xff1a;在训练深度神经网络&#xff08;尤其是RNN/LSTM&#xff09;时&#x…...

联合办公空间WeWork的创新模式与私域流量时代的品牌温度——兼论开源AI大模型AI智能名片S2B2C商城小程序源码的潜在价值

摘要&#xff1a;本文聚焦于联合办公空间WeWork的成功模式&#xff0c;深入剖析其如何让创业用户摆脱传统租赁的束缚&#xff0c;打破空间与社交限制&#xff0c;为创业带来新的可能性与趣味性&#xff0c;并有效降低创业成本与风险。同时探讨了WeWork在私域流量时代所建立的平…...

Git配置

为什么要用&#xff1a;下载zip只是当前分支&#xff0c;不能进行仓库push、pull、checkout 1. 下载Git 先判断是否已经下过Git&#xff1a; git --version若没有版本号出来&#xff0c;就去下载&#xff1a;https://git-scm.com/downloads &#xff08;Windows、linux、mac…...

Protobuf 的快速使用(二)

这个部分会对通讯录进⾏多次升级&#xff0c;使⽤ 2.x 表⽰升级的版本&#xff0c;最终将会升级如下内容&#xff1a; 不再打印联系⼈的序列化结果&#xff0c;⽽是将通讯录序列化后并写⼊⽂件中。 从⽂件中将通讯录解析出来&#xff0c;并进⾏打印。 新增联系⼈属性&#xff…...

网页设计思路

CSS实现思路: 用一个div直接父级继承 在这里插入图片描述 一LOGO结构 h1>a>搜索关键字 二导航栏结构 结构:ul>li>a 三搜索框结构 div>input/a 四用户头像结构 div>a>imgspan 处理行内块和行内垂直对齐方向使用 vertical-align...

Vue3 配合 fullPage.js 打造高效全屏滚动网页

引言 在现代网页设计中&#xff0c;整屏滚动&#xff08;Full-page Scrolling&#xff09;已成为展示内容的一种流行方式。通过将内容分成若干个全屏页面&#xff0c;并配合流畅的过渡动画&#xff0c;可以为用户带来身临其境的浏览体验。本文将介绍如何使用 fullPage.js 插件来…...

全排列 II:去重的技巧与实现

全排列 II&#xff1a;去重的技巧与实现 1. 引言&#xff1a;排列问题的坑 你有没有遇到过这样的问题&#xff1f; 当我们在做全排列&#xff08;Permutation&#xff09;的时候&#xff0c;如果输入的数组中包含重复元素&#xff0c;生成的排列中就会出现大量重复项。这样不…...

微型导轨和普通导轨有哪些区别?

微型导轨和普通导轨都是常用的工业机械传动装置&#xff0c;目前&#xff0c;市场上有各种各样的导轨产品。那么微型导轨和普通导轨有哪些区别呢&#xff1f; 1、尺寸&#xff1a;微型导轨尺寸较小&#xff0c;滑座宽度最小可达 8MM&#xff0c;长度最小可达 11MM 左右&#xf…...

Java 输入流到输出流

Java 输入流到输出流的复制方法主要有以下六种实现方式&#xff0c;根据性能、适用场景和实现原理可分为不同类别&#xff1a; 一、基础字节流方式 实现原理&#xff1a;通过 FileInputStream 和 FileOutputStream 逐字节或块读取数据并写入。 代码示例&#xff1a; try (In…...

Anaconda安装-Ubuntu-Linux

1、进入Anaconda官网&#xff0c;以下载最新版本&#xff0c;根据自己的操作系统选择适配的版本。 2、跳过注册&#xff1a; 3、选择适配的版本&#xff1a; 4、cd ~/anaconda_download 5、bash Anaconda3-2024.10-1-Linux-x86_64.sh 6、按Enter或PgDn键滚动查看协议&…...

每日一题之既约分数

题目描述 本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。 如果一个分数的分子和分母的最大公约数是 1&#xff0c;这个分数称为既约分数。 例如 3/4,1/8,7/1​&#xff0c; 都是既约分数。 请问&#xff0c;有多少个既约分…...

诠视科技MR眼镜如何使用VLC 进行RTSP投屏到电脑

文章目录 一、应用开发部分&#xff08;1&#xff09;基础场景构建&#xff08;2&#xff09;添加XvCameraManager&#xff08;3&#xff09;添加XvMRVideoCaptureManager&#xff08;4&#xff09;添加XvRTSPStreamerManager&#xff08;5&#xff09;打包测试 二、VLC media …...

“头”里有什么——HTML 元信息

2025/3/28 向全栈工程师迈进&#xff01; 一、看基本HTML <!doctype html> <html lang"zh-CN"><head><meta charset"utf-8" /><title>我的测试页面</title></head><body><p>这是我的页面</p&g…...

【Kafka】从理论到实践的深度解析

在当今数字化转型的时代&#xff0c;企业面临着数据量呈指数级增长、业务系统愈发复杂的挑战。在这样的背景下&#xff0c;高效的数据传输与处理技术成为了关键。Kafka&#xff0c;作为一款分布式消息队列系统&#xff0c;凭借其卓越的性能和丰富的特性&#xff0c;在众多企业的…...

Debezium系列之:使用Debezium和Apache Iceberg构建数据湖

Debezium系列之:使用Debezium和Apache Iceberg构建数据湖 Debezium Server Iceberg“Debezium Server Iceberg” 消费者设置数据复制Upsert 模式保留已删除的记录使用Upsert模式追加模式优化批处理大小在数据分析的世界中,数据湖是存储和管理大量数据以满足数据分析、报告或机…...

resnet网络迁移到昇腾执行(OM上篇)

目录 总体介绍 pytorch迁移OM模型 原始代码详细介绍 模型加载和初始化 初始化统计变量 数据推理及归一化 统计每个样本的结果 基本概念 Softmax&#xff08;归一化指数函数&#xff09; 作用 代码示例 应用场景 argmax取最大值索引 作用 代码示例 两者配合使用…...

RHCA核心课程技术解析5:红帽高可用性集群架构与深度实践

一、红帽高可用集群架构全景 1.1 核心组件交互逻辑 graph TD A[节点1] -->|Corosync 心跳| B[节点2] A -->|Pacemaker 资源管理| C[共享存储] B --> C D[Fencing设备] -->|STONITH| A D -->|STONITH| B C -->|GFS2锁管理| A C -->|GFS2锁管理| B 1.2 集…...

Display Serializer、Camera Deserializer(Camera Des)和SerDes‌ 加解串应用

‌1. 概述&#xff1a;三者的核心定位‌ ‌(1) SerDes&#xff08;Serializer/Deserializer&#xff09;‌ ‌定义‌&#xff1a;通用高速数据传输技术&#xff0c;实现‌并行↔串行‌双向转换。‌角色‌&#xff1a;数据链路的“翻译官”&#xff0c;解决并行传输的带宽与距…...

vue3+bpmn.js基本使用

一、案例使用依赖 // 必填"bpmn-js": "^7.3.1", "bpmn-js-properties-panel": "^0.37.2","bpmn-moddle":"^7.1.3","camunda-bpmn-moddle": "^7.0.1",// 可选"element-plus/icons-vue&qu…...

《数据结构:单链表》

“希望就像星星&#xff0c;或许光芒微弱&#xff0c;但永不熄灭。” 博主的个人gitee&#xff1a;https://gitee.com/friend-a188881041351 一.概念与结构 链表是一种物理存储上非连续、非顺序的存储结构&#xff0c;数据元素的顺序逻辑是通过链表中的指针链接次序实现的。 单…...

RedHatLinux(2025.3.22)

1、创建/www目录&#xff0c;在/www目录下新建name和https目录&#xff0c;在name和https目录下分别创建一个index.htm1文件&#xff0c;name下面的index.html 文件中包含当前主机的主机名&#xff0c;https目录下的index.htm1文件中包含当前主机的ip地址。 &#xff08;1&…...

C++异常处理完全指南:从原理到实战

文章目录 异常的基本概念基本异常抛出与捕获多类型异常捕获异常重新抛出异常安全异常规范&#xff08;noexcept&#xff09;栈展开与析构标准库异常总结 异常的基本概念 异常是程序运行时发生的非预期事件&#xff08;如除零、内存不足&#xff09;。C通过try、catch和throw提…...

Oracle 19C 备份

在 Oracle 19c 中&#xff0c;备份数据库通常使用 RMAN&#xff08;Recovery Manager&#xff09; 工具&#xff0c;它是 Oracle 提供的官方备份和恢复工具。以下是通过 RMAN 备份 Oracle 19c 数据库的详细步骤和命令。 一、RMAN 基本概念 RMAN 是 Oracle 的备份和恢复工具&am…...

深入理解MySQL聚集索引与非聚集索引

在数据库管理系统中&#xff0c;索引是提升查询性能的关键。MySQL支持多种类型的索引&#xff0c;其中最基础也是最重要的两种是聚集索引和非聚集索引。本文将深入探讨这两种索引的区别&#xff0c;并通过实例、UML图以及Java代码示例来帮助您更好地理解和应用它们。 一、概念…...

用Python打造智能宠物:强化学习的奇妙之旅

友友们好! 我是Echo_Wish,我的的新专栏《Python进阶》以及《Python!实战!》正式启动啦!这是专为那些渴望提升Python技能的朋友们量身打造的专栏,无论你是已经有一定基础的开发者,还是希望深入挖掘Python潜力的爱好者,这里都将是你不可错过的宝藏。 在这个专栏中,你将会…...

OGG故障指南:OGG-01163 Bad column length (xxx) specified for column

报错 OGG-01163 Bad column length (xxx) specified for column AAA in table OWNER.TABLE, maximum allowable length is yyy原因 源端修改了字段长度。 虽然源端和目标端的长度已经通过DDL语句修改到一致&#xff0c;在extract进程未重启的情况下&#xff0c;生成的trail文…...

XML标签格式转换为YOLO TXT格式

针对的是多边形&#xff08;<polygon>&#xff09;来描述对象的边界&#xff0c;而不是传统的矩形框&#xff08;<bndbox>&#xff09; import xml.etree.ElementTree as ET import os from pathlib import Path# 解析VOC格式的XML文件&#xff0c;提取目标框的标…...

Java的string默认值

在Java中&#xff0c;String类型的默认值取决于其定义和实例化的方式。 以下是关于String默认值的详细说明 未实例化的String变量‌ 如果定义一个String变量但未对其进行实例化&#xff08;即未使用new关键字或直接赋值&#xff09;&#xff0c;其默认值为:ml-search[null]。这…...

侯捷 C++ 课程学习笔记:C++ 中引用与指针的深度剖析

目录 一、引言 二、引用与指针的基本概念 &#xff08;一&#xff09;引用 &#xff08;二&#xff09;指针 三、引用与指针的区别 &#xff08;一&#xff09;定义与初始化 &#xff08;二&#xff09;内存空间与 NULL 值 &#xff08;三&#xff09;自增操作 …...

llamafactory微调效果与vllm部署效果不一致如何解决

在llamafactory框架训练好模型之后&#xff0c;自测chat时模型效果不错&#xff0c;但是部署到vllm模型上效果却很差 这实际上是因为llamafactory微调时与vllm部署时的对话模板不一致导致的。 对应的llamafactory的代码为 而vllm启动时会采用大模型自己本身设置的对话模板信息…...

欢乐力扣:合并两个有序链表

文章目录 1、题目描述2、思路 1、题目描述 合并两个有序链表。  将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 在这里插入图片描述 2、思路 参考官方题解&#xff0c;简单来说就是不断调整链表指针的指向&#xff0c;让…...

访问者模式_行为型_GOF23

访问者模式 访问者模式&#xff08;Visitor Pattern&#xff09;是一种行为型设计模式&#xff0c;核心思想是将算法与对象结构分离&#xff0c;使得在不修改现有对象结构的前提下&#xff0c;可以动态添加新的操作。这类似于“医生查房”——医生&#xff08;访问者&#xff…...

排序算法2-选择排序

目录 1.常见排序算法 2.排序算法的预定函数 2.1交换函数 2.2测试算法运行时间的函数 2.3已经实现过的排序算法 3.选择排序算法的实现 3.1直接选择排序 3.2堆排序 4.下讲预告 1.常见排序算法 前面一讲已经讲解了插入排序&#xff0c;这一讲我将讲解选择排序&#xff0c;…...

openwrt24.10.0版本上安装istoreOS的屏幕监控插件

lcdsimple 插件支持在软路由下面显示统计信息到 HDMI 或者 VGA 上。 手动安装方法&#xff1a; 保证 quickstart 版本大于 0.9.7 安装 lcdsimple 具体方法&#xff1a; opkg update is-opkg install quickstart opkg install lcdsimple 手动下载 QUICKSTART 跟 LCD SIMPL…...

内网服务器无法通过公网地址访问映射到公网的内网服务

内网服务器无法通过公网地址访问映射到公网的内网服务 问题现象问题原因解决方法总结 前几天遇到一个网络问题&#xff0c;在这里做下记录&#xff0c;希望能帮助到有相同问题的朋友。 问题现象 网络拓扑如上所示&#xff0c;服务器1和服务器2在同一内网&#xff0c;网段均为1…...

基于Web的交互式智能成绩管理系统设计

目录 摘要 绪论 一、应用背景 二、行业发展现状 三、程序开发的重要意义 四、结语 1 代码 2 数据初始化模块 3 界面布局模块 4 核心功能模块 5 可视化子系统 6 扩展功能模块 7 架构设计亮点 功能总结 一、核心数据管理 二、智能分析体系 三、可视化系统 四、扩…...

从虚拟现实到可持续设计:唐婉歆的多维创新之旅

随着线上线下融合逐渐成为全球家居与建材行业的发展趋势,全球市场对高品质、个性化家居和建材产品的需求稳步攀升,也对设计师提出更高的要求。在这一背景下,设计师唐婉歆将以产品设计师的身份,正式加入跨国企业AmCan 美加集团,投身于备受行业瞩目的系列设计项目。她将负责Showr…...

PHP MySQL 预处理语句

PHP MySQL 预处理语句 引言 在PHP中与MySQL数据库进行交互时,预处理语句是一种非常安全和高效的方法。预处理语句不仅可以防止SQL注入攻击,还可以提高数据库查询的效率。本文将详细介绍PHP中预处理语句的用法,包括其基本概念、语法、优势以及在实际开发中的应用。 预处理…...

基于飞腾/龙芯+盛科CTC7132全国产交换机解决方案

产品介绍 盛科CTC7132,内置ARM-Cortex A53 主频1.2GHz&#xff1b;支持24个千兆电口&#xff0c;24个万兆光口&#xff08;850nm多模&#xff09;&#xff0c;1个千兆管理网口&#xff0c;1个管理串口&#xff1b;支持1个百兆健康管理网口&#xff1a;用于设备端口状态、电压、…...

Vue动态添加或删除DOM元素:购物车实例

Vue 指令系列文章: 《Vue插值:双大括号标签、v-text、v-html、v-bind 指令》 《Vue指令:v-cloak、v-once、v-pre 指令》 《Vue条件判断:v-if、v-else、v-else-if、v-show 指令》 《Vue循环遍历:v-for 指令》 《Vue事件处理:v-on 指令》 《Vue表单元素绑定:v-model 指令》…...

深入理解Agentic Workflows

本文来源&#xff1a;https://weaviate.io/blog/what-are-agentic-workflows 这篇文章将带你深入理解AI Agent、Agentic AI、Agentic Workflows、Agentic Architectures等概念&#xff0c;非常值得推荐。 一、什么是 AI Agents&#xff1f; AI Agents 是结合了大模型进行推理和…...

深入理解:阻塞IO、非阻塞IO、水平触发与边缘触发

深入理解&#xff1a;阻塞IO、非阻塞IO、水平触发与边缘触发 在网络编程和并发处理中&#xff0c;理解不同的 I/O 模型和事件通知机制至关重要。本文将深入探讨阻塞IO&#xff08;Blocking IO&#xff09;、非阻塞IO&#xff08;Non-Blocking IO&#xff09;、水平触发&#x…...

deepseek 技术的前生今世:从开源先锋到AGI探索者

一、引言&#xff1a;中国AI领域的“超越追赶”样本 DeepSeek&#xff08;深度求索&#xff09;作为中国人工智能领域的代表性企业&#xff0c;自2023年创立以来&#xff0c;凭借开源生态、低成本技术路径与多模态创新&#xff0c;迅速从行业新秀成长为全球AI竞赛中的关键力量…...

合规+增效 正也科技携智能营销产品出席中睿论坛

正也科技作为医药数字化领域的标杆企业&#xff0c;受邀参展第二届中睿医健产业企业家年会暨第十三届中睿医药新春论坛&#xff0c;本次论坛以“合力启新程”为主题&#xff0c;吸引了800多位医药健康企业的董事长、总经理参与&#xff0c;并通过主论坛、分论坛、路演等形式探讨…...

Python小练习系列 Vol.5:数独求解(经典回溯 + 剪枝)

&#x1f9e0; Python小练习系列 Vol.5&#xff1a;数独求解&#xff08;经典回溯 剪枝&#xff09; &#x1f9e9; 数独不仅是益智游戏&#xff0c;更是回溯算法的典范&#xff01;本期我们将用 DFS 剪枝 的方式一步步求解一个标准 9x9 数独。 &#x1f9e9; 一、题目描述 …...