Goquery爬虫工具

栏目: Go · 发布时间: 7年前

内容简介:简易的写法,直接从Url里面获取Document,缺点是如果反爬虫了,err仍然为nil改良的写法,先获取ResponseBody,判断返回码之后,再从ResponseBody里面取数据

Goquery安装使用

http://blog.studygolang.com/2015/04/go-jquery-goquery/

  • Goquery需要手动安装,可以直接去github上下载,也可以通过go get github.com/PuerkitoBio/goquery获取
  • Goquery的爬虫功能依赖 net/html 包,好像是被墙了,需要去 https://github.com/golang/net 下载zip包,You can also manually git clone the repository to $GOPATH/src/ golang.org/x/net .记得要把 net-master 改成net
  • 如果出现 dial tcp no such host,记得先ping 一下,可能是网络做了拦截,要用代理
  • 有些网站会做反爬虫的措施(比如豆瓣网),记得断点调试看返回码,403就是禁止访问了

案例1 从糗事百科里面爬笑话

  1. 先通过url获取到document,再遍历document来操作数据

  2. 根据类选择器,获取到所有的 class=content的元素,然后再遍历,把每个元素都封装成一个Selection

  3. 再通过 Selection.Text()来获取文本内容

  4. 对Selection支持强大的过滤条件和遍历,具体可以参考网站上面的

  5. 常用的函数示例

//获取到selection下面的超链接的 文本内容
contentSelection.Find("a").Text()

// 获取到该超链接的herf属性值
href, _ := contentSelection.Find("a").Attr("href")

简易的写法,直接从Url里面获取Document,缺点是如果反爬虫了,err仍然为nil

doc, err := goquery.NewDocument("http://www.qiushibaike.com")
    if err != nil{
        log.Fatal(err)
    }
    doc.Find(".content").Each(func(i int, s *goquery.Selection){
        fmt.Println(s.Text())
    })

改良的写法,先获取ResponseBody,判断返回码之后,再从ResponseBody里面取数据

url:= "http://www.qiushibaike.com"
    resp, err := http.Get(url)
    if err != nil {panic(err)}
    if resp.StatusCode != 200 {
        fmt.Println("err")
    }
    doc, err := goquery.NewDocumentFromReader(resp.Body)
    doc.Find(".content").Each(func(i int, s *goquery.Selection){
        fmt.Println(s.Text())
    })

案例2 从Golang社区爬标题

  1. html部分代码
<dl class="topics dl-horizontal">
        <div class="topic">
            <dd class="right-info">
                <div class="title">
                    <a href="/topics/4134" title="GCTT:Go中文翻译组成立了,期待大家的加入">GCTT:Go中文翻译组成立了,期待大家的加入</a>
                </div>
                <div class="meta">
                    <span style="color: #ff7700; border: 1px solid #ff7700;">置顶</span> • 
                    <a href="/go/notice" class="node" title="公告">公告</a>
                    <a href="/user/polaris" title="polaris" class="author"><strong>polaris</strong></a>
                </div>
            </dd>
        </div>
</dl>
  1. 爬虫代码

    先按照 topics大类下面的 topic小类获取到元素,再通过 title类和元素选择器选中我们的目标元素,再通过Text()获取到内容

doc, err := goquery.NewDocument("http://studygolang.com/topics")
    if err != nil {
        log.Fatal(err)
    }
    doc.Find(".topics .topic").Each(func(i int, contentSelection *goquery.Selection) {
        title := contentSelection.Find(".title a").Text()
        log.Println("第", i+1, "个帖子的标题:", title)
    })

字符集转换工具mahonia

直接 go get github.com/axgle/mahonia ;或者 https://github.com/axgle/mahonia 手动下载安装

使用

func UseNewEncoder(src string,oldEncoder string,newEncoder string) string{
    srcDecoder := mahonia.NewDecoder(oldEncoder)
    desDecoder := mahonia.NewDecoder(newEncoder)
    resStr:= srcDecoder.ConvertString(src)
    _, resBytes, _ := desDecoder .Translate([]byte(resStr), true)
    return string(resBytes)
}

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

轻公司

轻公司

李黎、杜晨 / 中信出版社 / 2009-7 / 39.00元

《轻公司》解读了在互联网和IT技术越来越充裕的环境里,传统的商业法则是如何被打破,而新的商业法则如何建立起来的过程。大量生动翔实的采访,为我们构筑了互联网和IT技术影响下的未来商业趋势。李黎和杜晨在《IT经理世界》上发表了一篇封面报道《轻公司》后,迅速在传统行业及互联网行业产生极大反响,无论是老牌的传统企业、创业公司、风险投资商,都视这篇文章为新商业宝典,甚至有业界人士评价,这篇文章拯救了中国的电......一起来看看 《轻公司》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

SHA 加密
SHA 加密

SHA 加密工具