nodejs抓取动态网页(第二篇自动爬虫入门(二)爬取动态页面(puppeteer))
优采云 发布时间: 2022-02-14 15:14nodejs抓取动态网页(第二篇自动爬虫入门(二)爬取动态页面(puppeteer))
上次写第二篇爬虫教程Node.js爬虫介绍(二)爬取动态页面(puppeteer)讲解使用puppeteer打开无头浏览器进行动态数据爬取,这是一年前的事了,现在的原因这么久没更新是因为开始学爬虫的目的是为了搭建一个自动爬虫系统,去年我开发了陌陌热榜,实现之后就停止研究爬虫了。
陌陌热榜的开发涉及到很*敏*感*词*模块,包括界面设计和前端开发,后端高度自定义爬虫功能和登录模块,数据表设计,自动化部署等,学到了很多,这次我将使用自动爬虫我们来谈谈这个功能。这次我们来说说定时爬取功能的实现:
先打开你要爬取的网站看看是动态网页还是静态网页。重点就在这里。如果是静态网页,则很容易处理。使用cheerio进行dom爬取请参考第一讲。; 如果是ajax动态加载的话,除了第二讲,其实还有另一种方式,用F12打开开发者工具,找到网络请求,找到你要爬取的请求地址。
以百度热榜为例,我每分钟抓取一次百度热榜的标题数据,拼接标题和搜索量,打印出来。它是一个动态加载的网页。按照上面的方法,找到请求地址为/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.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}次搜索`)
})
})
运行结果是:
做吧~