前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一个基于Node.js的小爬虫

一个基于Node.js的小爬虫

作者头像
无道
发布2019-11-12 15:55:06
6200
发布2019-11-12 15:55:06
举报
文章被收录于专栏:无道编程无道编程

用到的模块

  • mysql
  • http
  • fs
  • cheerio

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

代码语言:javascript
复制
npm install -S mysql http cheerio

运行结果

截图-1559574104
截图-1559574104

代码

代码语言:javascript
复制
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

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

代码语言:javascript
复制
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
截图-1559574345

源代码下载

文件下载

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-06-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 用到的模块
  • 建立数据库
  • 数据库结果
  • 源代码下载
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档