对于没有接触过swoole
的PHP
开发者,可能对于并发编程或异步编程比较陌生。并发编程就是在短时间内完成多个任务,以往我们都是一个任务完成后,再完成下一个任务。比如接下来采集的网站,我是分几个小模块进行处理,首先先采集章节的链接,然后在根据章节的链接获取内容,最后再把获取到的内容写到文件里。
安装依赖包
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个方法,分别是Add
、Done
、和Wait
,Add
方法最好是在goroutine
的前面执行,但是在goroutine
只单纯调用Done
不一样会执行,因为range
遍历通道时,如果通道没有关闭,就不会退出循环,所以还需要使用close
来关闭通道,采集完成后系统自动退出。
相关源码已发布在 github 。