上次写了第二篇爬虫教程 [node.js爬虫入门(二)爬取动态页面(puppeteer)](https://peal.cc/blog?id=3) 讲解了使用 puppeteer 开启无头浏览器进行动态数据的爬取,已经是一年前的事情了,之所以相隔这么久没更新是因为开始学爬虫的目的是想做一个自动爬虫系统,去年开发了 [摸摸鱼热榜](https://momoyu.cc),实现之后就没继续爬虫的研究了。 ![摸摸鱼热榜](https://peal.cc/static/image/16234098506407158.jpeg) 开发摸摸鱼热榜涉及到许多功能模块,包括界面设计和前端开发,后端高度自定义爬虫功能和登录模块,数据表设计,自动化部署等,学到了许多东西,这次我就抽自动爬虫这个功能出来聊一聊。这次我们讲讲定时爬取功能的实现: 首先打开你想爬取的网站,看看是动态的网页还是静态的网页,重点来了,如果是静态的网页那很好办,直接参考 [第一讲](https://peal.cc/blog?id=2) 使用cheerio来进行dom爬取;如果遇到是ajax动态加载的,除了 [第二讲](https://peal.cc/blog?id=3) 其实还有一个方法就是F12打开开发者工具找到网络请求,找到你要爬取的请求地址。 ![找到请求](https://peal.cc/static/image/16235800362792311.jpeg) 我以百度热榜为例,每分钟就爬取一次百度热榜头条的数据,拼接标题和搜索量并打印出出来。它是一个动态加载的网页,根据上面的方法找到请求地址为 [http://top.baidu.com/mobile_v2/buzz/hotspot](http://top.baidu.com/mobile_v2/buzz/hotspot),然后尝试爬取: ``` const request = require('request') request('http://top.baidu.com/mobile_v2/buzz/hotspot', (err, res) => { if (err) { console.log(err.code) return false; } let data = JSON.parse(res.body).result.topwords console.log(`${data[0].keyword} - ${data[0].searches}次搜索`) }) // 运行结果 -> 湖北十堰爆炸致11死 省长赶往现场 - 4974558次搜索 ``` 爬取没问题了,要实现定时爬取使用 schedule 库,实现简单的定时任务,使用 schedule.scheduleJob() 方法启动定时任务,第一个参数为定时器,即你要多久执行一次;第二个参数为执行函数。 > 定时器推荐使用 Cron风格,如:' * * * * * * ' 6个占位符代表秒、分、时、日、月、周几,星号*代表全匹配。 > - 每分钟的第30秒触发: '30 * * * * *' > - 每小时的1分30秒触发 :'30 1 * * * *' > - 每天的凌晨1点1分30秒触发 :'30 1 1 * * *' > - 每月的1日1点1分30秒触发 :'30 1 1 1 * *' > - 2016年的1月1日1点1分30秒触发 :'30 1 1 1 2016 *' > - 每周1的1点1分30秒触发 :'30 1 1 * * 1' 现在我要每分钟就爬取一次百度热榜头条的数据,那么 ``` const schedule = require('node-schedule') const request = require('request') schedule.scheduleJob('0 * * * * *', () => { request('http://top.baidu.com/mobile_v2/buzz/hotspot', (err, res) => { if (err) { console.log(err.code) return false; } let data = JSON.parse(res.body).result.topwords console.log(`${data[0].keyword} - ${data[0].searches}次搜索`) }) }) ``` 运行结果为: ![运行结果](https://peal.cc/static/image/16235800600368782.jpeg) 搞掂~

node.js爬虫入门(三)写一个自动爬虫服务

259 11 nodeJs 2021-06-11