用nodejs写爬虫同步百度FEX Weekly中的文章

1、 背景

最近团队leader有给小伙伴以邮件的形式推荐百度FEX团队站点中Weekly中的文章,文章内容确实很赞!主要推荐了一些业内的活动和一些很赞的文章。很是值得一读。可是想一想每周都人为的去copy一份文章而后以邮件的形式发送给小伙伴这种形式有点原始。因此产生了此写一个爬虫直接抓取weekly中的更新自动同步过来,目前是同步到我blog中。以后考虑添加一个发送邮件的功能把内容以邮件的形式发送给你们。这样就实现了自动化了。ok,背景交代完了。node

2、思考

先整个程序的目录结构图:git

dMZ*q9AQCwAA
由于后续可能会考虑把360奇舞团的周报内容也同步过来,并且抓取不一样站点的文章的逻辑也不一样,为了把这个程序写的更具备扩展性一点, 因此必须把抓取的逻辑独立出来,这个就是pages目录的由来。里面分别写各个站点的抓取逻辑,如: 如今已经实现的fex-weekly.js用于抓取FEX团队的文章(75team-weekly.js后续会补上)。github

涉及到抓取逻辑,那么考虑到每一个站点更新的频率不一样,如FEX-weekly中的文章通常是周五,周六更新。因此咱们就得有个定时的任务表,里面设定了全部的抓取任务执行的时间,好比目前我设定的是每周六启动fex-weekly.js发送一次请求抓取一次。由于这个任务表的存在,因此有了conf文件夹。并发

在考虑到抓取过的文章咱们不该该再去抓取,因此建立了一个db文件用于存储已经抓取过的文章(固然不是直接存储文章内容,目前只存了url),用来识别是否已经抓取过了,若是在old文件夹中就说明已经抓取过了,那么此次就跳过这个文章,抓取最新的文章。dom

到这里抓取页面逻辑部分就搞定了,那么这个抓取任务必需要有人来启动它而且把抓取后来的文章保存下来,因此必要还要一个main程序,那就是pageSpider.js的由来了。pageSpider主要是常驻内存按咱们设定的时间,启动抓取任务,获取抓取内容并保存。 其余的utils和nodes_modules就很少介绍了,主要是一些工具。async

3、实现

实现部分主要讲讲pageSpider.jsfex-weekly.jside

pageSpider获取conf中的任务列表,而且遍历pages文件夹下的全部任务,根据其中设定的时间利用node-schedule这个库注册定时任务,任务的具体就是启动一个子进程执行pages文件夹中的js文件。而且监听子进程返回的消息,也就是数据。其中利用了async来处理各个任务的并发执行。工具

fex-weekly中逻辑并不能通用,因此假如你要抓取别的站点的文章,那么你得建立一个新的文件,而且写相应的逻辑。按着必定的数据格式(目前的格式尚未统一)给pageSpider。目前抓取FEX团队的文章逻辑是先利用request包发送请求获取文章列表,利用cheerio(能够理解为$)解析dom节点获取文章url,而且发送请求获取每篇文章的内容,并发送给pageSpider。其中也利用了async处理并发获取文章的任务。url

4、以后

整个pageSpider就说清楚了,以后会把75team部分补上,添加邮件功能,以后还可能会添加把抓取的文章转换成为kindle能够识别的格式。这样就能够在kindle上接收到想看的内容了。想一想都以为挺方便的呢。若是你对这个代码感兴趣,能够移步github进行fork改造或者关注新功能。spa

相关文章
相关标签/搜索