goquery 是用 Go 语言编写的一个类似于 jQuery 的库。它基于 HTML 解析库 net/html 和 CSS 库 cascadia ,提供与 jQuery 相近的接口。 Go 著名的爬虫框架 colly 就是基于 goquery 而实现的。 安装 go get github.com/PuerkitoBio/goquery 简单使用 以百度搜索关键词 goquery 为例: func main() { // Request the HTML wd=goquery") if err ! wd=goquery") if err !
创建目录并初始化: $ mkdir goquery && cd goquery $ go mod init github.com/darjun/go-daily-lib/goquery 安装goquery Find方法返回一个*goquery.Selection对象。 为此,goquery 在方法命名上做了一些约定: jQuery 中可以不带参数调用的函数,在 goquery 也就是相同的名字,例如Prev()。 接受一个字符串选择器参数的版本在 goquery 中命名为XxxFiltered(),例如PrevFiltered(); jQuery 只接受一个参数的函数,在 goquery 有相同的名字,例如Is( 了解 jQuery 的童鞋,熟悉了上面的约定后,使用 goquery 基本就没有什么问题了。 编码 由于 net/html 要求使用 UTF-8 编码,goquery 也是如此。
图片概述在本文中,我们将介绍如何使用Go语言和GoQuery库实现一个简单的爬虫程序,用于抓取头条新闻的网页内容。我们还将使用爬虫代理服务,提高爬虫程序的性能和安全性。 正文GoQuery简介GoQuery是一个Go语言的库,用于解析和操作HTML文档。它提供了类似于jQuery的API,让我们可以方便地查询和处理网页元素。 GoQuery可以从本地文件、字符串或者网络请求中加载HTML文档,并返回一个文档对象。我们可以使用选择器、过滤器、遍历器等方法来操作文档对象中的节点。 我们将使用Go语言和GoQuery库来实现这个功能。我们还将使用爬虫代理服务来获取代理IP,并使用多线程技术来提高采集效率。 使用GoQuery从响应中加载HTML文档,并返回一个文档对象。使用选择器从文档对象中找到所有包含新闻信息的节点,并遍历每个节点。
"net/url" "io/ioutil" "os" "log" "runtime" "flag" "github.com/PuerkitoBio/goquery fmt.Println("count:", count) } fmt.Println("crawl end") } func getListUrl(){ doc, err := goquery.NewDocument fmt.Println("err:", err) os.Exit(1) } doc.Find(".picbox").Each(func(i int, s *goquery.Selection (list_url) doc.Find(".pages ul li").Each(func(i int, s *goquery.Selection){ text := s.Find (img_list_url) doc.Find("#big-pic p a").Each(func(i int, s *goquery.Selection){ img_url
最近研究Go爬虫相关的知识,使用到goquery这个库比较多,尤其是对爬取到的HTML进行选择和查找匹配的内容时,goquery的选择器使用尤其多,而且还有很多不常用但又很有用的选择器,这里总结下,以供参考 如果大家以前做过前端开发,对jquery不会陌生,goquery类似jquery,它是jquery的go版本实现。使用它,可以很方便的对HTML进行处理。 =nil{ log.Fatalln(err) } dom.Find("div[class]").Each(func(i int, selection *goquery.Selection) { 有办法的,goquery考虑到了,只需要把大于号(>)改为空格就好了。比如上面的例子,改为如下选择器即可。 fmt.Println(selection.Html()) }) } 小结 goquery 是解析HTML网页必备的利器,在爬虫抓取网页的过程中,灵活的使用goquery不同的选择器,可以让我们的抓取工作事半功倍
:HTML解析利器 goquery提供类似jQuery的API,让HTML解析变得轻松。 (resp.Body) doc.Find(".article").Each(func(i int, s *goquery.Selection) { title := s.Find goquery:适合需要对HTML进行复杂查询或修改的场景,jQuery风格API让DOM操作简单直观。 实际项目中,这些框架往往组合使用:用Colly爬取列表页,用chromedp处理详情页,用goquery解析复杂HTML结构。 Colly的优雅设计、goquery的灵活查询、chromedp的强大能力,构成了完整的爬虫工具链。 选择合适的框架,遵循爬虫礼仪,合理控制请求频率,就能构建出高效、稳定的爬虫系统。
由于 GitHub 没有提供官方的 Trending API,我们用goquery自己实现了一个。上篇文章由于篇幅关系,没有介绍如何实现。本文我整理了一下代码,并以单独的代码库形式开放出来。 Find()方法返回一个*goquery.Selection对象,我们可以调用其Each()方法对每个条目进行解析。 Each()接收一个func(int, *goquery.Selection)类型的函数,第二个参数即为每个仓库条目在 goquery 中的结构: doc.Find(".Box .Box-row").Each (func(i int, s *goquery.Selection) { }) 接下来我们看看如何提取各个部分。 使用goquery有一点需要注意,因为网页层级结构比较复杂,我们使用选择器的时候尽量多限定一些元素、class,以确保找到的确实是我们想要的那个结构。
刚接触golang爬虫,今天写了一个很简单的爬虫,就是使用2个库,一个http、goquery 直接上代码 package main import ( "net/http" "fmt" "github.com/PuerkitoBio/goquery" "strconv" ) func GetMovie(url string) { fmt.Println(url 主要使用的就是 goquery这个库,当然也可以使用正则进行匹配。我是拒绝的。 我很喜欢python中的beautifulsoup。goquery类似jquery,可以直接操作dom树。 goquery使用的不熟练,代码写的有很多重复,不优雅。 goquery Go 实现了类似 jQuery 的功能,包括链式操作语法、操作和查询 HTML 文档。 由于 net/html 解析器要求文档必须是 UTF-8 编码,因此 goquery 库也有此要求。如果文档不是 UTF-8 编码,使用者需要自己转换。
比如这个URL http://www.flysnow.org/2018/01/20/golang-goquery-examples-selector.html,这是前段时间写的一篇关于goquery的使用教程 \w-]+).html$`) params := flysnowRegexp.FindStringSubmatch("http://www.flysnow.org/2018/01/20/golang-goquery-examples-selector.html for _,param :=range params { fmt.Println(param) } 运行打印输出: http://www.flysnow.org/2018/01/20/golang-goquery-examples-selector.html 2018 01 20 golang-goquery-examples-selector FindStringSubmatch方法是提取出匹配的字符串,然后通过[]string返回。
vendor 那获取第三方库呢,我们之前已经讲过,使用 go 的命令行工具即可: go get **** 比如, 我们爬虫借助了第三方库: go get github.com/PuerkitoBio/goquery download_test.go package download import ( "errors" "net/http" "github.com/PuerkitoBio/goquery " ) func JobParse(response *goquery.Document) []string { var title []string response.Find( import ( "go-example-for-live/fifteen/download" "errors" "fmt" "github.com/PuerkitoBio/goquery " ) type Request struct { Url string ParseFunc func(*goquery.Document) []string } type
选择 Go 作为基础技术栈之后,我们可以使用生态中的开源项目PuerkitoBio/goquery[5],来针对页面内容进行解析,为自己整理有价值的信息。 package main import ( "fmt" "log" "net/http" "strings" "github.com/PuerkitoBio/goquery package main import ( "fmt" "log" "net/http" "strings" "github.com/PuerkitoBio/goquery better-golang-usage-on-m1-mac.html [4] RSS 标签下的文章: https://soulteary.com/tags/rss.html [5] PuerkitoBio/goquery : https://github.com/PuerkitoBio/goquery ----
download.go package download import ( "net/http" "errors" "github.com/PuerkitoBio/goquery (resp.Body) } 使用了内置的 net/http 库 使用了第三方库 goquery ,主要是它很好的对网页解析 4. nine_learning/download" "go-example-for-live/nine_learning/domain" "github.com/PuerkitoBio/goquery " ) var ( ErrorParse = errors.New("parse error") ) func TitleParse(document *goquery.Document) nine_learning/parse/gocn" "go-example-for-live/nine_learning/domain" "github.com/PuerkitoBio/goquery
main ├─ui infra层: package download import ( "net/http" "errors" "github.com/PuerkitoBio/goquery ("request err") ErrResponse = errors.New("response err") ) func ResponseDownload(url string) (*goquery.Document Internet Explorer", "Opera", "Chrome", "Safari", "FireFox", } func UserAgentCom(doc *goquery.Document var newBrowserList = make([]string, 1) doc.Find("div#liste ul li").Each(func(i int, selection *goquery.Selection "fake-user-agent-go-ng/domain/parse" "math/rand" "time" "github.com/PuerkitoBio/goquery
这是一个golang爬虫demo 爬去一个美女图片网站的首页所有图片 采用golang 多线程的方式爬取图片 将爬到的图片保存到本地 代码中有用到goquery 网页数据解析框架 chan 控制goroutine spider() //testDownLoad() } //url->Document->所有图片url->开启多线程进行下载->保存到本地 func spider() { doc, err := goquery.NewDocument ) { str := make([]string, 0) //直接找以img 开头的标签 过滤掉不符合规则的url 即可 doc.Find("img").Each(func(i int, s *goquery.Selection getNameFromUrl(url string) string { arr := strings.Split(url, "/") return arr[len(arr)-1] } 项目地址:点击打开链接 goquery 传送门 https://godoc.org/github.com/PuerkitoBio/goquery
respBody)) //log.Error("infra", err) return respBody, err } return respBody, nil } goquery : 解析网页的库 第三方库,需要自己安装 doc, err := goquery.NewDocument("https://www.feixiaohao.com/") 解析网页内容 以网页源代码中的一个数字货币为例 selector.Find("td").Eq(5).Text() Change := strings.TrimSpace(selector.Find("td").Eq(6).Text()) 不懂的可以看看goquery `json:"count"` Change string `json:"change"` } func queryExampleTwo() { doc, err := goquery.NewDocument 3,902,901万*", "count": "¥1,765,933万", "change": "-15.33%" }, ... ] 上文就是一个简易的爬虫示例,主要使用的是goquery
我们指定解析函数为quotesParse,如下: package main import ( "fmt" "github.com/PuerkitoBio/goquery" "github.com quotesParse(g *geziyor.Geziyor, r *client.Response) { r.HTMLDoc.Find("div.quote").Each(func(i int, s *goquery.Selection 如下是导出json格式: package main import ( "fmt" "github.com/PuerkitoBio/goquery" "github.com/geziyor/geziyor quotesParse(g *geziyor.Geziyor, r *client.Response) { r.HTMLDoc.Find("div.quote").Each(func(i int, s *goquery.Selection
my.oschina.net/2xixi/blog/488811 http://liyangliang.me/posts/2016/03/zhihu-go-insight-parsing-html-with-goquery / 这两篇文章都是用goquery解析 HTML,用到了库: https://github.com/PuerkitoBio/goquery 也可以用xpath去解析html,可以参考: https:// github.com/antchfx/xquery xpath和goquery相比还是比较麻烦的,通过以下这张图可以看出来goquery要活跃的多: ? 我们这里不用xpath,也不用goquery提取,用更加通用的正则表达式来提取。 ? 从上图可以看出,返回体中的a标签里都是这种形式,XXX表示城市拼音,XX表示城市中文,其他的都一样。
我用goquery+github.com/unidoc/unioffice来尝试一下。 将engineercms里的日志尝试导出来。 ? 设代日志在线查阅: ? 思路是这样的,先取出内容,用goquery先分出<p里的段落,一方面提取txt,另一方面提取html,后者含有<img里的src图片地址 然后循环段落,每段后面插入img,只能这样笨办法了。 DiaryContent, 0) var r io.Reader = strings.NewReader(string(Diary.Content)) goquerydoc, err := goquery.NewDocumentFromReader = nil { beego.Error(err) } goquerydoc.Find("p").Each(func(i int, s *goquery.Selection) { sel beego.Error(err) } slice2 := make([]Img, 0) goquerydoc2.Find("img").Each(func(i int, s2 *goquery.Selection
= 200 { return nil, ErrorWrongCode } return goquery.NewDocumentFromReader(resp.Body) ) { document.Find("div.explore-content ol.repo-list li").Each(func(i int, selection *goquery.Selection ) { document.Find("div.explore-content ol li").Each(func(i int, selection *goquery.Selection) { } } 负责串接:下载器和解析器,获取到抓取的字段 package engine import "github.com/PuerkitoBio/goquery" type RequestForGithub struct { URL string ParseFunc func(doc *goquery.Document) } type Repositories struct
在Go语言中,可以使用goquery等库来实现对HTML文档的解析和信息提取,从而获取到目标数据。3.反爬虫策略 微信公众号等网站通常会采取反爬虫策略来阻止爬虫程序的访问。 完整爬取代码 下面是一个简单的示例代码,演示了如何使用grequests库和goquery库来实现爬取微信公众号内容的过程,并包含代理信息的设置:// 请注意,以下代码仅作为示例,实际使用时需要根据具体需求进行修改和完善 package mainimport ("fmt""github.com/PuerkitoBio/goquery""github.com/levigross/grequests")func main() ,},}responses := grequests.Imap(urls, getRequest, 3, ro)for _, resp := range responses {doc, err := goquery.NewDocumentFromReader