利用Node.js爬取简单页面数据

当某些网站限制打开控制台爬取页面内容时,可以通过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":[]}]

项目代码:下载地址

猜你喜欢

转载自blog.csdn.net/xiecheng1995/article/details/106216266