使用node的http爬取网站的名称,当然也可以爬取其他的内容,方法相同,将爬取的网站内容存到数据库中,首先把网址存放在一个txt文件中,使用node的fs模块读取内部的数据,循环发送请求,代码如下:
var http = require('http'); var fs = require("fs"); //相当于JQ插件 const cheerio = require('cheerio') var fs = require("fs"); var mysql = require('mysql'); var iconv = require('iconv-lite'); //读取txt的内容 var data = fs.readFileSync('data.txt'); //将读取的内容转为字符串 var str = data.toString() //将字符串转为数组 var arr = str.split('\n'); //数据库配置文件 var db = require('./dbconfig') var Crawler = require("crawler"); //链接数据库 var connection = mysql.createConnection(db); // Recreate the connection, since //将数据库中的数据显示到页面,保存为json文件,然后json文件转为excel,方便数据对比 // http.createServer((req, res) => { // var sql = "select * from datas" // connection.query(sql, (err, doc) => { // res.end(JSON.stringify(doc)) // }) // }).listen(3000) connection.connect((err) => { if (err) { console.log('数据库链接失败') } else { console.log('数据库链接成功') } }); //创建表和字段 let createTable = 'CREATE TABLE datas(id int AUTO_INCREMENT,href VARCHAR(255),title VARCHAR(255),state VARCHAR(255),PRIMARY KEY(ID))'; connection.query(createTable, (err, result) => { if (err) { console.log(`创建表失败${err}`) } else { console.log('创建表成功') } }) //封装sql语句,将抓取的内容存到mysql中 let insetData = function (data) { let sql = 'INSERT INTO datas SET ?'; let datas = { href: data.href, title: data.title, state: data.state } connection.query(sql, data, (err, result) => { if (err) { console.log(err) } }) } //开始循环数组发送请求 arr.forEach((item, index) => { getData(item) }) //简单封装http模块。传入url即可发送请求 function getData(url, index) { http.get(url, function (res) { //请求网站的状态码 var statusCode = res.statusCode //二进制文件 let chunks = []; //把请求到的数据累加到变量html中,方便之后截取网站的chartset字符集编码,防止抓取到乱码 var html = '' res.on('data', function (d) { chunks.push(d); html += d }); //得到数据 res.on('end', function (err, result) { if (!err) { //默认网站是utf-8字符集, var charset = "utf-8"; //得到抓取网站的字符集编码,然后在解二进制的时候,设置编码 var arr = html.match(/<meta([^>]*?)>/g); if (arr) { arr.forEach(function (val) { var match = val.match(/charset\s*=\s*(.+)\"/); if (match && match[1]) { if (match[1].substr(0, 1) == '"') match[1] = match[1].substr(1); charset = match[1].trim(); } }) } //正则匹配不准确,防止正则多匹配内容 charset = charset.length >= 10 ? "utf-8" : charset; //对返回的数据进行解码,方便得到我们需要的数据 let _html = iconv.decode(Buffer.concat(chunks), charset); //初始化cheerio,这样我们就可以像JQ一样操作返回的数据了 let $ = cheerio.load(_html); //获取网站名称 var text = $('title').text(); //网站的请求状态码,如果是301的话,那么就需要得到重定向的地址,然后利用递归再次发起请求 var state = res.statusCode // 抓取成功 if (state && state != 301) { //判断是否存在开庭公告 let data = { href: url, title: text, state: state } insetData(data) } else if (state == 301) { if (res.headers.location.indexOf('http://') > -1) { getData(res.headers.location) } } } }); }).on('error', function (e) { //当出现错误,就说明网站无法打开 let obj = { href: url, title: '', state: '无法打开' } insetData(obj) console.error(e); }); }
最后没有解决的问题是,抓取的数据比较多,mysql会出现断开链接的情况,在网上找了一些文章,但是没有解决,目前暂时不知道处理方法,哪位朋友知道,可以联系我,非常感谢帮助我的人。
发表评论
侧栏公告
寄语
譬如朝露博客是一个分享前端知识的网站,联系方式11523518。
热评文章
标签列表
热门文章
友情链接