对于没有接触过swoole的PHP开发者,可能对于并发编程或异步编程比较陌生。并发编程就是在短时间内完成多个任务,以往我们都是一个任务完成后,再完成下一个任务。比如接下来采集的网站,我是分几个小模块进行处理,首先先采集章节的链接,然后在根据章节的链接获取内容,最后再把获取到的内容写到文件里。
安装依赖包
github.com/PuerkitoBio/goquery处理文档,类似Jquerygithub.com/axgle/mahoniagbk转换utf-8
抓取章节地址
https://www.kanunu8.com/book3/6879/,采集该篇的所有章节地址,我定义了chan string的通道变量workChapter,无缓冲通道的读写是同步进行的,然后把采集的地址放到该通道上。
抓取章节内容
range不但可以遍历数组、切片和Map,还可以遍历通道,所以可以获取上个步骤的章节地址,根据http库可以直接获取到内容,再存放到另外的通道workContent
写入文件
同样使用range遍历workContent通道,获取标题和内容写入到本地文件中
注意点
此采集我是使用sync库的WaitGroup结构体,因为如果不使用,可能还没采集完main函数会先结束掉,系统就会退出。此sync.WaitGroup提供了3个方法,分别是Add、Done、和Wait,Add方法最好是在goroutine的前面执行,但是在goroutine只单纯调用Done不一样会执行,因为range遍历通道时,如果通道没有关闭,就不会退出循环,所以还需要使用close来关闭通道,采集完成后系统自动退出。
相关源码已发布在 github 。
