一个基于Node.js的小爬虫

无道 2019-06-03 0 条评论 NodeJs 阅读963 手机阅读

用到的模块

  • mysql
  • http
  • fs
  • cheerio

其中fs 系统自带,不必安装。其余需要运行以下代码安装:

npm install -S mysql http cheerio

运行结果

截图-1559574104

代码

const http = require('http'); // 导入http模块
const mysql = require('mysql'); // 导入mysql 模块
const fs = require('fs'); // 导入文件系统模块
const cheerio = require('cheerio'); // 导入cherrio模块,这个模块类似jQuery,可操作dom


// =================config====================
const aim_url = "http://www.1905.com"; // 目标URL




// 连接数据库的配置
let connection = mysql.createConnection({
    host: 'localhost',
    user: 'root',
    password: '',
    database: 'nodejs' // 数据库名称
});

connection.connect(); // 连接数据库
console.log('========连接Mysql成功========');

// 获取数据
get_data(aim_url, deal_with_data);
// deal_with_data是一个回调函数,下面定义好了的。




// ========================以下为辅助函数 =======================
function write_to_sql(href, alt) {
    let addSql = 'INSERT INTO info(href,alt) VALUES(?,?)';
    let addSqlParams = [href, alt];
    // 很简单,sql语句,?占位,addSqlParams补充占位内容。
    connection.query(addSql, addSqlParams, function (err, result) {
        if (err) {
            console.log('[INSERT ERROR] - ', err.message);
            return;
        }

        //console.log('INSERT ID:',result.insertId);
        console.log('Success!! --- INSERT ID:', result);
    });
}


function write_file(filename, cnt) {
    // fs.writeFile(filename,data,[options],callback);
    let buffer_data = Buffer.from(cnt);

    fs.writeFile(__dirname + '/' + filename, buffer_data, {flag: 'a'}, function (err) {
        if (err) {
            console.error(err);
        } else {
            console.log('写入成功');
        }
    });
}

// 获取网页源代码完毕 的 回调函数
function deal_with_data(html) {
    write_file('content.html', html)
    // 这里将网页内容写到content.html文件
    let $ = cheerio.load(html);
    let list = $("li");
    // 遍历每一个li,提取出href,alt属性。
    list.each(function (item) {
        let a = $(this).find('a');
        let href = a.attr('href');
        let alt = a.attr('alt');
        // 过滤掉没有alt的,因为这里是直接获取所有li元素,有些不是目标元素
        if (alt !== undefined) {
            write_to_sql(href, alt);
        }
    });

    connection.end(); 
    // 最后必须结束数据库连接,不然程序会持续等待
}

// 获取网站源代码函数
function get_data(url, call) {
    // get 方法获取数据
    http.get(url, function (res) {
        let html = '';
        // 将数据放到html变量
        res.on('data', function (data) {
            html += data;
        });
        res.on('end', function () {
            call(html);
            // console.log(html.toString());
        });
    }).on('error', function () {
        console.log('获取源代码错误!');//报错
    });
}

代码作用以后再讲,11点了,关灯睡觉啦。 作用已补充,请看代码注释!

建立数据库

因为这是一个期末node.js的简单作业,老师要求是保存到数据库中,万幸是Mysql,不是该死的Sql Server

所以我们需要创建一个数据库,并创建一张表:

CREATE DATABASE nodejs;

CREATE TABLE `nodejs`.`info`  (
  `id` int(0) UNSIGNED NOT NULL AUTO_INCREMENT,
  `href` varchar(255) NOT NULL,
  `alt` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
);

数据库结果

截图-1559574345

源代码下载

文件下载

全文完 [
有帮助?打赏
支付宝打赏
微信打赏
]
标签: node.js nodejs 爬虫
修改: 2019-07-06 14:59
这篇文章还没有评论呢~
点击刷新/生成验证码
It's me
昵称:无道
坐标:成都
性别:
一个人,一介学生,一个儿子~ 愿你我都被世界温暖以待
迷思爱 公众号

新建了个公众号,会不定期分享一些小玩意,有提升效率的办公软件、有一些黑科技的软件、或教程等等。

爷~,要不关注下~~