首页 文章 个人博客 使用golang结合goquery抓取数据的爬虫

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

发布时间:2021-04-6编辑:RainNight阅读(40)

简介


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 main

import (
	"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 main

import (
	"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)
网友评论72小时生存测试观感 (1999/09/08  16:15)
网友评论网络生存测试--无意义的泡泡 (1999/09/08  16:14)
我很累但我很快乐 (1999/09/08  16:06)
图文72小时网络生存北京站测试者满载而归 (1999/09/08  10:24)
评论哗众取宠的网络生存测试 (1999/09/08  02:40)
购物网站来去都匆匆 (1999/09/07  18:43)
体验者最大感受目前网上不能生存 (1999/09/07  16:45)
网络生存测试表明上海好买食物北京好买书 (1999/09/07  15:09)
"网络生存"测出什么问题 (1999/09/07  10:29)
网上购药路漫漫 (1999/09/07  09:31)
生存测试无关生存--业内人士的不同意见 (1999/09/07  09:17)
参加测试选手的房间满目狼藉 (1999/09/07  09:10)
如此网络生活--网络生存测试真实内幕 (1999/09/07  08:37)
网上生存测试曲终人未散 (1999/09/07  06:29)
72小时网络生存测试者出来了 (1999/09/07  05:09)
中国首届72小时网络生存测试 (1999/09/07  03:05)
图文72小时网络生存测试结束() (1999/09/06  22:18)
图文72小时网络生存测试结束() (1999/09/06  22:16)
独行侠下午弃网出孤岛 (1999/09/06  20:36)
图文72小时网络生存测试结束 (1999/09/06  20:08)
网络生存测试者日记网络生存第三天 (1999/09/06  16:29)
参加网络生存测试的人越过越滋润 (1999/09/06  15:35)
如此测试有何意义--72小时网络生存闹剧 (1999/09/06  14:43)
诗一首赠狂人及其他网络生存试验者 (1999/09/06  11:48)
评论这个活动完全是骗人的 (1999/09/06  11:29)
评论有感于72小时网络测试 (1999/09/06  11:24)
评论请别忘记我这个老头儿 (1999/09/06  11:17)
我国网上购物面临考验 (1999/09/06  10:56)
54小时过去测试者苦尽甘来 (1999/09/06  05:25)
广州网络生存一测试者功败身退 (1999/09/05  22:03)
不会收发电子邮件导致25小时吃不上饭 (1999/09/05  19:42)
记者网上生存发现网上购物送货忒慢 (1999/09/05  18:03)
网络生存第二天--还是睡光板床 (1999/09/05  17:53)
关于网络生存测试的看法 (1999/09/05  15:29)
我认为搞72小时网络生存没有多大的意义 (1999/09/05  15:27)
对于现在中国网络发展非常忧虑 (1999/09/05  15:26)
网上生存测试第二天有人挺不住了 (1999/09/05  05:54)
在穗进行网络生存测试的四选手表现各异 (1999/09/04  22:35)
网上生存头天饱三饿一 (1999/09/04  19:31)
网络生存第一天 (1999/09/04  18:59)
网上生存5077号22小时滴水未进 (1999/09/04  18:39)
图文测试者的一举一动都可以看到 (1999/09/04  09:12)
图文北京电视台的网络直播正要开始 (1999/09/04  09:09)
图文测试正式开始 (1999/09/04  09:04)
图文北京的四位测试者走向各自的房间 (1999/09/04  08:56)
多图活动受到媒体极大关注 (1999/09/04  08:53)
图文参加北京分站测试的四位成员 (1999/09/04  08:49)
网络小飞侠新闻炒作而已 (1999/09/04  06:27)
新浪网友superrain中国的电子商务太落后了 (1999/09/04  06:19)
网上生存测试活下去还要活得好 (1999/09/04  03:55)
记实微软所作的网络生存试验 (1999/09/04  03:39)
中国首次网络生存测试今天开始 (1999/09/04  03:38)
北京特快主持人范红军将参与网上生存测试活动 (1999/09/04  03:28)
网络生存测试5068人报名 (1999/09/04  03:26)
72小时网络生存测试报名踊跃 (1999/09/04  03:24)
72小时网络生存测试报名者突破3500名 (1999/09/04  03:22)
京沪穗举办72小时网络生存测试活动 (1999/09/04  03:20)
英国网络生存实验 (1999/09/04  03:19)
网络鲁滨孙演出二十一世纪生存方式 (1999/09/04  03:17)

Process finished with exit code 0

书籍归档