亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

 更新時間:2024年01月28日 11:24:31   作者:過去日記  
GoQuery是專為Go語言設(shè)計的一個強大的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ù)存儲下來進行進一步處理和分析。
爬蟲在我們生活中可以產(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)站獲取最新的文章標題、摘要以及鏈接,為用戶提供一站式的新聞閱讀體驗。

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

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

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

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

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

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

goquery介紹

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

GoQuery主要用于網(wǎng)頁抓取(Web Scraping),能夠通過CSS選擇器來定位、遍歷和操作HTML元素。你可以使用它來提取網(wǎng)頁中的特定數(shù)據(jù)、修改DOM結(jié)構(gòu)或進行其他與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 : 擴展函數(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) //返回字符串數(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)的標簽屬性。這個可以設(shè)置第二個參數(shù)。獲取的默認值,如果獲取不到默認調(diào)用對應(yīng)默認值
AddClass(), HasClass(), RemoveClass(), ToggleClass()
Html() //獲取該節(jié)點的html
Length() //返回該Selection的元素個數(shù)
Size() //Length()的別名
Text() //獲取該節(jié)點的文本值

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

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

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

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

Children...() //返回selection中各個節(jié)點下的孩子節(jié)點
Contents() //獲取當前節(jié)點下的所有節(jié)點
Find...() //查找獲取當前匹配的元素
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選擇器進行查找: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文檔進行各種復(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選擇器在當前選區(qū)(Selection)中查找匹配的元素。例如,doc.Find(“h1”)會找到所有

標簽。

Filter():

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

Eq():

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

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

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

Children():

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

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

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

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

獲取主頁中的文章鏈接

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

在這里插入圖片描述

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

這里我們采用層次原則器 ancestor descendant:匹配在ancestor元素內(nèi)的所有descendant元素(無論嵌套多深)。把文章盒子提取來之后我們還需要通過Each方法遍歷輸出a標簽中的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即可
  • 沒有進行請求偽裝,隨時可能被封

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

相關(guān)文章

  • 舉例講解Go語言中函數(shù)的閉包使用

    舉例講解Go語言中函數(shù)的閉包使用

    這篇文章主要介紹了Go語言中函數(shù)的閉包使用示例,函數(shù)閉包closure是編程語言中十分重要的特性,需要的朋友可以參考下
    2016-03-03
  • golang模擬實現(xiàn)帶超時的信號量示例代碼

    golang模擬實現(xiàn)帶超時的信號量示例代碼

    這篇文章主要給大家介紹了關(guān)于golang模擬實現(xiàn)帶超時的信號量的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面跟著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-09-09
  • 使用Go HTTP客戶端打造高性能服務(wù)

    使用Go HTTP客戶端打造高性能服務(wù)

    大多數(shù)語言都有提供各自的 HTTP 客戶端,本文將動手實踐如何使用Go語言發(fā)起HTTP請求,并討論其中有可能遇到的問題。具有一定的參考價值,感興趣的可以了解一下
    2021-12-12
  • Go語言常用的打log方式詳解

    Go語言常用的打log方式詳解

    Golang的log包短小精悍,可以非常輕松的實現(xiàn)日志打印轉(zhuǎn)存功能,下面這篇文章主要給大家介紹了關(guān)于Go語言常用的打log方式的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-10-10
  • Go的gin參數(shù)校驗中的validator庫詳解

    Go的gin參數(shù)校驗中的validator庫詳解

    這篇文章主要介紹了Go的gin參數(shù)校驗之validator庫,使用 validator 以后,只需要在定義結(jié)構(gòu)體時使用 binding 或 validate tag標識相關(guān)校驗規(guī)則,就可以進行參數(shù)校驗了,而不用自己單獨去寫常見的校驗規(guī)則,需要的朋友可以參考下
    2023-08-08
  • GoFrame框架Scan類型轉(zhuǎn)換實例

    GoFrame框架Scan類型轉(zhuǎn)換實例

    這篇文章主要為大家介紹了GoFrame框架Scan類型轉(zhuǎn)換的實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • GOLANG版的冒泡排序和快速排序分享

    GOLANG版的冒泡排序和快速排序分享

    這篇文章主要介紹了GOLANG版的冒泡排序和快速排序分享,需要的朋友可以參考下
    2015-03-03
  • Golang使用gin模板渲染base64圖片出現(xiàn)#ZgotmplZ的解決辦法

    Golang使用gin模板渲染base64圖片出現(xiàn)#ZgotmplZ的解決辦法

    這篇文章主要介紹了Golang使用gin模板渲染base64圖片出現(xiàn)#ZgotmplZ的的場景復(fù)現(xiàn)和解決辦法,文中通過代碼示例講解的非常詳細,對大家解決問題有一定的幫助,需要的朋友可以參考下
    2024-05-05
  • Go語言并發(fā)之原子操作詳解

    Go語言并發(fā)之原子操作詳解

    代碼中的加鎖操作因為涉及內(nèi)核態(tài)的上下文切換會比較耗時、代價比較高。針對基本數(shù)據(jù)類型我們還可以使用原子操作來保證并發(fā)安全,本文就來和大家詳細聊聊,需要的可以參考下
    2022-12-12
  • Go REFLECT Library反射類型詳解

    Go REFLECT Library反射類型詳解

    這篇文章主要為大家介紹了Go REFLECT Library反射類型詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08

最新評論