Python網絡爬蟲(二) - 解析靜態網頁

文章目錄

  • 一、網頁解析技術介紹
  • 二、Beautiful Soup庫
    • 1. Beautiful Soup庫介紹
    • 2. Beautiful Soup庫幾種解析器比較
    • 3. 安裝Beautiful Soup庫
      • 3.1 安裝 Beautiful Soup 4
      • 3.2 安裝解析器
    • 4. Beautiful Soup使用步驟
      • 4.1 創建Beautiful Soup對象
      • 4.2 獲取標簽
        • 4.2.1 通過標簽名獲取
        • 4.2.2 通過find()方法獲取
        • 4.2.3 通過find_all()方法獲取
        • 4.2.4 CSS選擇器介紹
        • 4.2.5 通過select_one()方法獲取
        • 4.2.6 通過select()方法獲取
      • 4.3 提取數據
        • 4.3.1 獲取標簽間的內容
        • 4.3.2 獲取標簽屬性的值
  • 三、實戰:解析豆瓣讀書中小說的網頁
    • 1. 提取網頁數據
    • 2. 保存數據到csv文件


一、網頁解析技術介紹

網頁解析技術是爬蟲獲取數據的核心環節,指從網頁的HTML/XML等源代碼中提取目標信息(如文本、鏈接、圖片、表格數據等)的過程。


二、Beautiful Soup庫

1. Beautiful Soup庫介紹

Beautiful Soup 是 Python 中一款功能強大的 HTML/XML 解析庫,它能夠將復雜的網頁源代碼轉換為結構化的樹形文檔(Parse Tree),并提供簡單直觀的 API 供開發者遍歷、搜索和提取其中的元素與數據。

其核心優勢在于:

  • 強大的容錯能力:能夠處理不規范的 HTML 代碼(如標簽未閉合、屬性缺失、嵌套混亂等),自動修復語法錯誤,生成可解析的結構,非常適合爬取實際場景中格式混亂的網頁。
  • 直觀的操作方式:支持通過標簽名、類名(class)、ID、屬性等多種方式定位元素,語法貼近自然語言,即使是非前端開發背景的開發者也能快速上手。
  • 靈活的解析支持:可搭配不同的解析器(如 Python 標準庫的 html.parserlxmlhtml5lib 等),兼顧解析速度、兼容性和功能需求。
  • 豐富的功能擴展:提供遍歷文檔樹、搜索文檔樹、修改文檔結構等功能,不僅能提取數據,還能對網頁內容進行二次處理。

Beautiful Soup 廣泛應用于網絡爬蟲、數據挖掘、網頁內容分析等場景,是 Python 爬蟲生態中處理網頁解析的核心工具之一。

2. Beautiful Soup庫幾種解析器比較

Beautiful Soup 本身不直接解析網頁,而是依賴第三方解析器完成 HTML/XML 的解析工作。不同解析器在速度、容錯性和功能上存在差異,選擇合適的解析器能提升解析效率和兼容性。

以下是常用解析器的對比:

解析器依賴庫適用場景優點缺點
html.parserPython 標準庫(內置)輕量場景、對解析速度要求不高的情況無需額外安裝,兼容性好(支持 Python 2.7+ 和 3.2+)解析速度較慢,對復雜不規范 HTML 的容錯性一般
lxml (HTML)lxml追求解析速度和容錯性的常規 HTML 解析場景解析速度極快,對不規范 HTML 的修復能力強需要額外安裝 lxml 庫(C 語言編寫,安裝可能依賴系統環境)
lxml (XML)lxmlXML 文檔解析或需要嚴格 XML 語法支持的場景支持 XML 特有語法,解析速度快,容錯性強需安裝 lxml 庫,僅適用于 XML 格式文檔
html5libhtml5lib需完全模擬瀏覽器解析行為的場景對不規范 HTML 的容錯性最強(完全遵循 HTML5 標準)解析速度最慢,需要額外安裝 html5lib

3. 安裝Beautiful Soup庫

Beautiful Soup 庫的安裝過程簡單,支持通過 Python 包管理工具 pip 快速安裝,同時需根據需求安裝對應的解析器。

3.1 安裝 Beautiful Soup 4

Beautiful Soup 目前最新穩定版本為 Beautiful Soup 4(簡稱 bs4),安裝命令如下:

pip install beautifulsoup4 -i https://mirrors.aliyun.com/pypi/simple/

3.2 安裝解析器

根據前文的解析器對比,推薦安裝 lxml 解析器(兼顧速度和容錯性):

pip install lxml -i https://mirrors.aliyun.com/pypi/simple/

若需要 html5lib 解析器(用于極端不規范網頁),安裝命令如下:

pip install html5lib -i https://mirrors.aliyun.com/pypi/simple/

4. Beautiful Soup使用步驟

使用 Beautiful Soup 解析網頁的核心流程為:創建Beautiful Soup對象 --> 獲取標簽 --> 提取數據

4.1 創建Beautiful Soup對象

創建Beautiful Soup對象是使用該庫解析網頁的第一步,通過將網頁內容(HTML/XML)和解析器傳入BeautifulSoup類,生成一個可操作的樹形文檔對象。這個對象封裝了網頁的所有元素和結構,提供了豐富的方法用于遍歷、搜索和提取數據。

基本語法:

from bs4 import BeautifulSoup# 創建Beautiful Soup對象
soup = BeautifulSoup(markup, features, **kwargs)

Beautiful Soup類構造方法的參數說明:

參數名類型作用描述必選示例值
markup字符串/文件對象待解析的HTML/XML內容,可來源于網絡響應文本或本地文件內容response.text(網絡響應文本)、open("page.html")(本地文件對象)
features字符串指定解析器類型,決定使用哪種解析器處理markup內容"lxml""html.parser""html5lib"
builder解析器構建器自定義解析器構建器(高級用法,通常無需設置)lxml.html.HTMLParser()
parse_only解析過濾器限制只解析指定標簽(提升效率),需配合SoupStrainer使用SoupStrainer("div", class_="content")(只解析class為content的div)
from_encoding字符串指定markup的編碼格式(自動檢測失敗時手動指定)"utf-8""gbk"
exclude_encodings列表排除可能的編碼格式(用于優化編碼檢測)["ISO-8859-1", "windows-1252"]
element_classes字典自定義標簽類(高級用法,用于擴展標簽功能){"div": MyDivClass, "a": MyATagClass}

示例:創建Beautiful Soup對象

from bs4 import BeautifulSoupsoup = BeautifulSoup(markup=open(file='./豆瓣讀書/小說/0.html', mode='r', encoding='utf-8'), features='lxml')

4.2 獲取標簽

4.2.1 通過標簽名獲取

直接通過標簽名稱(如 titlediva 等)訪問網頁中的第一個匹配標簽,適用于獲取頁面中唯一或首個出現的標簽。

語法

tag = soup.標簽名  # 獲取第一個匹配的標簽

示例: 獲取title標簽

from bs4 import BeautifulSoupsoup = BeautifulSoup(markup=open(file='./豆瓣讀書/小說/0.html', mode='r', encoding='utf-8'), features='lxml')title_tag = soup.title
print(title_tag)

打印結果如下圖所示:

在這里插入圖片描述

4.2.2 通過find()方法獲取

find() 方法用于在文檔樹中查找第一個符合條件的標簽,支持通過標簽名、屬性、文本內容等多條件篩選,靈活性遠高于直接通過標簽名獲取。

語法

tag = soup.find(name, attrs, recursive, string, **kwargs)

參數說明

參數名類型作用描述示例值
name字符串/列表指定標簽名稱,可傳入單個標簽名或多個標簽名的列表(匹配任一標簽)。name="a"(查找<a>標簽)、name=["div", "p"](查找<div><p>
attrs字典通過標簽屬性篩選,鍵為屬性名,值為屬性值(支持正則匹配)。attrs={"class": "info"}(查找class為info的標簽)
recursive布爾值是否遞歸查找所有子節點,True(默認)表示搜索所有后代節點,False僅搜索直接子節點。recursive=False(僅查找直接子節點)
string字符串/正則按標簽內的文本內容篩選,支持字符串完全匹配或正則表達式匹配。string="科幻小說"string=re.compile(r"小說")
** kwargs關鍵字參數直接傳入屬性名作為參數(簡化寫法,等價于attrs),如class_id等。class_="rating_nums"(查找class為rating_nums的標簽)

示例: 獲取第一個出版社所在的標簽。

from bs4 import BeautifulSoupsoup = BeautifulSoup(markup=open(file='./豆瓣讀書/小說/0.html', mode='r', encoding='utf-8'), features='lxml')tag = soup.find(name='div', attrs={"class": "pub"})
print(tag)

打印結果如下圖所示:

在這里插入圖片描述

4.2.3 通過find_all()方法獲取

find_all() 方法用于在文檔樹中查找所有符合條件的標簽,返回一個包含所有匹配結果的列表,是批量提取數據的核心方法。

語法

tag_list = soup.find_all(name, attrs, recursive, string, limit, **kwargs)

參數說明

參數名類型作用描述示例值
name字符串/列表find(),指定標簽名稱或標簽名列表。name="a"(獲取所有<a>標簽)
attrs字典find(),通過屬性篩選標簽。attrs={"id": "content"}(獲取id為content的所有標簽)
recursive布爾值find(),是否遞歸查找所有子節點。recursive=True(默認,搜索所有后代節點)
string字符串/正則find(),按文本內容篩選,返回包含匹配文本的節點列表。string=re.compile(r"評分")(獲取所有含“評分”文本的節點)
limit整數限制返回結果的數量,僅返回前 limit 個匹配標簽。limit=5(僅返回前5個匹配結果)
** kwargs關鍵字參數find(),直接傳入屬性名作為參數(如 class_id)。class_="title"(獲取所有class為title的標簽)

示例: 獲取前5個出版社所在的標簽。

from bs4 import BeautifulSoupsoup = BeautifulSoup(markup=open(file='./豆瓣讀書/小說/0.html', mode='r', encoding='utf-8'), features='lxml')tag = soup.find_all(name='div', attrs={"class": "pub"}, limit=5)
print(tag)

打印結果如下圖所示:

在這里插入圖片描述

4.2.4 CSS選擇器介紹

CSS選擇器是一種通過標簽名、類名、ID、屬性等規則定位HTML元素的語法,廣泛應用于前端開發和網頁解析。Beautiful Soup的select()select_one()方法支持CSS選擇器語法,以下是常用選擇器規則:

選擇器類型語法示例描述說明
標簽選擇器div匹配所有<div>標簽
類選擇器.info匹配所有class="info"的標簽
ID選擇器#content匹配id="content"的標簽(ID唯一)
屬性選擇器a[href]匹配所有包含href屬性的<a>標簽
屬性值選擇器a[href="https://example.com"]匹配href屬性值為指定URL的<a>標簽
屬性包含選擇器a[href*="book"]匹配href屬性值包含"book"的<a>標簽
層級選擇器div.info h2匹配class="info"<div>下的所有<h2>標簽
直接子元素選擇器div > p匹配<div>的直接子元素<p>(不包含嵌套子元素)
相鄰兄弟選擇器h2 + p匹配<h2>后面緊鄰的第一個<p>標簽
偽類選擇器li:nth-child(2)匹配父元素中第2個<li>子元素
4.2.5 通過select_one()方法獲取

select_one()方法通過CSS選擇器語法查找第一個符合條件的標簽,返回單個標簽對象(而非列表),適用于獲取唯一或首個匹配的元素。

語法

from bs4 import BeautifulSoupsoup = BeautifulSoup(markup=open(file='./豆瓣讀書/小說/0.html', mode='r', encoding='utf-8'), features='lxml')tag = soup.select_one(selector='div .info > .pub')
print(tag)

參數說明

參數名類型作用描述示例值
selector字符串CSS選擇器規則,支持上述所有選擇器語法。div.info h2 a(匹配class為info的div下的h2內的a標簽)
namespaces字典命名空間映射(用于XML文檔解析,HTML解析中通常無需設置)。{"html": "http://www.w3.org/1999/xhtml"}
** kwargs關鍵字參數傳遞給解析器的額外參數(高級用法,一般無需設置)。-

示例: 獲取第一個出版社所在的標簽。

tag = soup.find(name='div', attrs={"class": "pub"})
print(tag)

打印結果如下圖所示:

在這里插入圖片描述

4.2.6 通過select()方法獲取

select()方法通過CSS選擇器語法查找所有符合條件的標簽,返回包含所有匹配結果的列表,是批量提取數據的常用方法。

語法

tag_list = soup.select(selector, namespaces=None, limit=None,** kwargs)

參數說明

參數名類型作用描述示例值
selector字符串select_one(),CSS選擇器規則。span.rating_nums(匹配class為rating_nums的span標簽)
namespaces字典select_one(),命名空間映射(HTML解析中通常無需設置)。-
limit整數限制返回結果數量,僅返回前limit個匹配標簽(默認返回所有)。limit=3(僅返回前3個匹配結果)
**kwargs關鍵字參數傳遞給解析器的額外參數(一般無需設置)。-

示例: 獲取前5個出版社所在的標簽。

from bs4 import BeautifulSoupsoup = BeautifulSoup(markup=open(file='./豆瓣讀書/小說/0.html', mode='r', encoding='utf-8'), features='lxml')tag = soup.select(selector='div .info > .pub', limit=5)
print(tag)

打印結果如下圖所示:

在這里插入圖片描述

4.3 提取數據

獲取標簽后,下一步是從標簽中提取所需數據,主要包括標簽間的文本內容和標簽的屬性值(如鏈接、圖片地址等)。

4.3.1 獲取標簽間的內容

標簽間的內容通常是網頁中顯示的文本(如標題、描述、評分等),Beautiful Soup 提供了多種屬性用于獲取不同格式的文本內容,適用于不同場景:

屬性名描述說明示例代碼示例結果(假設標簽為<p>hello <b>world</b></p>
text返回標簽內所有文本的拼接字符串,自動忽略標簽嵌套結構,僅保留文本內容。tag.texthello world
string僅當標簽內只有純文本(無嵌套標簽)時返回文本,否則返回Nonetag.stringNone(因存在<b>嵌套標簽)
strings返回一個生成器,包含標簽內所有文本片段(包括嵌套標簽中的文本),保留分隔符。list(tag.strings)['hello ', 'world']
stripped_strings類似strings,但會自動去除每個文本片段的首尾空白字符,并過濾空字符串。list(tag.stripped_strings)['hello', 'world']

示例:提取標簽中的內容

from bs4 import BeautifulSoupsoup = BeautifulSoup(markup=open(file='./豆瓣讀書/小說/0.html', mode='r', encoding='utf-8'), features='lxml')# 使用 CSS 選擇器查找第一個 class="subject-item" 的標簽(通常是一個 <li> 或 <div>)
# soup.select_one() 返回匹配的第一個 Tag 對象,如果沒有匹配則返回 None
li_tag = soup.select_one('.subject-item')# 打印該標簽及其所有子標簽中的**全部文本內容**
# .text 屬性會遞歸獲取標簽內所有字符串,并自動用空格連接
# 注意:可能包含多個空格、換行或制表符等空白字符
print(li_tag.text)# 遍歷 li_tag 下的所有**直接和嵌套的字符串內容**(包括空白字符)
# .strings 是一個生成器,返回所有文本節點(包含空白、換行等)
# 輸出時會看到原始的縮進、換行等格式
for string in li_tag.strings:print(string)# 遍歷 li_tag 下的所有**去除了首尾空白的非空字符串**
# .stripped_strings 是一個生成器,功能類似 .strings
# 但會對每個字符串調用 .strip(),去除兩端空白,并跳過空字符串
# 更適合提取“干凈”的文本內容
for string in li_tag.stripped_strings:print(string)# 使用更精確的 CSS 選擇器查找書籍出版信息
# 選擇路徑:div 下 class="info" 的元素 > 其直接子元素 class="pub"
# 通常用于匹配圖書的“作者 / 出版社 / 出版年份”等信息
tag = soup.select_one(selector='div .info > .pub')# 獲取該標簽的**直接文本內容**(不包括子標簽的文本)
# .string 表示標簽的直接內容(如果標簽只有一個子字符串)
# .strip() 去除字符串首尾的空白、換行等字符
# 最終得到干凈的出版信息文本
print(tag.string.strip())
4.3.2 獲取標簽屬性的值

HTML標簽通常包含屬性(如<a href="url">中的href<img src="path">中的src),這些屬性值是提取鏈接、圖片地址、類名等信息的關鍵。

直接通過屬性名訪問
語法:tag["屬性名"]
適用場景:獲取已知存在的屬性(如hrefsrcclass等)。

示例:獲取小說名稱的鏈接

from bs4 import BeautifulSoupsoup = BeautifulSoup(markup=open(file='./豆瓣讀書/小說/0.html', mode='r', encoding='utf-8'), features='lxml')a_tag = soup.select_one(".subject-item .info a")
link = a_tag["href"]
print( link)

使用get()方法
語法:tag.get(屬性名, 默認值)
適用場景:屬性可能不存在時,避免報錯(不存在則返回None或指定的默認值)。

示例:獲取小說名稱的鏈接

from bs4 import BeautifulSoupsoup = BeautifulSoup(markup=open(file='./豆瓣讀書/小說/0.html', mode='r', encoding='utf-8'), features='lxml')a_tag = soup.select_one(".subject-item .info a")
link = a_tag.get('href')
print( link)

打印結果如下所示:

https://book.douban.com/subject/36104107/

獲取所有屬性
語法:tag.attrs
適用場景:獲取標簽的所有屬性及值(返回字典)。

示例:獲取小說名稱所在a標簽的所有屬性

from bs4 import BeautifulSoupsoup = BeautifulSoup(markup=open(file='./豆瓣讀書/小說/0.html', mode='r', encoding='utf-8'), features='lxml')a_tag = soup.select_one(".subject-item .info a")
attrs = a_tag.attrs
print(attrs)
{'href': 'https://book.douban.com/subject/36104107/', 'title': '長安的荔枝', 'onclick': "moreurl(this,{i:'0',query:'',subject_id:'36104107',from:'book_subject_search'})"}

三、實戰:解析豆瓣讀書中小說的網頁

1. 提取網頁數據

代碼如下所示:

# 導入 BeautifulSoup 用于解析 HTML 內容
from bs4 import BeautifulSoup# 導入 Path 用于跨平臺安全地操作文件和目錄路徑
from pathlib import Path# 定義 HTML 文件所在的根目錄
file_dir = Path('./豆瓣讀書')# 使用 rglob 遞歸查找目錄中所有以 .html 結尾的文件(包括子目錄)
# 例如:./豆瓣讀書/page1.html, ./豆瓣讀書/2023/page2.html 等
html_files = file_dir.rglob('*.html')# 遍歷每一個找到的 HTML 文件路徑
for file_path in html_files:# 確保當前路徑是一個文件(而非目錄)if file_path.is_file():# 使用 open() 打開文件,指定編碼為 utf-8(防止中文亂碼)# 將文件內容傳遞給 BeautifulSoup,使用 'lxml' 作為解析器(速度快、容錯性好)soup = BeautifulSoup(markup=open(file=file_path, mode='r', encoding='utf-8'),features='lxml')# 使用 CSS 選擇器查找頁面中所有 class="subject-item" 的元素# 每個 subject-item 通常代表一本書的信息(如書名、作者、評分等)subject_items = soup.select('.subject-item')# 遍歷每一本書的信息條目for subject_item in subject_items:# 獲取書籍鏈接:查找 .info 下的第一個 <a> 標簽,提取其 href 屬性href = subject_item.select_one('.info a').get('href')# 獲取書籍標題:同上,提取 <a> 標簽的 title 屬性(鼠標懸停時顯示的完整書名)title = subject_item.select_one('.info a').get('title')# 獲取出版信息:查找 .info 下 class="pub" 的元素,獲取其文本內容并去除首尾空白pub = subject_item.select_one('.info .pub').string.strip()# 獲取評分:查找 class="rating_nums" 的元素(可能是評分 8.5、9.0 等)rating = subject_item.select_one('.info .rating_nums')# 安全提取評分文本:如果元素存在且有字符串內容,則去空白;否則設為空字符串rating = rating.string.strip() if rating and rating.string else ''# 獲取評分人數:查找 class="pl" 的元素(如 "(2048人評價)")rating_num = subject_item.select_one('.info .pl').string.strip()# 獲取書籍簡介(摘要):查找 .info 的直接子元素 <p>(通常為書籍簡介)plot = subject_item.select_one('.info > p')# 安全提取簡介文本plot = plot.string.strip() if plot and plot.string else ''# 查找紙質書購買鏈接:在 .info 下 class="buy-info" 中的 <a> 標簽paper_tag = subject_item.select_one('.info .buy-info > a')# 判斷是否找到購買鏈接標簽if paper_tag:# 提取購買鏈接的 href(跳轉地址)buylinks = paper_tag.get('href')# 提取鏈接上的文字(通常是價格,如 "¥39.5")paper_price = paper_tag.string.strip()else:# 如果沒有找到購買信息,則設為空buylinks = ''paper_price = ''# 輸出提取的關鍵信息(可根據需要保存到 CSV/數據庫等)print(href, title, pub, rating_num, paper_price, buylinks)

部分打印結果如下圖所示:

在這里插入圖片描述

2. 保存數據到csv文件

代碼如下所示:

# 導入 BeautifulSoup 用于解析 HTML 內容
# 導入 Path 用于跨平臺安全地操作文件和目錄路徑
from pathlib import Pathimport pandas as pd
from bs4 import BeautifulSoup# 定義 HTML 文件所在的根目錄
file_dir = Path('./豆瓣讀書')# 使用 rglob 遞歸查找目錄中所有以 .html 結尾的文件(包括子目錄)
# 例如:./豆瓣讀書/page1.html, ./豆瓣讀書/2023/page2.html 等
html_files = file_dir.rglob('*.html')# 用于存儲所有書籍信息的列表(每本書是一個字典)
books = []# 遍歷每一個找到的 HTML 文件路徑
for file_path in html_files:# 確保當前路徑是一個文件(而非目錄)if file_path.is_file():# 使用 open() 打開文件,指定編碼為 utf-8(防止中文亂碼)# 將文件內容傳遞給 BeautifulSoup,使用 'lxml' 作為解析器(速度快、容錯性好)soup = BeautifulSoup(markup=open(file=file_path, mode='r', encoding='utf-8'),features='lxml')# 使用 CSS 選擇器查找頁面中所有 class="subject-item" 的元素# 每個 subject-item 通常代表一本書的信息(如書名、作者、評分等)subject_items = soup.select('.subject-item')# 遍歷每一本書的信息條目for subject_item in subject_items:# 獲取書籍鏈接:查找 .info 下的第一個 <a> 標簽,提取其 href 屬性href = subject_item.select_one('.info a').get('href')# 獲取書籍標題:同上,提取 <a> 標簽的 title 屬性(鼠標懸停時顯示的完整書名)title = subject_item.select_one('.info a').get('title')# 獲取出版信息:查找 .info 下 class="pub" 的元素,獲取其文本內容并去除首尾空白pub = subject_item.select_one('.info .pub').string.strip()# 獲取評分:查找 class="rating_nums" 的元素(可能是評分 8.5、9.0 等)rating = subject_item.select_one('.info .rating_nums')# 安全提取評分文本:如果元素存在且有字符串內容,則去空白;否則設為空字符串rating = rating.string.strip() if rating and rating.string else ''# 獲取評分人數:查找 class="pl" 的元素(如 "(2048人評價)")rating_num = subject_item.select_one('.info .pl').string.strip()# 獲取書籍簡介(摘要):查找 .info 的直接子元素 <p>(通常為書籍簡介)plot = subject_item.select_one('.info > p')# 安全提取簡介文本plot = plot.string.strip() if plot and plot.string else ''# 查找紙質書購買鏈接:在 .info 下 class="buy-info" 中的 <a> 標簽paper_tag = subject_item.select_one('.info .buy-info > a')# 判斷是否找到購買鏈接標簽if paper_tag:# 提取購買鏈接的 href(跳轉地址)buylinks = paper_tag.get('href')# 提取鏈接上的文字(通常是價格,如 "¥39.5")paper_price = paper_tag.string.strip()else:# 如果沒有找到購買信息,則設為空buylinks = ''paper_price = ''# 輸出提取的關鍵信息(可根據需要保存到 CSV/數據庫等)# print(href, title, pub, rating_num, paper_price, buylinks)# 將這本書的信息存為字典,加入列表books.append({'href': href,'title': title,'pub': pub,'rating': rating,'rating_num': rating_num,'plot': plot,'buylinks': buylinks,'paper_price': paper_price})
# 轉換為 DataFrame
books_df = pd.DataFrame(books)
# 創建保存目錄(如果不存在)
Path('./data').mkdir(parents=True, exist_ok=True)
# 保存為 CSV 文件
books_df.to_csv('./data/books.csv', index=False, encoding='utf-8-sig')
print(f"圖書數據已保存到:'./data/books.csv'")

保存后的部分數據如下圖所示:

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/93057.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/93057.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/93057.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Linux基礎知識系列】第九十四篇 - 如何使用traceroute命令追蹤路由

在網絡環境中&#xff0c;了解數據包從源主機到目標主機的路徑是非常重要的。這不僅可以幫助我們分析網絡連接問題&#xff0c;還可以用于診斷網絡延遲、丟包等問題。traceroute命令是一個強大的工具&#xff0c;它能夠追蹤數據包在網絡中的路徑&#xff0c;顯示每一跳的延遲和…

達夢數據閃回查詢-快速恢復表

Time:2025/08/12Author:skatexg一、環境說明DM數據庫&#xff1a;DM8.0及以上版本二、適用場景研發在誤操作或變更數據后&#xff0c;想馬上恢復表到某個時間點&#xff0c;可以通過閃回查詢功能快速實現&#xff08;通過全量備份恢復時間長&#xff0c;成本高&#xff09;三、…

力扣(LeetCode) ——225 用隊列實現棧(C語言)

題目&#xff1a;用隊列實現棧示例1&#xff1a; 輸入&#xff1a; [“MyStack”, “push”, “push”, “top”, “pop”, “empty”] [[], [1], [2], [], [], []] 輸出&#xff1a; [null, null, null, 2, 2, false] 解釋&#xff1a; MyStack myStack new MyStack(); mySta…

微軟推出AI惡意軟件檢測智能體 Project Ire

開篇 在8月5號&#xff0c;微軟研究院發布了一篇博客文章&#xff0c;在該篇博客中推出了一款名為Project Ire的AI Agent。該Agent可以在無需人類協助的情況下&#xff0c;自主分析和分類二進制文件。它可以在無需了解二進制文件來源或用途的情況下&#xff0c;對文件進行完全的…

哪些對會交由SpringBoot容器管理?

在 Spring Boot 中,交由容器管理的對象通常稱為“Spring Bean”,這些對象的創建、依賴注入、生命周期等由 Spring 容器統一管控。以下是常見的會被 Spring Boot 容器管理的對象類型及識別方式: 一、通過注解聲明的組件(最常見) Spring Boot 通過類級別的注解自動掃描并注…

Android POS應用在android運行常見問題及解決方案

概述 本文檔記錄了在Android POS應用開發過程中遇到的兩個關鍵問題及其解決方案&#xff1a; UnsatisfiedLinkError: couldnt find "libnative.so" 錯誤ActivityNotFoundException 錯誤商戶信息一致性檢查繞過 問題1&#xff1a;UnsatisfiedLinkError - libnative.so…

基于SpringBoot的旅游網站系統

1. 項目簡介 旅游線路管理系統是一個基于Spring Boot的在線旅游服務平臺&#xff0c;提供旅游線路展示、分類、預訂、訂單管理等功能。系統包含前臺用戶界面和后臺管理模塊&#xff0c;支持用戶注冊登錄、線路瀏覽、收藏、下單支付、客服咨詢等核心功能。管理員可管理線路信息、…

CVPR 2025 | 機器人操控 | RoboGround:用“掩碼”中介表示,讓機器人跨場景泛化更聰明

點擊關注gongzhonghao【計算機sci論文精選】1.導讀1.1論文基本信息論文標題&#xff1a;ROBOGROUND: Robotic Manipulation with Grounded Vision-Language Priors作者&#xff1a;Haifeng Huang, Xinyi Chen, Hao Li&#xff0c; Xiaoshen Han, Yilun Chen, Tai Wang, Zehan W…

構建Node.js單可執行應用(SEA)的方法

如果為了降低部署復雜度&#xff0c;可以考慮使用vercel/ncc。除非有特別理由&#xff0c;不建議使用SEA。1. 環境準備1.1. 基礎要求Node.js: > 19.0.0 (推薦最新LTS版本)1.2. 安裝依賴npm install postject typescript1.3. 驗證環境node -v # 確認版本 > 19 ts…

Java19 Integer 位操作精解:compress與expand《Hacker‘s Delight》(第二版,7.4節)

compress(int i, int mask) 這個方法是Java 19中新增的一個強大的位操作函數。compress 方法的核心功能可以理解為 “按位過濾和壓縮” 。過濾 (Filter): 它使用 mask&#xff08;掩碼&#xff09;作為過濾器。對于輸入整數 i&#xff0c;只有那些在 mask 中對應位為 1 的比特才…

minio部署和雙機熱備

安裝單機版MinIO&#xff08;準備2臺機器A、B,A、B服務器操作一致&#xff09;切換目錄并下載MinIO二進制文件cd /usr/local/bin wget https://dl.minio.org.cn/server/minio/release/linux-amd64/minio chmod x minio編輯配置文件vi /etc/default/minio.confMINIO_VOLUMES&quo…

【Java】 Java 21 革命性升級:虛擬線程與結構化并發的深度實踐指南

還在為高昂的AI開發成本發愁?這本書教你如何在個人電腦上引爆DeepSeek的澎湃算力! Java 21 作為 Oracle JDK 的長期支持版本,引入了多項革命性特性,其中虛擬線程(Virtual Threads)和結構化并發(Structured Concurrency)尤為突出。這些特性旨在解決傳統線程模型在高并發…

Apache IoTDB 全場景部署:基于 Apache IoTDB 的跨「端-邊-云」的時序數據庫 DB+AI

Apache IoTDB 全場景部署&#xff1a;基于 Apache IoTDB 的跨「端-邊-云」的時序數據庫 DBAI 文章目錄Apache IoTDB 全場景部署&#xff1a;基于 Apache IoTDB 的跨「端-邊-云」的時序數據庫 DBAIApache IoTDB 介紹Docker部署指導企業版數據庫配套工具 WorkbenchTimechoDB&…

計算機網絡---傳輸控制協議Transmission Control Protocol(TCP)

一、TCP的定位與核心特性 TCP&#xff08;Transmission Control Protocol&#xff0c;傳輸控制協議&#xff09;是TCP/IP協議棧中傳輸層的核心協議&#xff0c;與UDP&#xff08;用戶數據報協議&#xff09;共同承擔端到端數據傳輸功能。其設計目標是在不可靠的IP網絡上提供可靠…

week1-[分支嵌套]公因數

week1-[分支嵌套]公因數 題目描述 給定 444 個正整數 a,b,c,ka,b,c,ka,b,c,k。如果 a,b,ca,b,ca,b,c 都是 kkk 的倍數&#xff0c;那么稱 kkk 是 a,b,ca,b,ca,b,c 的公因數。否則如果某兩個數都是 kkk 的倍數&#xff0c;那么稱 kkk 是這兩個數的公因數。問 kkk 是哪些數的公因…

C#枚舉/結構體講一講

先展示一段簡單代碼// 定義枚舉 public enum thisday {吃飯,不吃 }// 定義結構體 public struct person {public string name;public int age;public thisday zhuangtai; // 使用枚舉類型作為字段 }static void Main(string[] args) {// 創建結構體實例person thisperson;thisp…

C++-setmap詳解

Cset&map 1. 序列式容器和關聯式容器 1.1 序列式容器 序列式容器按照線性順序存儲元素&#xff0c;元素的位置取決于插入的時間和位置&#xff0c;與元素的值無關。 主要特點&#xff1a;元素按插入順序存儲可以通過位置&#xff08;索引&#xff09;直接訪問元素不自動排序…

解決程序連不上RabbitMQ:Attempting to connect to/access to vhost虛擬主機掛了的排錯與恢復

前言&#xff1a;在分布式系統里&#xff0c;RabbitMQ作為消息中間件&#xff0c;是服務間通信的關鍵紐帶。但實際使用中&#xff0c;程序連接RabbitMQ失敗的情況時有發生。本文結合真實報錯&#xff0c;細致呈現從問題發現到解決的完整排錯思路&#xff0c;還會深入講解Rabbit…

K8S中如何配置PDB(Pod Disruption Budget)

1. PDB 核心概念作用&#xff1a;控制自愿中斷&#xff08;如節點升級、縮容&#xff09;期間&#xff0c;應用的最小可用副本數或最大不可用比例。關鍵參數&#xff1a;minAvailable&#xff1a;必須保持運行的 Pod 數量&#xff08;如 2 或 50%&#xff09;。maxUnavailable&…

從 0 到 1:用 MyCat 打造可水平擴展的 MySQL 分庫分表架構

一、為什么要分庫分表&#xff1f; 單機 MySQL 的極限大致在&#xff1a;維度經驗值單表行數≤ 1 000 萬行&#xff08;B 樹三層&#xff09;單庫磁盤≤ 2 TB&#xff08;SSD&#xff09;單機 QPS≤ 1 萬&#xff08;InnoDB&#xff09;當業務繼續增長&#xff0c;數據量和并發…