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

该博客主要介绍使用Node.js进行链家爬虫分页的相关内容,包含使用到的模块、具体代码以及数据结果展示,为相关技术人员提供参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用到的模块:

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));
  });
}

数据结果:

在这里插入图片描述

觉得有帮助的小伙伴右上角点个赞~在这里插入图片描述

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

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张兴华(MarsXH.Chang)

喜欢的可以请作者喝杯咖啡~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值