使用到的模块:

var https = require('https'); // node自带
var cheerio = require('cheerio'); // npm i cheerio 安装
var xlsx = require('node-xlsx'); // npm i node-xlsx 安装
var fs = require('fs'); // node自带

代码:

const https = require('https');
const cheerio = require('cheerio');
const xlsx = require('node-xlsx');
const fs = require('fs');

const startPage = 1; // 开始页
const endPage = 2; // 结束页

let page = startPage; // 当前抓取页
let total = 0; // 数据总数

// 初始化url
const url = 'https://sh.lianjia.com/zufang/pujiang1/rt200600000001l0/';
// https://sh.lianjia.com/zufang/pujiang1/pg2rt200600000001l0/

// 收集最终数据
let result = [{
name: '链家',
data: [
['链家网-上海市-闵行区-浦江镇-整租-一室'],
['标题', '价格', '地点', '大小', '朝向', '格局', '层数', '来源', '发布时间', '标签']
]
}];

// 抓取开始
getData(url)

/**
* 抓取数据请求函数
* @param {抓取地址} url
*/
function getData(url) {
https.get(url, res => {
let data = '';
res.on('data',function(chunk){
data += chunk;
});
res.on('end',function(){
let formatData = filter(data); // 筛选出需要的数据
result[0].data = result[0].data.concat(formatData); // 拼接此次抓取到的数据
page++;
if (page <= endPage) { // 继续抓取下一页
// 通过分析 url 规律,拼出下一页的 url
let tempUrl = 'https://sh.lianjia.com/zufang/pujiang1/pg' + page + 'rt200600000001l0/';
getData(tempUrl); // 递归继续抓取
} else { // 结束抓取
result[0].data.push(['总数', total]); // 在最后添加一个总数
writeData(result, 'LJ.xlsx'); // 写入文件
}
})
});
}

/**
* 处理抓取到的dom函数
* @param {dom数据} data
*/
function filter(data){
let final = []; // 用来存储本页所有数据信息
//将页面源代码转换为$对象
let $ = cheerio.load(data);

if (total == 0) // 如果没获取过总数,那么获取一次总数
total = $('#content .content__article .content__title span.content__title--hl').text();
// 找到列表外层
let items = $('#content .content__article .content__list .content__list--item');
// 遍历处理每一条数据(each是cheerio提供的方法,不可以使用forEach)
items.each((index, item) => {
let temp = []; // 用来存储此条数据的信息
let title = $(item).find('.twoline').text().replace(/\s/g, '');
let price = $(item).find('span.content__list--item-price').text();
let info = $(item).find('p.content__list--item--des').text().replace(/\s/g, '').split('/');
let type = $(item).find('p.content__list--item--brand').text().replace(/\s/g, '') || '';
let time = $(item).find('p.content__list--item--time').text();
let tag = $(item).find('p.content__list--item--bottom').text().replace(/\s/g, '');;
let [address, size, fangxiang, format, floor] = info
temp.push(title, price, address, size, fangxiang, format, floor, type, time, tag)
final.push(temp)
});
return final;
}

/**
*
* @param {要写入的数据} data
* @param {文件名} fileName
*/
function writeData(data, fileName) {
// 写xlsx
var buffer = xlsx.build(data);
fs.writeFile(fileName, buffer, function (err) {
if (err) throw err;
console.log('Write to xls has finished');
// 读xlsx
// var obj = xlsx.parse("./" + "resut.xls");
// console.log(JSON.stringify(obj));
});
}

数据结果:

node.js爬虫-爬取链家(带分页)_链家

觉得有帮助的小伙伴右上角点个赞~

扫描上方二维码关注我的订阅号~