原文地址: https://strconv.com/posts/web-crawler-exercise-3/

在写爬虫的时候,想要对HTML内容进行选择和查找匹配时通常是不直接写正则表达式的:因为正则表达式可读性和可维护性比较差。用Python写爬虫这方面可选择的方案非常多了,其中有一个被开发者常用的库pyquery,而Golang也有对应的goquery,可以说goquery是jQuery的Golang版本实现。借用jQueryCSS选择器的语法可以非常方面的实现内容匹配和查找。

安装goquery

goquery是第三方库,需要手动安装:

❯ go get github.com/PuerkitoBio/goquery

创建文档

goquery向外暴露的结构主要是goquery.Document,一般是由2种方法创建的:

doc, error := goquery.NewDocumentFromReader(reader io.Reader)
doc, error := goquery.NewDocument(url string)

第二种直接传入了url,但是往往我们会对请求做很多定制(如添加头信息、设置Cookie等),所以常用的是第一种方法,我们的代码也要做对应的改动:

import ("fmt""log""net/http""strconv""time""github.com/PuerkitoBio/goquery"
)func fetch(url string) *goquery.Document {...defer resp.Body.Close()doc, err := goquery.NewDocumentFromReader(res.Body)if err != nil {log.Fatal(err)}return doc

原来是把res.Body转成字符返回,现在直接返回goquery.Document类型的doc了

CSS选择器

这篇文章不会具体介绍选择器的语法,如果你还不了解可以直接看文末的延伸阅读链接一。

我们先看看豆瓣电影Top250单个条目的部分相关的HTML代码:

<ol class="grid_view"><li><div class="item"><div class="info"><div class="hd"><a href="https://movie.douban.com/subject/1292052/" class=""><span class="title">肖申克的救赎</span><span class="title">&nbsp;/&nbsp;The Shawshank Redemption</span><span class="other">&nbsp;/&nbsp;月黑高飞(港)  /  刺激1995(台)</span></a><span class="playable">[可播放]</span></div></div></div></li>....
</ol>

还是原来的需求:获得条目ID和标题。这次需要把parseUrls的逻辑改成使用goquery的版本:

func parseUrls(url string, ch chan bool) {doc := fetch(url)doc.Find("ol.grid_view li").Find(".hd").Each(func(index int, ele *goquery.Selection) {movieUrl, _ := ele.Find("a").Attr("href")fmt.Println(strings.Split(movieUrl, "/")[4], ele.Find(".title").Eq(0).Text())})time.Sleep(2 * time.Second)ch <- true
}

doc.Find的参数就是css选择器,而且Find支持链式调用。这里的意思就是先找雷鸣是"grid_view"的所有ol下的li元素,然后再找li元素里面以hd为名字的元素(看上面的HTML可以知道是div)。Find找到的结果是列表,需要使用Each方法循环获得,可以传递一个包含索引index和子元素ele参数的函数,获得具体内容的逻辑就在这个函数中。

在上面的例子中,类名叫做title的span一共有2个,所以需要取第一个(用Eq(0)),Text方法可以获得元素的内容。而获得条目ID的方法是先拿到条目页面链接(用Attr获得href属性,注意,它返回2个参数,第一个是属性值,第二是是否存在这个属性)。这样就拿到了ID和标题啦,是不是可读性和可维护性高了很多呢?

PS:其实爬虫练习的目的已经达到了,获得更多内容就是多写些逻辑罢了。

代码地址

完整代码可以在这个地址找到。

延伸阅读

  1. http://www.w3school.com.cn/cssref/css_selectors.asp
  2. https://www.itlipeng.cn/2017/04/25/goquery-%E6%96%87%E6%A1%A3/

golang http 返回html文件_用Golang写爬虫(三) - 使用goquery相关推荐

  1. golang http 返回html文件_从零部署安装 Grpc-golang

    很多网上的教程已经不适合用了,包括有些官网上不去,部署安装失败,这里丛零开始安装部署记录下: 安装环境centos: 1,先安装golalng: 安装包下载地址为:https://golang.org ...

  2. js foreach用法_使用 nodejs 写爬虫(一): 常用模块和 js 语法

    本篇是使用 nodejs 写爬虫系列教程的第一篇, 介绍了使用 nodejs 写爬虫过程中常用的模块和一些必须掌握的 js 语法 <!-- more --> 常用模块 常用模块有以下几个: ...

  3. python爬虫课程设计过程_[Python]新手写爬虫全过程(已完成)

    今天早上起来,第一件事情就是理一理今天该做的事情,瞬间get到任务,写一个只用python字符串内建函数的爬虫,定义为v1.0,开发中的版本号定义为v0.x.数据存放?这个是一个练手的玩具,就写在tx ...

  4. python学完那部分能写爬虫_[Python]新手写爬虫全过程(已完成)

    今天早上起来,第一件事情就是理一理今天该做的事情,瞬间get到任务,写一个只用python字符串内建函数的爬虫,定义为v1.0,开发中的版本号定义为v0.x.数据存放?这个是一个练手的玩具,就写在tx ...

  5. python爬虫实验报告怎么写_[Python]新手写爬虫全过程(转)

    今天早上起来,第一件事情就是理一理今天该做的事情,瞬间get到任务,写一个只用python字符串内建函数的爬虫,定义为v1.0,开发中的版本号定义为v0.x.数据存放?这个是一个练手的玩具,就写在tx ...

  6. python 爬虫框架对比_用Python写爬虫,用什么方式、框架比较好?

    以前只写过很简单的Python爬虫,直接用内置库实现,有没有谁用Python爬过规模较大的数据,用的是什么方法? 还有,采用现有的Python爬虫框架,相比与直接使用内置库,优势在哪?因为Python ...

  7. golang mysql连接池原理_[Go] golang实现mysql连接池

    golang中连接mysql数据库,需要使用一个第三方类库github.com/go-sql-driver/mysql,在这个类库中就实现了mysql的连接池,并且只需要设置两个参数就可以实现 一般连 ...

  8. golang调用java的函数_大话golang性能分析(一):profile基本原理

    引言:好久没分享了,不多废话了,准备一个专题分三期来分享下golang的性能分析. O 专题目标 理解profile基本原理 熟悉go常用性能分析工具pprof 快速对线上服务的cpu.内存.goro ...

  9. easypoi 导入失败返回错误文件_从Excel批量导入数据说到ForkJoin的原理

    前言 前面我们介绍了EasyPOI,用其进行Excel导入导出,非常的方便,非常的简单.但是4.0.0 版本以及其之前的版本都是通过单线程的方式对Excel中的数据进行解析的.效率比较差. 今天我将做 ...

最新文章

  1. sqlserver2000发布订阅
  2. Oracle并行进程小结
  3. 装机人员工具_吕梁采购气伏式包装机-哪家好-强盛包装机械
  4. angularjs 服务
  5. java中除了跟数据相关的知识_Java的基本数据类型及知识介绍
  6. Vue笔记大融合总结
  7. Manjaro下安装VirtualBox
  8. likely,unlikely宏与GCC内建函数__builtin_expect()
  9. CTF挑战赛-合天网安实验室-Reverse逆向100writeup
  10. 设有一个 Student 数据库,包括 数据库,包括 学生 , 课程 , 选修三个关系: 三个关系: 学生 学生:S ( Sno ,Sname ,Ssex ,Sage,Sdept ) 课程 课程:
  11. MFC 树形控件的使用
  12. 考研面试php,考研复试 | 盘点:这些院校已公布2019考研复试内容
  13. GEO-BYB型振弦式表面应变计的主要作用
  14. 4月第1周榜单丨飞瓜数据B站UP主排行榜(哔哩哔哩平台)发布!
  15. 未来人工智能对人类的影响的利弊
  16. Excel处理多余符号--查找替换功能SUBTITUTE公式的使用
  17. webrtc学习笔记二:webrtc介绍
  18. J9数字论:现阶段Web3.0存在的问题有哪些
  19. 改进YOLOv8 | 即插即用篇 | 全维动态卷积 |《 OMNI-DIMENSIONAL DYNAMIC CONVOLUTION》
  20. 虚拟机使用的是此版本 VMware Workstation 不支持的硬件版本。 模块“Upgrade”启动失败。 未能启动虚拟机的解决方案

热门文章

  1. MYSQL函数应用----替换函数replace()用法
  2. vue中使用FullCalendar日历组件
  3. [React] 尚硅谷 -- 学习笔记(七)
  4. [Axios] axios的基础语法
  5. [Node.js] 模块化 -- fs文件读取模块
  6. JavaScript 面向对象编程(一) —— 面向对象基础
  7. 动手学深度学习(PyTorch实现)(九)--VGGNet模型
  8. C++知识点:typedef struct、printf
  9. python 从大到小循环_python算法(3) 插入排序
  10. R7-1 正整数A+B (15 分)