当前位置: 首页 > 后端技术 > Node.js

NodeJS爬取新闻,GitHubactions部署服务

时间:2023-04-03 14:13:17 Node.js

最近看本地新闻,老是看到这个新闻网,那个新闻网,感觉真麻烦。想写一个小爬虫,爬取一些新闻,合并到自己的A新闻列表中。选择要实施的节点。源码:news-crawler作用:news.imondo.cn以为爬取网页涉及用到的几个插件库:request一个node请求库cheerio一个类似jQuery的DOM解析库iconv-lite由于Node.js只有utf8编码规则,那么如果处理gbk编码规则的文件会出现乱码,那么利用它的转码node-scheduleNode的定时任务来处理ejs一个模板引擎程序实现的简单过程获取网页信息cheerio分析网页结构,得到写的将新闻关键信息写入json文件并访问。使用ejs模板展示新闻列表,获取数据。使用请求获取待抓取的新闻页面getList(url){returnnewPromise(resolve=>{request.get({url,encoding:null},function(err,res,body){if(err){console.log(err);}lethtml=iconv.decode(body,'gbk');let$=cheerio.load(html,{decodeEntities:false});resolve($);});})}分析页面组织获取关键信息asyncget163List(ctx){constnewsList=[];consturl='https://hunan.news.163.com/';const$=awaitthis.getList(url);//头条新闻$('.news-feature').each(function(index,elem){let$elem=$(elem);$elem.find('a').each(function(index,e){常量$e=$(e);常量标题=$e.text();consthref=$e.attr('href');consthot=$e.parents('h5').length>0;newsList.push({title,href,hot,tag:'网易新闻'});})});返回新闻列表;}写入数据文件通过node的fs模块写入我们获取到的关键消息信息,我选择将写入的文件命名为fs.writeFile(path.resolve(__dirname,`../database/${dir}.json`),JSON.stringify({data}),function(err){console.log(err);if(err)throwerr;console.log('writecompleted');});模板渲染程序使用ejs进行渲染。由于程序主要是使用koa构建的,所以需要用到koa-static,koa-views中间件首先读取json数据文件fs.readFile(path.join(__dirname,`../database/${date}.json`),(err,data)=>{if(err){reject(null);}else{resolve(JSON.parse(data.toString()).data);}})通过读取数据渲染conststatic=require('koa-static');constviews=require('koa-views');//静态文件app.use(static(path.join(__dirname,'./static')));//加载模板引擎app.use(views(path.join(__dirname,'./views'),{extension:'ejs'}));app.use(asyncctx=>{letlist=awaitcrawler.getNews();awaitctx.render('index',{列表,时间:utils.getNowDate()})});这个时候小爬虫其实已经写完了,但是由于新闻是时效性的,所以我们需要做一个定时任务,定时抓取新闻。定时任务node-schedule的基本用法可以参考文档。该程序每4小时使用一次Crawlconstschedule=require('node-schedule');constconfig=require('./../config');construle=newschedule.RecurrenceRule();rule.hour=config.timeJob;rule.minute=0;/*定时任务*/functiontimeJob(cb){schedule.scheduleJob(rule,function(){console.log('定时任务执行一次');cb&&cb();});}GitHub操作部署过程采用github动作用于自动部署到自己的服务器部署私服。首先需要解决登录服务器的问题,要么输入密码,要么使用sshkey登录,这里程序使用第二个SSH私钥连接登录自己的Server,生成私钥$mkdir-p~/.ssh&&cd~/.ssh$ssh-keygen-trsa-fmysiteGeneratingpublic/privatersakeypair.Enterpassphrase(emptyfornopassphrase):Entersamepassphraseagain:PressEnterall顺便说一句,会在~/.ssh下生成两个文件:mysite(私钥)和mysite.pub(公钥)。私钥是您的个人登录凭据,请勿与他人共享。公钥需要放在登录的目标服务器上。将公钥mysite.pub的内容粘贴到目标服务器的~/.ssh/authorized_keys中,保证服务器的~/.ssh文件夹的权限低于711,这里我直接使用600(只有这个用户可以读写)chmod600-R~/.ssh自动配置在GitHub上找到仓库设置,添加Secrets设置,添加SSH_PRIVATE_KEY配置,这个是复制上一步mysite中私钥的内容,可以参考图中添加需要的隐私信息配置文件GitHubactions主要是自动读取仓库下.github/workflows文件夹下的yml配置。配置文件名中已经写了一些具体的配置含义:mondoNewsaction#nameon:push:branches:-master#只有master上的push操作才会触发部署paths-ignore:#以下文件的变化不触发部署,你可以自己做Add-README.mdjobs:build-and-deploy:runs-on:ubuntu-latest#使用ubuntu系统镜像运行自动化脚本steps:#Automationsteps-name:Checkout#stepnameuses:actions/checkout@master#使用别人打包的步骤image-name:DeployfiletoServeruses:wlixcc/SFTP-Deploy-Action@v1.0with:username:${{secrets.USERNAME}}#参考配置,用户名服务器:${{秘密。SERVER_IP}}#参考配置,服务器IPssh_private_key:${{secrets.SSH_PRIVATE_KEY}}#参考配置,SSH私钥local_path:'./*'remote_path:'/front/news'-name:ServerStartuses:appleboy/ssh-action@masterwith:主机:${{secrets.SERVER_IP}}用户名:${{secrets.USERNAME}}密钥:${{secrets.SSH_PRIVATE_KEY}}端口:${{secrets.PORT}}脚本:sh/front/news/deploy.sh#执行脚本命令查看githubactions最大的优势就是可以使用第三方已经写好的镜像进行部署。我们只需要写下配置就可以运行它,具有很大的可扩展性。将配置文件提交到远程仓库,可以在仓库的Actions项中看到Summaryofstartupstatus这次用代码尝试解决生活中的一些问题,也尝试了githubactions来简化一些重复的部署操作。欢迎关注公众号,一起交流,共同进步。