最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

go?語言爬蟲庫goquery的具體使用

 更新時間:2024年01月28日 11:24:31   作者:過去日記  
GoQuery是專為Go語言設(shè)計的一個強(qiáng)大的HTML解析和查詢庫,本文主要介紹了go語言爬蟲庫goquery的具體使用,具有一定的參考價值,感興趣的可以了解一下

爬蟲介紹

爬蟲,又稱網(wǎng)頁抓取、網(wǎng)絡(luò)蜘蛛或網(wǎng)絡(luò)爬蟲,是一種自動瀏覽互聯(lián)網(wǎng)并從網(wǎng)站上獲取信息的程序或腳本。它通過模擬人類瀏覽器的行為,按照預(yù)設(shè)的規(guī)則和策略遍歷互聯(lián)網(wǎng)上的網(wǎng)頁,并將所獲取的數(shù)據(jù)存儲下來進(jìn)行進(jìn)一步處理和分析。
爬蟲在我們生活中可以產(chǎn)生的東西有很多

  • 搜索引擎索引構(gòu)建:搜索引擎會使用爬蟲抓取互聯(lián)網(wǎng)上的網(wǎng)頁,分析其內(nèi)容并建立索引,以便用戶在搜索時能夠快速找到相關(guān)結(jié)果。

  • 數(shù)據(jù)分析與研究:數(shù)據(jù)分析師和研究人員可以編寫爬蟲來收集特定領(lǐng)域的信息,如電子商務(wù)網(wǎng)站的商品價格、評論等,用于市場趨勢分析、競品監(jiān)測、消費者行為研究等。

  • 新聞聚合:新聞聚合類應(yīng)用通過爬蟲從多個新聞網(wǎng)站獲取最新的文章標(biāo)題、摘要以及鏈接,為用戶提供一站式的新聞閱讀體驗。

  • 社交媒體監(jiān)控:針對社交媒體平臺的爬蟲可以抓取公開的帖子、評論等內(nèi)容,用于輿情分析、熱點話題追蹤、品牌口碑監(jiān)測等。

  • 企業(yè)信息抓?。荷虡I(yè)情報機(jī)構(gòu)或公司可能需要抓取工商注冊、專利申請、招聘信息等公開的企業(yè)數(shù)據(jù),進(jìn)行行業(yè)分析、潛在客戶挖掘等工作。

  • 教育資源整理:教育領(lǐng)域中,爬蟲可以用來搜集網(wǎng)絡(luò)課程資源、學(xué)術(shù)論文、圖書資料等,并進(jìn)行整理歸類。

  • 網(wǎng)站性能檢測:某些類型的爬蟲(例如蜘蛛俠)用于模擬大量用戶訪問以測試網(wǎng)站性能,檢查是否存在服務(wù)器響應(yīng)延遲、頁面加載慢等問題。

  • 法律合規(guī)審計:在網(wǎng)絡(luò)合規(guī)性審查中,爬蟲可以用于查找非法或侵權(quán)內(nèi)容,協(xié)助監(jiān)管部門進(jìn)行網(wǎng)絡(luò)環(huán)境凈化。

在生活中爬蟲其實可以做很多事情,鑒于本文是一個入門教程,就接下來會以一個爬取csdn網(wǎng)頁增加流量的列子逐步介紹和完善我們的爬蟲程序。

goquery介紹

GoQuery是專為Go(Golang)語言設(shè)計的一個強(qiáng)大的HTML解析和查詢庫。它模仿了jQuery的API風(fēng)格,使得在Go中處理HTML文檔變得簡單且直觀。

GoQuery主要用于網(wǎng)頁抓取(Web Scraping),能夠通過CSS選擇器來定位、遍歷和操作HTML元素。你可以使用它來提取網(wǎng)頁中的特定數(shù)據(jù)、修改DOM結(jié)構(gòu)或進(jìn)行其他與HTML文檔相關(guān)的操作。

安裝

go get github.com/PuerkitoBio/goquery

創(chuàng)建文檔

doc,err := goquery.NewDocumentFromReader(reader io.Reader)
doc,err := goquery.NewDocument(url string)
doc,err := goquery.NewDocument(strings.NewReader("<p>這里是內(nèi)容</p>")

內(nèi)置函數(shù)

1) array.go : 類似數(shù)組的定位函數(shù)

Eq(index int) *Selection //根據(jù)索引獲取某個節(jié)點集
First() *Selection //獲取第一個子節(jié)點集
Get(index int) *html.Node //根據(jù)索引獲取一個節(jié)點
Index...() int //返回選擇對象中第一個元素的位置
Last() *Selection //獲取最后一個子節(jié)點集
Slice(start, end int) *Selection //根據(jù)起始位置獲取子節(jié)點集

2)expand.go : 擴(kuò)展函數(shù)

Add...()
AndSelf()
Union() // AddSelection()的別名

3)filter.go : 過濾函數(shù), 用于減少選擇范圍

End()
Filter...()
Has...()
Intersection() //FilterSelection()的別名
Not...()

4)iteration.go : 循環(huán)遍歷選擇節(jié)點的函數(shù)

Each(f func(int, *Selection)) *Selection //遍歷
EachWithBreak(f func(int, *Selection) bool) *Selection //可中斷遍歷
Map(f func(int, *Selection) string) (result []string) //返回字符串?dāng)?shù)組

5)manipulation.go : 修改文檔的函數(shù)

After...()
Append...()
Before...()
Clone()
Empty()
Prepend...()
Remove...()
ReplaceWith...()
Unwrap()
Wrap...()
WrapAll...()
WrapInner...()

6)property.go :檢測或獲取節(jié)點屬性值的函數(shù)

Attr*(), RemoveAttr(), SetAttr() //獲取,移除,設(shè)置屬性的值
AttrOr(e string,d string) //獲取對應(yīng)的標(biāo)簽屬性。這個可以設(shè)置第二個參數(shù)。獲取的默認(rèn)值,如果獲取不到默認(rèn)調(diào)用對應(yīng)默認(rèn)值
AddClass(), HasClass(), RemoveClass(), ToggleClass()
Html() //獲取該節(jié)點的html
Length() //返回該Selection的元素個數(shù)
Size() //Length()的別名
Text() //獲取該節(jié)點的文本值

7)query.go : 節(jié)點查找的函數(shù)

Contains() //獲取當(dāng)前節(jié)點下的所有節(jié)點
Is...()

8)traversal.go : 遍歷HTML文檔樹的函數(shù)

在文檔樹之間來回跳轉(zhuǎn)(常用的查找節(jié)點方法)

Children...() //返回selection中各個節(jié)點下的孩子節(jié)點
Contents() //獲取當(dāng)前節(jié)點下的所有節(jié)點
Find...() //查找獲取當(dāng)前匹配的元素
Next...() *Selection //獲取下一個兄弟節(jié)點集,下一個元素
NextAll() *Selection //獲取后面所有兄弟節(jié)點集
Parent[s]...()
Prev...() *Selection //前一個兄弟節(jié)點集,上一個元素
Siblings...()

9)type.go : goQuery定義的類型

Document
Selection
Matcher

10)utilities.go : 輔助函數(shù)的定義(而不是* Selection上的方法),jQuery沒有該部分,但對goquery很有用

NodeName
OuterHtml

利用NewDocumentFromReader方法獲取主頁信息

NewDocumentFromReader 是GoQuery庫中的一個函數(shù),用于從io.Reader接口讀取的HTML數(shù)據(jù)創(chuàng)建一個新的文檔對象。對于文檔對象是什么我們會在下文經(jīng)性講解。
func NewDocumentFromReader(reader io.Reader) (*Document, error)

以下我們查找主頁信息的代碼,studycodeday是博主本人的主頁,想要訪問自己的主頁,只需要把studycodeday改成自己的用戶id就行。

func main() {
	// 通過http發(fā)送get請求
	req, err := http.Get("https://blog.csdn.net/studycodeday")
	if err != nil {
		slog.Error("訪問主頁失敗")
	}
	defer req.Body.Close()
	// 解析請求體
	doc, err := goquery.NewDocumentFromReader(req.Body)
	// 讓請求體按照html格式輸出,也有Text()按照文本輸出的方法
	fmt.Println(doc.Html())
}

效果

在這里插入圖片描述

Document介紹

在GoQuery庫中,Document是代表整個HTML文檔的對象。它是對原始HTML內(nèi)容解析后形成的DOM樹的抽象表示,提供了與jQuery類似的接口來操作和查詢HTML元素。

*goquery.Document主要有以下特點和功能:

  • 初始化:
    從本地文件或io.Reader讀?。菏褂胓oquery.NewDocumentFromReader(reader io.Reader)從任何實現(xiàn)了io.Reader接口的對象(如文件、HTTP響應(yīng)體等)創(chuàng)建一個Document對象。
  • 查找元素:
    使用CSS選擇器進(jìn)行查找:doc.Find(selector string)返回一個新的Selection對象,該對象包含了所有匹配給定CSS選擇器的元素。
  • 遍歷和操作元素:
    Each(func(int, *goquery.Selection))方法用于迭代選區(qū)中的每個元素,并對其執(zhí)行回調(diào)函數(shù)。
    提供了類似jQuery的方法,如.Children()獲取子元素、.Parents()獲取父元素等。
  • 屬性操作:
    Attr(name string) (string, bool):獲取首個匹配元素的指定屬性值及其是否存在。
    SetAttr(name, value string):為所有匹配元素設(shè)置指定屬性的值。
  • 文本和HTML內(nèi)容操作:
    Text() string:獲取所有匹配元素的合并文本內(nèi)容。
    Html() string:獲取首個匹配元素的HTML內(nèi)容。
    其他功能:

goquery.Document對象是GoQuery庫的核心組成部分,它封裝了對HTML文檔進(jìn)行各種復(fù)雜查詢和操作的能力。

通過查詢獲取文章信息

css選擇器介紹

獲取文章需要我們通過查詢的方式,goquery提供了能夠通過CSS選擇器來定位元素。
其類型包括但不限于以下幾種:

  • 基本選擇器:
  • *:匹配所有元素。
  • element:匹配所有指定類型的元素,如 div、span 等。
  • .class:匹配具有指定類名的元素,如 .myClass。
  • #id:匹配ID為指定值的元素,如 #header。
  • 屬性選擇器:
  • [attribute]:匹配具有指定屬性的元素,不論該屬性值為何。
  • [attribute=value]:匹配屬性值等于指定值的元素,如 [href=“http://example.com”]。
  • [attribute^=value]、[attribute$=value]、[attribute*=value]:分別匹配屬性值以指定值開頭、結(jié)尾或包含指定值的元素。
  • 層次選擇器:
  • parent > child:匹配作為指定父元素直接子元素的所有child元素。
  • ancestor descendant:匹配在ancestor元素內(nèi)的所有descendant元素(無論嵌套多深)。
  • prev + next:匹配緊跟在prev元素之后的next元素。
  • prev ~ siblings:匹配prev元素之后的所有同輩siblings元素。
  • 偽類選擇器:
  • :first-child、:last-child、:nth-child(n):匹配某個元素在其父元素內(nèi)是第一個、最后一個或第n個子元素的情況。
  • :not(selector):排除匹配給定選擇器的元素。

goquery中的選擇器

Find():doc.Find(selector string)根據(jù)給定的CSS選擇器在當(dāng)前選區(qū)(Selection)中查找匹配的元素。例如,doc.Find(“h1”)會找到所有

標(biāo)簽。

Filter():

selection.Filter(selector string)在當(dāng)前選區(qū)中過濾出符合指定CSS選擇器的元素子集。

Eq():

selection.Eq(index int)返回當(dāng)前選區(qū)中索引為index的單個元素。索引從0開始。

First() 和 Last():selection.First()selection.Last()分別返回當(dāng)前選區(qū)中的第一個或最后一個元素。

Next() 和 Prev():selection.NextAll()selection.PrevAll()獲取當(dāng)前元素之后的所有同輩元素或之前的所有同輩元素。

Children():

selection.Children()獲取當(dāng)前選區(qū)中所有直接子元素。

Parents() 和 Closest():selection.Parents()selection.Closest(selector string)Parents()返回當(dāng)前選區(qū)中所有父級元素,而Closest()返回最近的且匹配給定CSS選擇器的祖先元素。

Attr():attr, exists := selection.Attr(attributeName string)獲取當(dāng)前選區(qū)中首個元素的屬性值,exists用于判斷該屬性是否存在。

Each():selection.Each(func(i int, s *goquery.Selection) {})遍歷當(dāng)前選區(qū)中的每一個元素,并對每個元素執(zhí)行一個函數(shù)。

獲取主頁中的文章鏈接

首先我們要打開f12調(diào)試工具,找到我們需要爬取數(shù)據(jù)的所在的具體位置。

在這里插入圖片描述

由上圖可知我們的文章連接在擁有class=“mainContent” 的div盒子里,這個盒子包括了二十個含有 class=“blog-list-box” 的article標(biāo)簽,我們所需要的內(nèi)容就在article標(biāo)簽下面的a標(biāo)簽的herf中。

這里我們采用層次原則器 ancestor descendant:匹配在ancestor元素內(nèi)的所有descendant元素(無論嵌套多深)。把文章盒子提取來之后我們還需要通過Each方法遍歷輸出a標(biāo)簽中的href屬性的值

	// 通過http發(fā)送get請求
	req, err := http.Get("https://blog.csdn.net/studycodeday")
	if err != nil {
		slog.Error("訪問主頁失敗")
	}
	defer req.Body.Close()
	// 解析請求體
	doc, err := goquery.NewDocumentFromReader(req.Body)
	//fmt.Println(doc.Find(".mainContent .blog-list-box").Length())
	doc.Find(".mainContent .blog-list-box").Each(func(i int, s *goquery.Selection) {
		fmt.Println(s.Find("a").Attr("href"))
	})

效果在這里插入圖片描述

爬取

以上我們就完成了主頁文章信息的爬取,我們只需要吧內(nèi)容存在數(shù)組中,經(jīng)行爬取訪問即可。
代碼

func main() {
	var urls = make([]string, 0, 20)
	// 通過http發(fā)送get請求
	req, err := http.Get("https://blog.csdn.net/studycodeday")
	if err != nil {
		slog.Error("訪問主頁失敗")
	}
	defer req.Body.Close()
	// 解析請求體
	doc, err := goquery.NewDocumentFromReader(req.Body)
	//fmt.Println(doc.Find(".mainContent .blog-list-box").Length())
	doc.Find(".mainContent .blog-list-box").Each(func(i int, s *goquery.Selection) {
		url, _ := s.Find("a").Attr("href")
		//添加到數(shù)組中
		urls = append(urls, url)
	})
	for _, url := range urls {
		_, err = http.Get(url)
		if err != nil {
			slog.Error("訪問網(wǎng)頁失?。? + url)
		}
		fmt.Println("訪問成功:" + url)
		time.Sleep(time.Duration(rand.Int31n(60)) * time.Second)
	}
}

效果

在這里插入圖片描述

總結(jié)

雖然我們實現(xiàn)了爬取csdn網(wǎng)頁,但是仍然存在許多問題:

  • 沒有代理頻繁訪問容易封ip,造成無法訪問csdn
  • 爬取只能爬取前二十篇文章,該解決方法是參考該api,只需要把username改成自己的id即可
  • 沒有進(jìn)行請求偽裝,隨時可能被封

到此這篇關(guān)于go 語言爬蟲庫goquery的具體使用的文章就介紹到這了,更多相關(guān)go 語言爬蟲庫goquery 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

  • golang連接MongoDB數(shù)據(jù)庫及數(shù)據(jù)庫操作指南

    golang連接MongoDB數(shù)據(jù)庫及數(shù)據(jù)庫操作指南

    MongoDB是Nosql中常用的一種數(shù)據(jù)庫,下面這篇文章主要給大家介紹了關(guān)于golang連接MongoDB數(shù)據(jù)庫及數(shù)據(jù)庫操作的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-09-09
  • Swaggo零基礎(chǔ)入門教程

    Swaggo零基礎(chǔ)入門教程

    swagger是一套基于OpenAPI規(guī)范構(gòu)建的開源工具,使用RestApi。swagger-ui呈現(xiàn)出來的是一份可交互式的API文檔,可以直接在文檔頁面嘗試API的調(diào)用
    2023-01-01
  • Golang中拼接字符串的6種方式性能對比

    Golang中拼接字符串的6種方式性能對比

    golang的string類型是不可修改的,對于拼接字符串來說,本質(zhì)上還是創(chuàng)建一個新的對象將數(shù)據(jù)放進(jìn)去,主要有6種拼接方式,下面小編就來為大家詳細(xì)講講吧
    2025-03-03
  • go項目中環(huán)境變量的配置

    go項目中環(huán)境變量的配置

    本文主要介紹了go項目中環(huán)境變量的配置,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-07-07
  • Go語言封裝MinIO相關(guān)操作詳解

    Go語言封裝MinIO相關(guān)操作詳解

    MinIO?是一個高性能的對象存儲服務(wù),兼容?Amazon?S3?API,廣泛用于存儲和管理海量數(shù)據(jù),本文將介紹如何用?Go?語言封裝一個簡單的?MinIO?操作包,需要的可以參考下
    2024-11-11
  • Go語言中interface語法與使用詳解

    Go語言中interface語法與使用詳解

    Go語言里面設(shè)計最精妙的應(yīng)該算interface,它讓面向?qū)ο?內(nèi)容組織實現(xiàn)非常的方便,下面這篇文章主要給大家介紹了關(guān)于Go語言中interface語法與使用的相關(guān)資料,需要的朋友可以參考下
    2022-07-07
  • 詳解Go語言如何實現(xiàn)二叉樹遍歷

    詳解Go語言如何實現(xiàn)二叉樹遍歷

    這篇文章主要為大家詳解介紹了Go語言中如何實現(xiàn)二叉樹遍歷,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)Go語言有一定幫助,需要的可以參考一下
    2022-04-04
  • golang?墻上時鐘與單調(diào)時鐘的實現(xiàn)

    golang?墻上時鐘與單調(diào)時鐘的實現(xiàn)

    本文主要介紹了golang?墻上時鐘與單調(diào)時鐘的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • Go使用WebSocket實現(xiàn)一個公域聊天室

    Go使用WebSocket實現(xiàn)一個公域聊天室

    公域聊天室是一種實時通信服務(wù),所有用戶連接到同一個公共房間,本文下面就介紹一下Go使用WebSocket實現(xiàn)一個公域聊天室,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2026-03-03
  • go語言調(diào)用其他包中的函數(shù)簡單示例

    go語言調(diào)用其他包中的函數(shù)簡單示例

    這篇文章主要給大家介紹了關(guān)于go語言調(diào)用其他包中的函數(shù)的相關(guān)資料,文中還介紹了Go語言同一個包中不同文件之間函數(shù)調(diào)用的相關(guān)問題,需要的朋友可以參考下
    2023-01-01

最新評論

浮梁县| 五河县| 赤城县| 罗田县| 来凤县| 武川县| 新营市| 比如县| 田林县| 班玛县| 孙吴县| 泌阳县| 托克逊县| 陇西县| 博野县| 保康县| 施秉县| 涟水县| 海伦市| 惠安县| 昌乐县| 上饶市| 佛学| 霞浦县| 合肥市| 阿拉尔市| 隆化县| 桑日县| 息烽县| 舒城县| 讷河市| 武定县| 沈丘县| 山东| 临高县| 宁远县| 福州市| 岗巴县| 永川市| 伊春市| 皋兰县|