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

一、 背景

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

二、思考

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

《用nodejs写爬虫同步百度FEX Weekly中的文章》
因为后续可能会考虑把360奇舞团的周报内容也同步过来,而且抓取不同站点的文章的逻辑也不同,为了把这个程序写的更具有扩展性一点, 所以必须把抓取的逻辑独立出来,这个就是pages目录的由来。里面分别写各个站点的抓取逻辑,如: 现在已经实现的fex-weekly.js用于抓取FEX团队的文章(75team-weekly.js后续会补上)。

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

在考虑到抓取过的文章我们不应该再去抓取,所以创建了一个db文件用于存储已经抓取过的文章(当然不是直接存储文章内容,目前只存了url),用来识别是否已经抓取过了,如果在old文件夹中就说明已经抓取过了,那么这次就跳过这个文章,抓取最新的文章。

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

三、实现

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

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

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

四、之后

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

    原文作者:kugua
    原文地址: https://segmentfault.com/a/1190000002423761
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞