目录创建一个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”
此笔记仅仅为了记录自己在项目中所学到的知识,如果有问题,可以提出,我们可以共同探讨。