goquery
是用 Go
语言编写的一个类似于 jQuery
的库。它基于 HTML 解析库 net/html
和 CSS 库 cascadia
,提供与 jQuery
相近的接口。Go
著名的爬虫框架 colly
就是基于 goquery
而实现的。
安装
go get github.com/PuerkitoBio/goquery
简单使用
以百度搜索关键词 goquery
为例:
func main() {
// Request the HTML page.
res, err := http.Get("https://www.baidu.com/s?wd=goquery")
if err != nil {
return
}
defer res.Body.Close()
if res.StatusCode != 200 {
return
}
// Load the HTML document
doc, err := goquery.NewDocumentFromReader(res.Body)
if err != nil {
return
}
// Find the review items
doc.Find("#content_left .new-pmd").Each(func(i int, selection *goquery.Selection) {
title := selection.Find("h3.t a").Text()
// 标签属性
url, _ := selection.Find("h3.t a").Attr("href")
if title != "" {
fmt.Println(title, url)
}
})
}
运行结果:
使用代理
func main() {
client := newHttpClient("http://127.0.0.1:10809")
res, err := client.Get("https://www.baidu.com/s?wd=goquery")
if err != nil {
fmt.Println("Err1:", err)
return
}
defer res.Body.Close()
if res.StatusCode != http.StatusOK || err != nil {
fmt.Println("Err2:", err)
return
}
doc, err := goquery.NewDocumentFromReader(res.Body)
}
// newHttpProxyClient 设置代理
func newHttpProxyClient(address string) *http.Client {
proxy, err := url.Parse(address)
if err != nil {
fmt.Println("Err:", err)
return nil
}
netTransport := &http.Transport{
Proxy: http.ProxyURL(proxy),
MaxIdleConnsPerHost: 10,
ResponseHeaderTimeout: time.Second * time.Duration(5),
}
return &http.Client{
Timeout: time.Second * 10,
Transport: netTransport,
}
}
常用方法
NewDocumentFromReader()
返回Document和error,Document表示HTML文档Find()
获取当前匹配元素集中每个元素的子代,比如示例中我们获取id为 #content_left
下的 .new-pmd
子集Each()
迭代器,遍历我们选择的 .new-pmd
节点Text()
获取匹配元素的内容Attr()
获取匹配元素的属性,返回属性值,和是否存在属性的布尔值Eq()
获取第某个元素节点,下标从0开始