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}")

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

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

相关文章

机器学习——集成学习框架(GBDT、XGBoost、LightGBM、CatBoost)、调参方法

一、集成学习框架 对训练样本较少的结构化数据领域&#xff0c;Boosting算法仍然是常用项 XGBoost、CatBoost和LightGBM都是以决策树为基础的集成学习框架 三个学习框架的发展是&#xff1a;XGBoost是在GBDT的基础上优化而来&#xff0c;CatBoost和LightGBM是在XGBoost的基础上…

第十五章:Python的Pandas库详解及常见用法

在数据分析领域&#xff0c;Python的Pandas库是一个不可或缺的工具。它提供了高效的数据结构和数据分析工具&#xff0c;使得数据处理变得简单而直观。本文将详细介绍Pandas库的基本功能、常见用法&#xff0c;并通过示例代码演示如何使用Pandas进行数据处理。最后&#xff0c;…

【Python桌面应用】PySide6 界面开发完全指南

文章目录 1. 引言2. PySide6 简介与安装2.1 什么是PySide62.2 PySide6 vs. PyQt62.3 安装PySide62.4 开发环境配置建议 3. Qt 设计原理3.1 Qt对象模型3.2 信号与槽机制3.3 Qt坐标系统3.4 Qt样式表(QSS) 4. 创建第一个应用4.1 基本应用结构4.2 主窗口与应用生命周期4.3 使用面向…

用 pytorch 从零开始创建大语言模型(三):编码注意力机制

从零开始创建大语言模型&#xff08;Python/pytorch &#xff09;&#xff08;三&#xff09;&#xff1a;编码注意力机制 3 编码注意力机制3.1 建模长序列的问题3.2 使用注意力机制捕捉数据依赖关系3.3 通过自注意力关注输入的不同部分3.3.1 一个没有可训练权重的简化自注意力…

Spring中的IOC及AOP概述

前言 Spring 框架的两大核心设计思想是 IOC&#xff08;控制反转&#xff09; 和 AOP&#xff08;面向切面编程&#xff09;。它们共同解决了代码耦合度高、重复逻辑冗余等问题。 IOC&#xff08;控制反转&#xff09; 1.核心概念 控制反转&#xff08;Inversion of Control…

STM32_HAL开发环境搭建【Keil(MDK-ARM)、STM32F1xx_DFP、 ST-Link、STM32CubeMX】

安装Keil(MDK-ARM)【集成开发环境IDE】 我们会在Keil(MDK-ARM)上去编写代码、编译代码、烧写代码、调试代码。 Keil(MDK-ARM)的安装方法&#xff1a; 教学视频的第02分03秒开始看。 安装过程中请修改一下下面两个路径&#xff0c;避免占用C盘空间。 Core就是Keil(MDK-ARM)的…

python 第三方库 - dotenv读取配置文件

.env 文件是一种用于存储环境变量的配置文件&#xff0c;常用于项目的运行环境设置。环境变量是操作系统层面的一些变量&#xff0c;它们可以被应用程序访问和使用&#xff0c;通常包含敏感信息或特定于环境的配置&#xff0c;如数据库连接信息、API 密钥、调试模式等。 安装p…

用python压缩图片大小

下载库 cmd开命令或者PyCharm执行都行 pip install pillow2. 然后就是代码 from PIL import Imagedef compress_image(input_path, output_path, quality85, max_sizeNone):"""压缩图片大小。参数:- input_path: 输入图片路径- output_path: 输出图片路径- qu…

【自用记录】本地关联GitHub以及遇到的问题

最近终于又想起GitHub&#xff0c;想上传代码和项目到仓库里。 由于很早之前有在本地连接过GitHub&#xff08;但没怎么用&#xff09;&#xff0c;现在需要重新搞起&#xff08;操作忘得差不多&#xff09;。 在看教程实操的过程中遇到了一些小问题&#xff0c;遂记录一下。 前…

在一个scss文件中定义变量,在另一个scss文件中使用

_variables.scss文件 : $line-gradient-init-color: linear-gradient(90deg, #8057ff 0%, #936bff 50%, #b892ff 100%); $line-gradient-hover-color: linear-gradient(90deg, #936bff 0%, #b892ff 50%, #f781ce 100%); $line-gradient-active-color: linear-gradient(90deg, …

从零开始研发GPS接收机连载——19、自制GPS接收机的春运之旅

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 从零开始研发GPS接收机连载——19、自制GPS接收机的春运之旅 许久未曾更新这个系列&#xff0c;并非我平日里对这事儿没了兴致&#xff0c;不再愿意折腾。实则是受限于自身条…

智能驾驶功能LCC车道保持居中

画龙现象就是LCC常见bug LDW车道偏离预警 LKA车道保持 声音其实就是蜂鸣器 有些车是40 有些是60

Java全栈面试宝典:线程机制与Spring依赖注入深度解析

目录 一、Java线程核心机制 &#x1f525; 问题3&#xff1a;start()与run()的底层执行差异 线程启动流程图解 核心差异对照表 代码验证示例 &#x1f525; 问题4&#xff1a;Thread与Runnable的六大维度对比 类关系UML图 最佳实践代码 &#x1f525; 问题5&#xff1…

使用ANTLR4解析Yaml,JSON和Latex

文章目录 ANTLR4基本使用**1. 安装 Java 运行时&#xff08;必需&#xff09;****2. 安装 ANTLR4 命令行工具****方法一&#xff1a;通过包管理器&#xff08;推荐&#xff09;****macOS/Linux (Homebrew)****Windows (Chocolatey)** **方法二&#xff1a;手动安装&#xff08;…

NixVis 开源轻量级 Nginx 日志分析工具

NixVis NixVis 是一款基于 Go 语言开发的、开源轻量级 Nginx 日志分析工具&#xff0c;专为自部署场景设计。它提供直观的数据可视化和全面的统计分析功能&#xff0c;帮助您实时监控网站流量、访问来源和地理分布等关键指标&#xff0c;无需复杂配置即可快速部署使用。 演示…

黑盒测试的等价类划分法(输入数据划分为有效的等价类和无效的等价类)

重点: 有效等价和单个无效等价各取1个即可 1、正向用例:一条尽可能覆盖多条2、逆向用例:每一条数据&#xff0c;都是一条单独用例。 步骤: 1、明确需求 2、确定有效和无效等价 3、根据有效和无效造数据编写用例 3、适用场景 针对:需要有大量数据测试输入&#xff0c; …

Linux Mem -- 通过reserved-memory缩减内存

目录 1. reserved-memory缩减内存 2. 为什么要通过2段512GB预留内存实现该缩减呢&#xff1f; 3. reserved-momery中的no-map属性 4. 预留的的内存是否会被统计到系统MemTotal中&#xff1f; 本文是解决具体的一些思考总结&#xff0c;和Linux内核的reserved-memory机制相关…

多线程—synchronized原理

上篇文章&#xff1a; 多线程—锁策略https://blog.csdn.net/sniper_fandc/article/details/146508232?fromshareblogdetail&sharetypeblogdetail&sharerId146508232&sharereferPC&sharesourcesniper_fandc&sharefromfrom_link 目录 1 synchronized的锁…

AWS混合云部署实战:打造企业级数字化转型的“黄金架构”

引言 “上云是必然&#xff0c;但全部上云未必是必然。”在数字化转型的深水区&#xff0c;企业面临的核心矛盾日益凸显&#xff1a;如何在享受公有云敏捷性的同时&#xff0c;满足数据主权、低延迟和遗留系统兼容的刚性需求&#xff1f; AWS混合云凭借“云上云下一张网”的独…

进程模型5-0号进程

内核版本架构作者GitHubCSDNLinux-3.0.1armv7-ALux1206 0号进程的作用 在 Linux 中除了 init_task 0号进程&#xff0c;所有的线/进程都是通过 do_fork 函数复制父线/进程创建得到&#xff0c;因为 0号进程产生时没有任何进程可以参照&#xff0c;只能通过静态方式构造进程描述…