Node爬取中关村手机参数入库


目录创建一个Server文件夹 ,用于存放以下所有文件

服务文件Server.js
// node后端服务器
const http = require('http');
const badyParser = require('body-parser');
const express = require('express');
//爬虫文件
const Reptile= require('./Reptile');

let app = express();
let server = http.createServer(app);

app.use(badyParser.json());
app.use(badyParser.urlencoded({
  extended: false
}));

// 后端api路由
app.use('/api/Reptile', Reptile);

// 启动监听
server.listen(8888, () => {
  console.log(' success!! port:8888')
})

sql文件sql.js
// sql语句
var sqlMap = {
  Phone: {
    // 添加手机
    addphone:'insert into phoneproducts set ?'
  }
}

//抛出对象
module.exports = sqlMap;

数据库DBHelper.js
// 数据库连接助手
const mysql = require('mysql');

class DBHelper{
  // 获取数据库连接
  getConn(){
    let conn = mysql.createConnection({
      // 数据库连接配置
      host:'127.0.0.1',
      port:'3306',
      user:'root',
      password:'123456',
      database:'phoneList'  // 数据库名
    });
    conn.connect();
    return conn;
  }
}

module.exports = DBHelper;
爬虫代码Reptile.js
//爬虫需要用到的模块
const request = require('request');
//解析网页结构,可以操作dom
const cheerio = require('cheerio');
//获取整个网页
const fetch = require('node-fetch');
const iconv = require('iconv-lite');
//引入sql语句文件
const sql= require('./sql');
//要爬取的地址
var URL = http://detail.zol.com.cn/cell_phone_index/subcate57_list_1.html;
var urlRoot = "http://detail.zol.com.cn"
var num = 1;
var nextUrl;

//封装request函数
function myRequest(url, callback) {
  var options = {
    url: url,
    encoding: null
  }
  request(options, callback)
}

var data = [];

async function getMessage(url) {
  var old_urls = []  //商品详情页的地址
  var url_Array = []  //解析商品详情页的地址
  var old_urls1 = []  //商品显示更多参数的地址
  var url_Array2 = []  //解析商品显示更多参数的地址
  var app = await fetch(url).then(res => res.text());
  var $ = cheerio.load(app, {decodeEntities: false});
  //获取单页面中所有手机详情地址
  ele = $("#J_PicMode a.pic");

  //拼接首页地址
  for (let i = 0; i < ele.length; i++) {
    old_urls.push(urlRoot + $(ele[i]).attr('href'));
  }
  //处理拼接后的数组
  url_Array = await Promise.all(old_urls);

  for (let i = 0; i < url_Array.length; i++) {
	//对数组里的每个手机详情进行深度挖掘
    UrlRequest(url_Array[i]);
  }
  nextUrl = $("a.next").attr('href');
  //下一页地址数组爬取
  if (nextUrl) {
    let next = urlRoot + nextUrl;
    getMessage(next);
  }
  return data;
}

//回调函数
function UrlRequest(url) {
  myRequest(url, function (err, response, body) {
    if (!err && response.statusCode === 200) {
      var html = iconv.decode(body, 'gbk');//解析gbk,该网址的不解析会乱码
      var $2 = cheerio.load(html, {decodeEntities: false});
      var object;
      //数据jq获取,封装成一个对象
        object = {
          name: $2(".product-model__name").text(),
          prices: $2(".price-type").text(),  //价格
          totalscore: $2(".total-score").find("strong").eq(0).text(), //评分
          Img1: $2("#threeSmallPic li").eq(0).find("img").attr('src'), //图片2
          Img2: $2("#threeSmallPic li").eq(1).find("img").attr('src'), //图片2
          Img3: $2("#threeSmallPic li").eq(2).find("img").attr('src'), //图片2
          CPU: $2(".product-link").eq(0).text(), //cpu
        };
		//连接数据库 数据入库
      let connection = new DBHelper().getConn();
      //添加入库的sql语句
      let sqls = sql.Phone.addphone;
      connection.query(sqls , object, (err, result) => {
        if (err) console.log(err);
        else console.log('成功')
      });
      //关闭数据库连接
      connection.end();
      num++;
    }
  })
}
//运行服务器时就执行
getMessage(URL);

初始化,开始爬取

Server目录里打开命令行窗口,执行命令:”npm i”,然后执行:“node server.js”

此笔记仅仅为了记录自己在项目中所学到的知识,如果有问题,可以提出,我们可以共同探讨。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值