Crawler 模块
crawler是基于node.js的爬虫工具,爬虫这个词语,一般提出来,想到的都是python相关的,node的crawler模块提供了爬取网站信息的功能。
安装
第一步肯定是安装 模块,至于说 npm init -y
去初始化,不算在内。首先使用npm去安装模块 npm i crawler
。爬取数据后,放在哪里呢?数据库里 所以顺便去安装一下mysql模块 npm i mysql
导入模块
安装成功后就要准备导入模块了
const Crawler = require("crawler");
const mysql = require("mysql");
连接数据库
然后使用mysql链接数据库
const connection = mysql.createConnection({
host: "localhost",
user: "root",
password: "123456",
database: "test"
})
创建爬虫对象
var c = new Crawler({})
{}里有几个主要的属性:
1.可以爬取的最大连接数
maxConnections: 10
2.callback (在页面爬取完后触发)
callback
有三个参数
1.error
:错误信息
2.res
: 服务器响应的数据资源合集
res
下面一个我们要用到属性$
HTML或XML文档的jQuery选择器res.body
HTTP响应实体部分res.headers
HTTP响应头部res.statusCode
HTTP状态码,正常返回 200
3.done
在处理结束之后必须调用此函数
将爬取的网站加入任务队列
使用queue
方法将任务加入队列,并等待其被执行。queue
有两个从参数 第一个参数是要爬取的网址,后面的参数可选填,平时只用第一个参数就可以。
这里我们爬取一些网址
c.queue('https://cqcn.fandom.com/zh/wiki/%E5%BC%93%E6%89%8B')
c.queue('https://cqcn.fandom.com/zh/wiki/%E5%89%91%E5%A3%AB')
c.queue('https://cqcn.fandom.com/zh/wiki/%E7%8C%8E%E4%BA%BA')
c.queue('https://cqcn.fandom.com/zh/wiki/%E6%B3%95%E5%B8%88')
c.queue('https://cqcn.fandom.com/zh/wiki/%E7%A5%AD%E5%8F%B8')
c.queue('https://cqcn.fandom.com/zh/wiki/%E9%AA%91%E5%A3%AB')
完善爬虫对象
一些重要代码标记了注释
var c = new Crawler({
// 可以爬取的最大的连接数
maxConnections: 10,
// 一般是在页面爬取完毕之后触发
callback: function (error, res, done) {
if (error) {
console.log(error);
} else {
// 网站爬取成功之后 给爬取到的对象加一个$对象 表示 当前爬取到的数据都可使用jquery的语法进行处理
var $ = res.$;
$(".hero_list li").each((index, ele) => {
//通过jq去获取元素内的文本
const heroname = $(ele).find(".name a").text();
//data-src是因为有些网站的图片是使用懒加载的方式处理图片
//而原本的src属性是一些占位,等图片快进入窗口的时候,在进行加载
const heroIcon = $(ele).find(".pic a img").attr("data-src");
// 有些图片已进入页面就是要进行记载的,所以不需要懒加载,使用data-src获取不到
//所以不想进行过多的判断,没有图片的干脆就不要了。
if(heroIcon) {
// 加入到数据库
const insertSql = `insert into list (heroName, heroImage) values('${heroname}', '${heroIcon}')`;
connection.query(insertSql, (error, results, fields) => {
// 就是操作数据库完毕之后的回到函数
if (error) throw error;
console.log(results);
});
}
})
}
//在处理结束之后必须调用此函数
done();
}
});
运行node ,最后我们看一下数据库
成功的爬取到数据了!
(如果这篇文章有什么问题请及时联系我!)