对于没有接触过swoolePHP开发者,可能对于并发编程或异步编程比较陌生。并发编程就是在短时间内完成多个任务,以往我们都是一个任务完成后,再完成下一个任务。比如接下来采集的网站,我是分几个小模块进行处理,首先先采集章节的链接,然后在根据章节的链接获取内容,最后再把获取到的内容写到文件里。

安装依赖包

  • github.com/PuerkitoBio/goquery 处理文档,类似Jquery
  • github.com/axgle/mahonia gbk转换utf-8

抓取章节地址

https://www.kanunu8.com/book3/6879/,采集该篇的所有章节地址,我定义了chan string的通道变量workChapter,无缓冲通道的读写是同步进行的,然后把采集的地址放到该通道上。

抓取章节内容

range不但可以遍历数组、切片和Map,还可以遍历通道,所以可以获取上个步骤的章节地址,根据http库可以直接获取到内容,再存放到另外的通道workContent

写入文件

同样使用range遍历workContent通道,获取标题和内容写入到本地文件中

注意点

此采集我是使用sync库的WaitGroup结构体,因为如果不使用,可能还没采集完main函数会先结束掉,系统就会退出。此sync.WaitGroup提供了3个方法,分别是AddDone、和Wait,Add方法最好是在goroutine的前面执行,但是在goroutine只单纯调用Done不一样会执行,因为range遍历通道时,如果通道没有关闭,就不会退出循环,所以还需要使用close来关闭通道,采集完成后系统自动退出。 相关源码已发布在 github