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进阶-分布式爬虫实战