前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Golang爬虫之goquery

Golang爬虫之goquery

作者头像
Petrochor
发布2023-03-12 14:54:24
5430
发布2023-03-12 14:54:24
举报
文章被收录于专栏:StephenStephen

goquery 是用 Go 语言编写的一个类似于 jQuery 的库。它基于 HTML 解析库 net/html 和 CSS 库 cascadia ,提供与 jQuery 相近的接口。Go 著名的爬虫框架 colly 就是基于 goquery 而实现的。

安装

代码语言:javascript
复制
go get github.com/PuerkitoBio/goquery

简单使用

以百度搜索关键词 goquery 为例:

代码语言:javascript
复制
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)
        }
    })
}

运行结果:

使用代理

代码语言:javascript
复制
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

本文参与?腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2023-03-02 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客?前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 安装
  • 简单使用
  • 使用代理
  • 常用方法
  • 链接
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com