27、掘地三尺:实战深度与广度优先搜索算法

你好,我是郑建勋。 上节课,我们看到了如何在Go中创建高并发模型,这节课让我们回到项目中来,为爬虫项目构建高并发的模型。 要想构建高并发模型,我们首先要做的就是将一个大任务拆解为许多可以并行的小任务。比方说在爬取一个网站时,这个网站中通常会有一连串的...

Go进阶-分布式爬虫实战

26、高并发爬虫:模型、控制与冲突检测

你好,我是郑建勋。 上一节课,我们看到了协程和调度器的工作原理,协程的特性决定了我们无法保证协程之间的执行顺序,然而在真正的实践中,协程是无法完全隔离的。它们通常需要完成数据的共享,或者说要完成某种通信,而这又会导致数据的并发安全等新的问题。 所以,...

Go进阶-分布式爬虫实战

25、运筹帷幄: 协程的运行机制与调度器原理

你好,我是郑建勋。 Go语言以容易编写高并发的程序而闻名。之前我们介绍Go语言的网络模型时,就提到了Go运行时借助对I/O多路复用的封装还有协程的灵巧调度,实现了高并发的网络处理。不过当时我们还没有深入地审视协程这一最重要的Go特性,所以在...

Go进阶-分布式爬虫实战

24、日志处理:日志规范与最佳实践

你好,我是郑建勋。 这节课,我们需要构建项目的日志组件,方便我们收集打印的日志信息。运行中的程序就像一个黑盒,好在日志为我们记录了系统在不同时刻的运行状态。日志的好处主要有下面四点。 打印调试:日志可以记录变量或者某一段逻辑,记录程序运行的流程。虽...

Go进阶-分布式爬虫实战

23、偷梁换柱:为爬虫安上代理的翅膀

你好,我是郑建勋。 在任何爬虫系统中,使用代理都是不可或缺的功能。代理是指在客户端和服务器之间路由流量的服务,用于实现系统安全、负载均衡等功能。在爬虫项目中,代理服务器常常扮演着重要的角色,它能帮助我们突破服务器带来的限制和封锁,达到正常抓取数据的目...

Go进阶-分布式爬虫实战

22、优雅地离场: Context超时控制与原理

你好,我是郑建勋。 在Go语言的圈子里有一句名言: Never start a goroutine without knowing how it will stop。 意思是,如果你不知道协程如何退出,就不要使用它。 如果想要正确并优雅地退出协程...

Go进阶-分布式爬虫实战

21、采集引擎:实战接口抽象与模拟浏览器访问

你好,我是郑建勋。 我们知道,接口是实现功能模块化、构建复杂程序强有力的手段。在上一节课,我介绍了接口的最佳实践和原理。这一节课,让我们在爬虫程序中实战接口,对采集引擎完成接口抽象。 接口抽象在[第19讲],我们已经将爬取网站信息的代码封装为了fet...

Go进阶-分布式爬虫实战

20、面向组合:接口的使用场景与底层原理

你好,我是郑建勋。 在上一节课,我们讲解了文本处理技术。进行文本处理时,我们使用了函数的封装来完成过程的抽象,函数是一种复用代码、帮助我们构建大规模程序的利器。这节课,让我们来看一看另一种可以构建大规模程序的技术:接口。 Go接口及其优势在计算机科学...

Go进阶-分布式爬虫实战

19、从正则表达式到CSS选择器:4种网页文本处理手段

你好,我是郑建勋。 在上一节课程中,我们了解了Go Modules依赖管理的使用方法和原理,这有助于我们在后期管理项目的复杂依赖。我之所以提前介绍依赖管理,是因为新项目一开始一般就会通过go mod init初始化当前项目的module名。 我们之前...

Go进阶-分布式爬虫实战

18、依赖管理:Go Module 用法与原理

你好,我是郑建勋。 由于项目一开始就需要涉及到依赖的管理,因此在下一节课正式书写项目代码前,我们先来看一看和依赖管理的一些重要知识。 我们知道,一个大型程序会引入大量必要的第三方库,这就让这个程序形成了复杂的依赖关系网络。这种复杂性可能引发一系列问题...

Go进阶-分布式爬虫实战