Golang爬虫之goquery

发布日期: 2023-03-02 16:20:14 作者: Stephen 评论: 1

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开始

链接

Github: https://github.com/PuerkitoBio/goquery

Teacher Du 1年前
过来学习一下!