使用golang结合goquery抓取数据的爬虫

简介


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

快速使用


本文代码使用 Go Modules。

创建目录并初始化:

$ mkdir goquery && cd goquery
$ go mod init github.com/darjun/go-daily-lib/goquery

安装goquery库:

$ go get -u github.com/PuerkitoBio/goquery

代码区


package mainimport (
"fmt"
"github.com/PuerkitoBio/goquery"
"log"
"net/http")func BaiduHotSearch(url string)  {
resp, err := http.Get(url)
if err != nil {
log.Fatal("错误:",err)
}

defer resp.Body.Close()
if resp.StatusCode != 200 {
log.Fatalf("status code error: %d %s", resp.StatusCode, resp.Status)
}

doc, err :=goquery.NewDocumentFromReader(resp.Body)

if err != nil {
log.Fatal(err)
}

doc.Find(".s-hotsearch-content .hotsearch-item").Each(func(i int, s *goquery.Selection) {
content := s.Find(".title-content-title").Text()
//curl, _ := s.Find(".title-content").Attr("href")
hot := s.Find(".title-content-index").Text()
fmt.Println("title:",content)
//fmt.Println("url:",curl)
fmt.Println("hot:",hot)
})}func main()  {
BaiduHotSearch("http://www.baidu.com")}

运行结果:


title: 中小学不得公开学生考试成绩名次
hot: 1
title: 贾玲成全球票房最高女导演
hot: 4
title: 赵立坚说纽约客最新封面令人心酸
hot: 2
title: 记者直播工厂火灾手机被抢
hot: 5
title: 常州金坛回应公墓有“干部区”
hot: 3
title: 成都一小区新房层高只有1米3
hot: 6
Process finished with exit code 0

编码


由于 net/html 要求使用 UTF-8 编码,goquery 也是如此。我们需要保证传给 goquery 的 HTML 源字符串是 UTF-8 编码的。现在已经很少有非UTF-8 编码的网页了。在早些时候,国内很多网站都是使用 GB2312 或 GBK 编码。如果我们遇到了非 UTF-8 编码的网页该怎么办呢?可以使用iconv-go将字符串的编码转为 UTF-8。

我在知乎https://www.zhihu.com/question/20091439的这个回答中找到了一个 2000 年的新浪网页,72小时网络生存测试,使用 GB2312 编码:

我们就来抓一下这个列表。首先安装 iconv-go:

$ go get -u github.com/djimenez/iconv-go

代码区


package mainimport (
"fmt"
"github.com/PuerkitoBio/goquery"
"github.com/djimenez/iconv-go"
"log"
"net/http")func SinaNewSurvival(url string)  {
resp, err := http.Get(url)
if err != nil {
log.Fatal("错误:",err)
}

defer resp.Body.Close()
if resp.StatusCode != 200 {
log.Fatalf("status code error: %d %s", resp.StatusCode, resp.Status)
}

utf8Body, err := iconv.NewReader(resp.Body, "gb2312", "utf-8")
if err != nil {
log.Fatal(err)
}

doc, err := goquery.NewDocumentFromReader(utf8Body)
if err != nil {
log.Fatal(err)
}

doc.Find(".title14 li").Each(func(i int, s *goquery.Selection) {
content := s.Find("a").Text()
time := s.Find("font").Text()
fmt.Printf("%s%s\n", content, time)
})}func main()  {
SinaNewSurvival("http://news.sina.com.cn/society/netsurvival")}

运行结果:


分别51年母子寻亲 报纸网络各显神通(附图) (2000/08/07  16:39)
读者反映看不懂网络新词汇 (2000/05/17  03:15)
广东南海信息网络教育进课堂 (2000/05/07  16:48)
经济点评:中国网络虚热该降温 (2000/04/24  07:36)
隐身“网络警察”在行动 (2000/04/22  18:31)
智能社区现雏形 北京网络菜场开了张 (2000/04/21  17:10)
戴尔在清华大学畅谈网络时代与新浪网 (2000/04/05  12:42)
著名电视节目主持人杨澜积极投身网络业 (2000/03/24  11:55)
杭州建立民情民意调查网络 (2000/03/23  17:10)
《求是》杂志推出网络版 (2000/03/23  07:20)
国防交通网络模型构建成功 (2000/03/23  05:47)
评论:网上交易,啥时才能说爱你 (1999/09/19  19:56)
网络生存测试今天评出优胜者 (1999/09/16  16:25)
评论:“网络生存”有点无聊 (1999/09/13  11:08)
“网络生存”有点无聊 (1999/09/13  05:48)
网络生存:赔本赚吆喝 (1999/09/13  05:47)
网络生存是否作弊 (1999/09/10  19:02)
网友评论:王大妈的网络生存? (1999/09/10  12:51)
网友评论:网络生存测试还是可以搞下去 (1999/09/09  11:36)
“网络生存”激活众多主页 (1999/09/09  11:35)
Process finished with exit code 0
(0)

相关推荐