当某些网站限制打开控制台爬取页面内容时,可以通过node向服务器发送请求,爬取我们想要得到的页面文件内容。
爬取简单页面内容
这里以百度为例:
- 项目目录中生成package.json
cnpm init -y
- 项目目录下安装requests包
cnpm i requests --save-dev
- 爬取页面内容主文件(index.js):
let requests = require('requests') // 请求包
let fs =require('fs') // 读写文件
let path = require('path') // 定义文件路径
requests('https://www.baidu.com') // 请求路径
.on('data', function (chunk) {
fs.writeFile(path.resolve(__dirname,'index.html'),chunk,()=>{ //将请求得到的资源文件写入本地项目文件夹下的index.html(名字可改)中
console.log("保存成功") // 数据爬取成功,输出“保存成功”
})
})
.on('end', function (err) {
if (err) return console.log('connection closed due to errors', err);
console.log('end');
});
- 执行上述文件
node .\index.js
在项目目录中得到index.html,部分代码如下:
爬取页面中的json数据
进一步来说,当页面中含有json数据时,也可以将这些数据爬取下来,并转换成json格式文件保存。
以爬取丁香园中的疫情地图数据为例:参考链接
检查页面元素如下(F12):
- 安装cheerio包(类似于jQuery)
cnpm i cheerio --save-dev
- 爬取页面元素内容,并转换成json文件
let requests = require('requests')
let fs = require('fs')
let path = require('path')
const cheerio = require('cheerio')
requests('https://ncov.dxy.cn/ncovh5/view/pneumonia?from=timeline&isappinstalled=0')
.on('data', function (chunk) {
let window = {} //node.js中没有window对象,所以需要自定义一个
const $ = cheerio.load(chunk) // 仿照jquery
eval($("#getAreaStat").html()) // eval执行括号内的js语句,给自定义window增加getAreaStat属性
fs.writeFile(path.resolve(__dirname, 'data.json'),
JSON.stringify(window.getAreaStat) // 转换JSON格式
, () => {
console.log("保存成功")
})
})
.on('end', function (err) {
if (err) return console.log('connection closed due to errors', err);
console.log('end');
});
爬取下来的data.json部分内容如下(以台湾、香港为例):
[{"provinceName":"台湾","provinceShortName":"台湾","currentConfirmedCount":35,"confirmedCount":440,"suspectedCount":348,"curedCount":398,"deadCount":7,"comment":"","locationId":710000,"statisticsData":"https://file1.dxycdn.com/2020/0223/045/3398299749526003760-135.json","cities":[]},
{"provinceName":"香港","provinceShortName":"香港","currentConfirmedCount":26,"confirmedCount":1055,"suspectedCount":47,"curedCount":1025,"deadCount":4,"comment":"疑似1例","locationId":810000,"statisticsData":"https://file1.dxycdn.com/2020/0223/331/3398299755968040033-135.json","cities":[]}]
项目代码:下载地址