主頁 > 後端開發 > 【0基礎學爬蟲】爬蟲基礎之網頁決議庫的使用

【0基礎學爬蟲】爬蟲基礎之網頁決議庫的使用

2023-03-30 19:54:02 後端開發

0

大資料時代,各行各業對資料采集的需求日益增多,網路爬蟲的運用也更為廣泛,越來越多的人開始學習網路爬蟲這項技術,K哥爬蟲此前已經推出不少爬蟲進階、逆向相關文章,為實作從易到難全方位覆寫,特設【0基礎學爬蟲】專欄,幫助小白快速入門爬蟲,本期為網頁決議庫的使用,

概述

前幾期的文章中講到了網路請求庫的使用,我們已經能夠使用各種庫對目標網址發起請求,并獲取回應資訊,本期我們會介紹各網頁決議庫的使用,講解如何決議回應資訊,提取所需資料,

XPath的使用

XPath 是一門在 XML 檔案中查找資訊的語言,XPath 可用來在 XML 檔案中對元素和屬性進行遍歷,同樣,XPath 也支持HTML檔案的決議,

介紹

XPath 使用路徑運算式來匹配HTML檔案中的節點或節點集,路徑運算式基于HTML檔案樹,因此在學習XPath 時需要對網頁結構有一個初步了解,關于網頁結構這些在之前的文章《網頁基本結構》中已經介紹到了,

安裝

使用XPath 需要安裝Python的第三方庫lxml,可以使用命令pip install lxml進行安裝

使用

下文中,我們會通過一個示例來了解xpath的用法,

<div id="box">
    <p name="test">這是一個測驗網頁1</p>
</div>
<p name="test">這是一個測驗網頁2</p>
<div id="city">
    <ul>
        <li id="u1">北京</li>
        <li id="u2">上海</li>
        <li id="u3">廣州</li>
        <li id="u4"><a name="sz" href="https://www.cnblogs.com/ikdl/p/sz.html" target="_self">深圳</a></li>
    </ul>
</div>
<div ><h3>標題</h3></div>
<div ><p>內容1</p></div>
<div ><p>內容2</p></div>
<div ><p>內容3</p></div>

這是一個簡單的網頁body結構,我們想要提取頁面中的資訊,就需要先分析它的結構,理清結構后,撰寫路徑運算式就會更加方便,
1
在前文對xpath的介紹中我們了解到xpath是對XML或HTML檔案進行決議的功能,但在代碼中,示例中的html文本只是一段字串,所以在使用xpath進行匹配前首先要將字串轉成HTML物件,

from lxml import etree

element = '''
    <div id="box">
        <p name="test">這是一個測驗網頁1</p>
    </div>
    <p name="test">這是一個測驗網頁2</p>
    <div id="city">
        <ul>
            <li id="u1">北京</li>
            <li id="u2">上海</li>
            <li id="u3">廣州</li>
            <li id="u4"><a name="sz" href="https://www.cnblogs.com/ikdl/p/sz.html" target="_self">深圳</a></li>
        </ul>
    </div>
    <div ><h3>標題</h3></div>
    <div ><p>內容1</p></div>
    <div ><p>內容2</p></div>
    <div ><p>內容3</p></div>
'''

html = etree.HTML(element)
print(html)
#輸出:<Element html at 0x1b642114388>

將文本轉化為html物件后,就可以使用xpath進行匹配了,

路徑運算式

運算式 描述 示例 示例描述
nodename 選取此節點下的所有子節點 head 獲取當前head節點下的所有子節點
/ 從根節點選取 /html/head 從根節點匹配head節點
// 從任意位置匹配節點 //head 匹配任意head節點
. 選取當前節點
.. 選取當前節點的父節點 //head/.. 匹配head節點的父節點
@ 選取屬性 //div[@id="box"] 匹配任意id值為box的div標簽

選取節點

以示例代碼為例,我們想要匹配所有的li標簽,可以這樣實作:

html.xpath("//li")
#輸出 [<Element li at 0x24c09d3e5c8>, <Element li at 0x24c09d3e588>, <Element li at 0x24c09d3e648>, <Element li at 0x24c09d3e688>]

謂語

獲取id屬性值為box的div標簽資訊

html.xpath('//div[@id="box"]')
#輸出 [<Element div at 0x127672dc688>]

獲取所有class屬性值為article的標簽資訊

html.xpath('//*[@]')
#輸出 [<Element div at 0x2898696e4c8>, <Element div at 0x2898696e588>, <Element div at 0x2898696e5c8>, <Element div at 0x2898696e608>]

獲取所有class屬性值為article的標簽下h3標簽的文本資訊

html.xpath('//*[@]/h3/text()')
#輸出 ['標題']

獲取所有class屬性值為article的標簽下p標簽的文本資訊

html.xpath('//*[@]/p/text()')
#輸出 ['內容1', '內容2', '內容3']

獲取第一個li標簽的文本資訊

html.xpath('//li[1]/text()')
#輸出 ['北京']

獲取最后一個li標簽下的所有文本資訊

html.xpath('//li[last()]//text()')
#輸出 ['深圳']

獲取倒數第二個li標簽下的所有文本資訊

html.xpath('//li[last()-1]//text()')
#輸出 ['廣州']

獲取前兩個li標簽下的文本資訊

html.xpath('//li[position()<3]//text()')
#輸出 ['北京', '上海']

選取多個路徑

html.xpath('//div[@]/h3/text() | //div[@id="box"]/p/text()')
#輸出 ['這是一個測驗網頁1', '標題']

軸可定義相對于當前節點的節點集,

軸名稱 結果
ancestor 選取當前節點的所有先輩(父、祖父等),
ancestor-or-self 選取當前節點的所有先輩(父、祖父等)以及當前節點本身,
attribute 選取當前節點的所有屬性,
child 選取當前節點的所有子元素,
descendant 選取當前節點的所有后代元素(子、孫等),
descendant-or-self 選取當前節點的所有后代元素(子、孫等)以及當前節點本身,
following 選取檔案中當前節點的結束標簽之后的所有節點,
namespace 選取當前節點的所有命名空間節點,
parent 選取當前節點的父節點,
preceding 選取檔案中當前節點的開始標簽之前的所有節點,
preceding-sibling 選取當前節點之前的所有同級節點,
self 選取當前節點,

獲取ul標簽下的子li標簽下的a標簽的href屬性

html.xpath('//ul/child::li/a/@href')
#輸出 ['sz.html']

獲取a標簽的所有先輩div標簽

html.xpath('//a/ancestor::div')
#輸出 [<Element div at 0x23a712de588>]

獲取a標簽的所有屬性

html.xpath('//a/attribute::*')
#輸出 ['sz', 'sz.html', '_self']

獲取id屬性值為u2的li標簽之后的所有p標簽的文本資訊

html.xpath('//li[@id="u2"]/following::p/text()')
#輸出 ['內容1', '內容2', '內容3']

獲取id屬性值為u2的li標簽之前的所有p標簽的文本資訊

html.xpath('//li[@id="u2"]/preceding::p/text()')
#輸出 ['這是一個測驗網頁1', '這是一個測驗網頁2']

獲取id屬性值為u2的li標簽之后的所有同級標簽的文本資訊

html.xpath('//li[@id="u2"]/following-sibling::*/text()')
#輸出 ['廣州']

獲取id屬性值為u3的li標簽之前的所有同級標簽的文本資訊

html.xpath('//li[@id="u2"]/preceding-sibling::*/text()')
#輸出 ['北京']

運算子

獲取id屬性值為u1或者u2的標簽下的文本資訊

html.xpath('//li[@id="u1" or @id="u2"]/text()')
#輸出 ['北京', '上海']

判斷a標簽的name屬性值是否為sz

html.xpath('//a/@name="sz"')
#輸出 True

函式

xpath提供了非常多的內置函式,這些函式可以用于各種值的計算與處理,這里只介紹常用的函式,

獲取所有屬性值包含test的標簽的文本資訊

html.xpath('//*[contains(attribute::*,"test")]/text()')
#輸出 ['這是一個測驗網頁1', '這是一個測驗網頁2']

將id為u1的li標簽和id為u2的li標簽的文本資訊進行拼接

html.xpath('concat(//li[@id="u1"]/text(),//li[@id="u2"]/text())')
#輸出 北京上海

獲取id屬性值以u開頭的所有li標簽的文本資訊

html.xpath('//li[starts-with(@id,"u")]/text()')
#輸出 ['北京', '上海', '廣州']

上文中講到的路徑運算式的寫法只是xpath中比較常用的寫法,基本能夠覆寫大部分需求,xpath路徑也可以通過F12開發者工具直接獲取,在 element 中右鍵需要匹配的節點元素,復制完整xpath即可,復制下來的完整xpath路徑如:/html/body/ul/li[1],這種方法雖然簡單,但實際上路徑并不準確,而且路徑為絕對路徑,相對復雜,所以路徑運算式推薦自己手動撰寫,

BeautifulSoup的使用

BeautifulSoup與上文中介紹的xpath一樣,都是用于決議XML或HTML標簽中的資訊,BeautifulSoup 與 xpath 各有優勢,使用哪個可以憑個人喜好,

安裝

目前流行的 beautifulsoup 版本為beautifulsoup4,下面簡稱bs4,

pip install beautifulsoup4

使用

與 xpath 不同,bs4 需要自己選擇決議器,常用的決議器有:

html.parser:Python內置決議器

lxml HTML:HTML決議器

lxml XML:XML決議器

各決議器之間的區別主要在于檔案決議容錯能力,對于不規范的 HTML 文本,它們的決議結果并不一致,

這里我們推薦使用 lxml 作為決議器,使用 lxml 作為決議器需要提前安裝 lxml 第三方庫,

from bs4 import BeautifulSoup

html = '''
    <div id="box">
        <p name="test">這是一個測驗網頁1</p>
    </div>
    <p name="test">這是一個測驗網頁2</p>
    <div id="city">
        <ul>
            <li id="u1">北京</li>
            <li id="u2">上海</li>
            <li id="u3">廣州</li>
            <li id="u4"><a name="sz" href="https://www.cnblogs.com/ikdl/p/sz.html" target="_self">深圳</a></li>
        </ul>
    </div>
    <div ><h3>標題</h3></div>
    <div ><p>內容1</p></div>
    <div ><p>內容2</p></div>
    <div ><p>內容3</p></div>

'''

soup = BeautifulSoup(html,'lxml')
#回傳完整的html文本

bs4的寫法比較簡潔,更人性化,

soup.body :獲取body資訊
soup.li :獲取第一個li標簽
soup.div :獲取第一個div標簽
soup.li['id'] :獲取第一個li標簽的id屬性值
soup.a.attrs :獲取第一個a標簽的所有屬性值,回傳型別為字典

獲取多個資訊

soup.find_all('li') :獲取所有li標簽
soup.find_all(["p","a"]) :獲取所有p標簽與a標簽
soup.find_all('div','article') :獲取所有類名為article的div標簽
soup.find_all(id="box") :獲取所有id屬性值為box的標簽

節點

soup.ul.parent :獲取ul標簽的父節點
soup.find('a').find_parent("li") :獲取第一個a標簽的父li標簽
soup.find('a').find_parents("li") :獲取第一個a標簽的所有父li標簽
soup.find('li').find_next_siblings("li") :獲取第一個li標簽后的兄弟li標簽
soup.find('li').find_next_sibling("li") :獲取第一個li標簽后的第一個兄弟li標簽
soup.find(attrs={'id':'u4'}).find_previous_siblings("li") :獲取id屬性值為u4的li標簽前的所有兄弟li標簽
soup.find(attrs={'id':'u4'}).find_previous_sibling("li") :獲取id屬性值為u4的li標簽前的第一個兄弟li標簽

CSS選擇器

BeautifulSoup 支持大部分的CSS選擇器,CSS選擇器在之前的文章《網頁基本結構》中做了介紹,

soup.select('div h3') :獲取div下的h3標簽
soup.select('#city #u2') :獲取id屬性值為city的標簽下id值u2的標簽
soup.select('a[href="https://www.cnblogs.com/ikdl/p/sz.html"]') :獲取href屬性值為sz.html的a標簽
soup.select_one(".article") :獲取第一個類名為article的標簽

bs4 作用上與 xpath 基本一致,但是 bs4 的優勢就在于陳述句的簡潔性,用bs4匹配資料比 xpath 稍微簡單一些,但是它在性能上比 xpath 要稍弱,

re正則運算式的使用

正則運算式(Regular Expression,通常簡寫為“regex”或“regexp”)是一種用來匹配文本字串的模式,在編程和文本處理中,正則運算式通常被用來進行字串匹配、搜索、替換等操作,

實際開發中,我們會對一些非結構化資料進行決議,對于這類資料,無論是 xpath 還是 BeautifulSoup 都無法進行決議,這時我們就需要用到正則運算式,正則運算式的強大在于它能夠匹配任意型別的文本資料,可以幫助開發者快速的處理文本資料,

安裝

Python 中內置了 re 庫,無需額外安裝

使用

模式 描述
\w 匹配字母數字及下劃線
\W 匹配非字母數字及下劃線
\s 匹配任意空白字符,等價于[\t\n\r\f]
\S 匹配任意非空白字符
\d 匹配任意數字,等價于[0-9]
\D 匹配任意非數字的字符
\A 匹配字串的開頭
\Z 匹配字串的結尾,如存在換行,只匹配到換行前的結束字串
\z 匹配字串的結尾,如存在換行,會匹配換行符
^ 匹配字串的開頭
$ 匹配字串的結尾
. 匹配任意字符,除換行符,當re.DOTALL被指定時可以匹配包括換行符的任意字符
[...] 匹配一組字符,如[abc],匹配a,b,c
[^...] 匹配不在[]中的字符
* 匹配0或多個運算式
+ 匹配1或多個運算式
? 對它前面的正則式匹配0到1次
匹配n個之前的正則運算式
對運算式進行n到m次匹配,盡量取最多
a|b 匹配a或b
() 匹配括號內的任意運算式

compile函式

re.compile 可以將正則運算式樣式的字串編譯為一個正則運算式物件,可以通過這個物件來呼叫下述方法,

pattern = re.compile("\d")

match函式

re.match 會從字串的起始位置進行匹配正則運算式,匹配成功后會回傳匹配成功的結果,匹配失敗則回傳None,

import re
#匹配字符a
pattern = re.compile("a") 
#從字串開頭開始匹配
print(pattern.match("cat")) 
#從下標為1的位置開始匹配
print(pattern.match("cat",1)) 

運行結果:

None
<re.Match object; span=(1, 2), match='a'>

運算式匹配:

#以hello開頭中間為數字后面是World的字串
pattern = re.compile("^hello\s(\d+)\sWorld") 
print(pattern.match("hello 123 World!!!")) 

運行結果:

<re.Match object; span=(0, 15), match='hello 123 World'>

可以看到,兩次的運行結果都是一個物件,可以使用group()方法獲取匹配到的文本資訊,

pattern = re.compile("^hello\s(\d+)\sWorld")
result = pattern.match("hello 123 World!!!")
print(result.group())
print(result.group(1))

運行結果:

hello 123 World
123

group(1)會回傳第一個被括號包圍的匹配結果,示例中被括號包圍的是\d+,所以輸出的結果為123,

Search函式

match函式是從字串的開頭開始匹配,想要從其它地方開始匹配需要自己傳入位置,用這種方法匹配資料局限性很大,我們想要從任意位置開始匹配資料可以使用 re.search 函式,

pattern = re.compile("(\d+)")
result = pattern.search("hello 123 World321!!!")
print(result)
print(result.group(1))

運行結果:

<re.Match object; span=(6, 9), match='123'>
123

可以看到,使用 search 方法我們無需指定位置,它會搜尋整個字串,回傳第一個匹配成功的結果,

findall函式

search 函式可以從任意位置進行匹配,但是它只會回傳第一個匹配成功的結果,我們想要獲取所有匹配成功的結果就需要用到 findall 函式,

pattern = re.compile("(\d+)")
result = pattern.findall("hello 123 World321!!!")
print(result)

運行結果:

['123', '321']

findall 函式會回傳一個串列,因此 findall 函式回傳的結果無法使用 group 方法,

通用匹配

在實際開發中,我們往往會遇到非常復雜的文本結構如:

"hello 123 this is a 999Regex Demo!!!World321"

這時如果使用\w,\s進行匹配會顯得非常復雜,這時我們就可以使用一個通配組合.*,上文中介紹到了.是匹配任意字符,*是匹配0或多個運算式,.*搭配在一起就是匹配任意多個字符,使用.*可以簡單有效的進行資料匹配,

#匹配hello World之間的資訊
pattern = re.compile("hello(.*)World")
result = pattern.findall("hello123 World this is a 999Regex Demo!!!World321")
print(result)

運行結果:

['123 World this is a 999Regex Demo!!!']

這里我們可以看到,使用.*后它匹配到了第一個 hello 到最后一個 World 之間的所有文本,但如果我們想要匹配 hello 到第一個 world 之間的資訊呢,這時我們就需要了解一下貪婪匹配與非貪婪匹配,

貪婪與非貪婪

顧名思義,貪婪模式表示盡可能多的匹配,非貪婪模式表示盡可能少的匹配,從上文的示例我們可以看到re.compile("hello(.*)World")它會從 hello 開始,匹配到最后一個 World,這顯然就是貪婪模式,它會盡可能多的匹配,也就是匹配到最后一個符合規則的位置,正則運算式中,非貪婪模式需要使用到?,前文中講到了?是匹配0到1次,使用?就能實作盡可能少的匹配,

#匹配hello World之間的資訊(非貪婪)
pattern = re.compile("hello(.*?)World")
result = pattern.findall("hello123 World this is a 999Regex Demo!!!World321")
print(result)

運行結果:

['123 ']

可以看到使用.*?后,正則運算式只匹配到第一個 World 就停下了,這樣就實作了非貪婪匹配,

Newspaper智能決議庫的使用

Newspaper 是 Python 的第三方庫,主要用于抓取新聞網頁,它能夠自動決議網頁內容,匹配出新聞的各種資訊,而且操作簡單,非常容易上手,但是它并不適用于實際開發,因為它不夠穩定,存在各種問題,無法應對爬蟲開發中可能遇到的問題,如反爬蟲等,所以這里對它只做介紹,

安裝

命令列安裝:pip install newspaper3k

使用

它的使用非常簡單,傳入目標網址后,呼叫 download() 方法下載網頁源代碼,使用 parse() 方法決議原始碼,

from newspaper import Article
# 目標新聞網址
url = 'https://目標文章'
news = Article(url, language='zh')
news.download()
news.parse()
#獲取新聞網頁原始碼
print(news.html)
#獲取新聞標題
print(news.title)
#獲取新聞正文
print(news.text)
#獲取新聞作者
print(news.authors)
#獲取新聞發布時間
print(news.publish_date)
#獲取新聞關鍵詞
print(news.keywords)
#獲取新聞摘要
print(news.summary)
#獲取新聞配圖地址
print(news.top_image)
#獲取新聞視頻地址
print(news.movies)

Newspaper 可以與 requests 配合使用,通過 requests 獲取原始碼,由 Newspaper 進行決議提取,Newspaper 庫并不能完美的決議出各種資訊,適合非專業人士使用,

總結

上文中,講到了四個爬蟲決議庫的使用,其中 xpath 與 beautifulSoup 主要用于對 html 文本的決議,正則運算式主要用于對非結構化文本的決議,無法用 xpath 和 beautifulSoup 決議的文本資訊通常會使用正則來進行匹配,Newspaper 是智能決議庫,使用它可以自動決議新聞資訊,無需自己撰寫運算式,但是缺點也很明顯 ,

與網路請求庫一樣,網頁決議庫的使用是每一個爬蟲初學者都應該牢牢掌握的知識點,能夠熟練的使用決議庫才能更好的完成資料采集作業,

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/548703.html

標籤:Python

上一篇:PyQt5學習 (5)--QPushButton、QCommandLinkButton

下一篇:【驗證碼逆向專欄】極驗三代、四代點選類驗證碼逆向分析

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more