nodejs实现新闻爬虫
作为费德勒的铁杆粉丝,每天早上都会在新浪体育里面的网球频道浏览费德勒新闻。由于只关注费德勒的新闻,所以每次都要在网页中大量的新闻中筛选相关信息,感觉效率好低,所以用node写了一个简单的爬虫程序通过每天定时发送邮件的方式来通知。
这个需求仔细看有3个功能点,信息爬虫,定时发送,邮件通知
信息爬虫
信息爬虫建立在对页面结构的分析,从页面内容中抽取符合我们需要的信息,所以我们在获得网页信息后,需要对dom结构进行分析,获得相关信息,组装成数据。
Axios(https://github.com/mzabriskie/axios) 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中发送请求,获取数据,所以我们通过可以axios来获取html页面内容
接下来,我们需要分析html内容中,cheerio(https://github.com/cheeriojs/cheerio)这个库可以帮我们像jquery的API一样分析获取dom结构,进行数据的筛选。
所以对于网页的爬虫,我们实现思路,axios获取数据,cheerio获取整个页面的A的标签,在对A标签的内容进行正则匹配筛选,存储到数组中,具体代码如下:
const KEYWORD = '费德勒';
const KEYWORD_REG = new RegExp(KEYWORD, 'i'); let newsArry = [];
function spider() {
return axios.get('http://sports.sina.com.cn/tennis/').then(response => {
if (response.status === 200) { let $ = cheerio.load(response.data, {
decodeEntities: false
});
let newsList = $('a[href]');
newsArry = [];
for (let i = 0; i < newsList.length; ++i) {
let obj = $(newsList[i]);
let text = $(newsList[i]).text();
//收集数据
if (KEYWORD_REG.test(text)) {
newsArry.push({
'title': text.trim(),
'href': obj.attr('href')
})
}
}
}
}).catch(e => {
console.log('爬虫失败了');
console.log(error);
})
邮件通知
nodemailer(https://nodemailer.com/)是一个关于邮件发送的库,只要安装nodemailer模块,按照规则配置好发送信息即可,代码如下:
const configData = require('./config.json');
//生成发送字符串
function formStr(arr) {
let html = '';
for (let data of arr) {
html += `<p><a target="_blank" href="${data.href}">${data.title}</a></p>` // red green blue
}
return html;
}
//邮件发送函数
function sendEmail(opts) {
let transporter = nodemailer.createTransport({
service: 'QQ',
auth: configData.auth
}, {
from: configData.auth.user
})
var message = {
//收件人用逗号间隔
to: opts.to,
//信息主题
subject: opts.subject,
//内容
html: opts.html
};
auth 中的 pass,是指“邮箱第三方登录授权码”,如何获取授权码,以QQ邮箱为例,请点击:http://jingyan.baidu.com/article/fedf0737af2b4035ac8977ea.html
定时发送
定时发送我们可以通过简单的setInterval来实现,但是这样写的扩展性不高。到node社区搜了一下,发现了一个定时脚本库:node-schedule(https://www.npmjs.com/package/node-schedule)
const schedule = require('node-schedule');
const SCHEDULE_RULE = '1 30 10 * * *'; //每天10点30分发送
schedule.scheduleJob(SCHEDULE_RULE, () => {
spider().then(() => {
sendEmail({
to: configData.recipients.join(','),
subject: `${KEYWORD}新闻`,
html: formStr(newsArry)
})
});
});
这个库的使用和简单,指定匹配规则,然后添加定时执行函数就可以了。
我们这里指定规则每天10点半发送邮件,这样我们也完成了定时发送的任务
我们来看一下发送到我们邮箱数据:

大功告成,这样我们以后每天10点半直接看邮件就行了。
nodejs实现新闻爬虫的更多相关文章
- nodejs的简单爬虫
闲聊 好久没写博客了,前几天小颖在朋友的博客里看到了用nodejs的简单爬虫.所以小颖就自己试着做了个爬博客园数据的demo.嘻嘻...... 小颖最近养了条泰日天,自从养了我家 ...
- 基于Scrapy框架的Python新闻爬虫
概述 该项目是基于Scrapy框架的Python新闻爬虫,能够爬取网易,搜狐,凤凰和澎湃网站上的新闻,将标题,内容,评论,时间等内容整理并保存到本地 详细 代码下载:http://www.demoda ...
- nodejs 快要变成爬虫界的王者
nodejs 快要变成爬虫界的王者 爬虫这东西是很多数据采集必须要的东西. 但是现在随着网页不断发展,已经出现了出单纯的网页,到 ajax 网页, 再到 spa , 再到 websocket 应用,一 ...
- 一次使用NodeJS实现网页爬虫记
前言 几个月之前,有同事找我要PHP CI框架写的OA系统.他跟我说,他需要学习PHP CI框架,我建议他学习大牛写的国产优秀框架QeePHP. 我上QeePHP官网,发现官方网站打不开了,GOOGL ...
- nodeJS实现简易爬虫
nodeJS实现简易爬虫 需求:使用nodeJS爬取昵图网某个分类下的图片并存入本地 运用nodeJS自带系统模块http.fs 示例代码: var http =require('http'); va ...
- nodejs eggjs框架 爬虫 readhub.me
最近做了一款 高仿ReadHub小程序 微信小程序 canvas 自动适配 自动换行,保存图片分享到朋友圈 https://gitee.com/richard1015/News 具体代码已被开源, ...
- NodeJS写个爬虫,把文章放到kindle中阅读
这两天看了好几篇不错的文章,有的时候想把好的文章 down 下来放到 kindle 上看,便写了个爬虫脚本,因为最近都在搞 node,所以就很自然的选择 node 来爬咯- 本文地址:http://w ...
- windows定时执行百度新闻爬虫
想要做个新闻文本识别分类的项目,就先写了个爬取百度新闻的爬虫. 环境:win7 32 bit python3.4 若干第三方库 可以实现的功能:定期按照百度新闻的分类抓取新闻的标题,所属类别及文本内容 ...
- NodeJs编写小爬虫
一,爬虫及Robots协议 爬虫,是一种自动获取网页内容的程序.是搜索引擎的重要组成部分,因此搜索引擎优化很大程度上就是针对爬虫而做出的优化. robots.txt是一个文本文件,robots是一个协 ...
随机推荐
- shell脚本--显示文本内容
shell脚本显示文本内容及相关的常用命令有cat.more.less.head.tail.nl 首先是cat,cat最常用的就是一次性显示文件的所有内容,如果一个文件的内容很多的话,那么就不是很方便 ...
- Golang 入门~~基础知识
变量声明 //通用形式,指定变量名,变量类型,变量值 var name int = 99 fmt.Println(name) //指定变量名,以及变量类型,未指定值的时候默认是类型零值 var age ...
- Spring框架最简单的定时任务调用
package org.jeecgframework.core.timer; import org.springframework.scheduling.annotation.Scheduled; i ...
- Exception while invoking TaskListener: Exception while invoking TaskListener: null
https://community.alfresco.com/thread/225041-exception-while-invoking-tasklistener-null Ok, so the p ...
- mysql 备份数据库 mysqldump
@echo off for /F "usebackq tokens=1,2 delims==" %%i in (`wmic os get LocalDateTime /VALUE ...
- Wordpress 更新时 不输入ftp相关信息的方法
From 百度知道 我自己机器上面的处理过程为: cd /usr/share/nginx/html vim wp-config.php 在配置文件里面插入这三行 define("FS_MET ...
- [转载] 虚拟机下面安装windows+oracle ASM的过程
转帖:https://www.2cto.com/database/201303/195261.html 最开始的时候 我找了一个挺好的教程 安装过 但是已经找不到了,先转载一下这个内容,后续再测试完善 ...
- SVG to Image in js
SVG to Image in js SVG to Image https://image.online-convert.com/convert-to-svg https://stackoverflo ...
- 简单谈谈DNS协议
DNS协议也可以称为DNS服务,全称是Domain Name System,即域名系统,和HTTP协议一样,也是一个位于应用层的协议(服务),它是基于运输层的UDP协议的,关于网络协议的分层介绍,见这 ...
- BZOJ5343[Ctsc2018]混合果汁——主席树+二分答案
题目链接: CTSC2018混合果汁 显然如果美味度高的合法那么美味度低的一定合法,因为美味度低的可选方案包含美味度高的可选方案. 那么我们二分一个美味度作为答案然后考虑如何验证? 选择时显然要贪心的 ...