使用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)