美文网首页
超简单nodejs爬虫框架快速入门 E家课堂出品

超简单nodejs爬虫框架快速入门 E家课堂出品

作者: dotcoolgirl | 来源:发表于2017-01-24 13:52 被阅读0次

我们的爬虫很简单!

但是很实用,我们已经通过这个框架爬了上千万的数据,其中包括百度云,斗图啦,资讯,可可英语等大型网站。屡试不爽,本来东西很简单,所以也就想贡献出来给大家玩。希望大家能够有空支持下我们网站,如果有视频作者最好啦,可以合作!

var Crawler = require("simplecrawler"); //这个就是我们需要的爬虫框架

var cheerio = require("cheerio"); //网页下载下来,方便把内容提取出来的工具

var mysql = require('mysql'); //保存数据,这是我们非常想实现的哦

var request = require('request'); //下载图片,文档资源很实用

var fs = require('fs'); //下载图片存图到本地

var connection = mysql.createConnection({

host: 'localhost',

user: 'root',

password: 'root',

database: 'doutu'

}); //建立数据库链接

//这下边是建立solr的客户端,方便提供搜索业务

//var solr = require('solr-client');

// Create a client

//var client = solr.createClient('127.0.0.1', '8983', 'girls');

connection.connect();

//起始url定义

var starturl = "https://www.doutula.com/article/list/?page=1";

console.log(starturl);

var crawler = new Crawler(starturl);

//设置代理,如果目标网站设置了反爬虫机制,这个就很有用

// crawler.maxConcurrency = 20;

// crawler.useProxy = true;

crawler.decompressResponses = true

crawler.respectRobotsTxt = true;

//设定代理ip和端口

// crawler.proxyHostname="202.171.253.72";

// crawler.proxyPort=80;

// crawler.userAgent='Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.38';

crawler.on("crawlstart",

function() {

console.log("Crawl starting");

});

crawler.on("fetcherror",

function(queueItem, error, responseBuffer) {

console.log(error);

});

crawler.on("fetchstart",

function(queueItem) {

console.log("fetchstart");

});

crawler.on("queueerror",

function(error, URLData) {

console.log(error);

});

crawler.on("fetchdisallowed",

function(queueItem) {

console.log("fetchdisallowed:" + queueItem);

});

crawler.on("fetchcomplete",

function(queueItem, responseBuffer, response) {

console.log("I just received %s (%d bytes)", queueItem.url, responseBuffer.length);

});

crawler.on("gziperror",

function(queueItem, error, responseBuffer) {

console.log("gzip");

});

//这个就是框架处理主体

crawler.discoverResources = function(buffer, queueItem) {

var posts = (queueItem.url).indexOf('detail') > 0 ? true : false; //首先通过特征判断是否是内容详情页

if (posts) { //如果是详情页

console.log('资源详情 去解析:' + queueItem.url);

var $ = cheerio.load(buffer.toString("utf8"));

var names = $("title").text(); //通过类似jquery的语法去获取内容

var names = names.split(' - '); //处理内容

var name = '';

if (names.length > 3) {

name = names[0] + '_' + names[1] + '_' + names[2];

}

var urls = $("img").map(function() {

$imgsrc = $(this).attr("src");

if ($imgsrc.indexOf('.png') > 0

|| $imgsrc.indexOf('.jpg') > 0

|| $imgsrc.indexOf('.gif') > 0

|| $imgsrc.indexOf('.jpeg') > 0

) {

if ($imgsrc.indexOf('static') <= 0) {

return $(this).attr("src");

}

}

}).get();

var newurl = [];

urls.forEach(function(item) {

var filename = item.substr(item.lastIndexOf('/') + 1, item.length);

newurl.push(filename);

if (filename != null) {

try {

request('http:' + item).pipe(fs.createWriteStream('doutu/' + filename)); //存入图片

} catch (e) {

console.log(e);

}

}

});

var kka = newurl.join(",");

console.log(name);

console.log(kka);

var iteminfo = {

cat: name,

content: kka,

icon: newurl[0],

created: parseInt(Date.parse(new Date()) / 1000)

}

//存入数据库

try {

var query = connection.query('INSERT INTO doutu SET ?', iteminfo, function(err, result) {

if (err) {

console.log(err);

} else {

}

});

} catch (e) {

console.log(e);

}

} else { //如果是列表页面,就通过页面元素去获取内容页面的url或者是下一页的url

console.log('分类页面:' + queueItem.url);

var $ = cheerio.load(buffer.toString("utf8"));

//links是内容页面的url数组

var links = $("a[class='list-group-item']").map(function() {

console.log($(this).attr("href"));

return $(this).attr("href");

}).get();

//列表页面url数组

var catlinks = $("ul[class='pagination'] a").map(function() {

return $(this).attr("href");

}).get();

//把所有的列表页面的url添加到内容页面的url数组中。

catlinks.forEach(function(item) {

links.push('https://www.doutula.com' + item);

});

console.log(links);

//这里直接return抛出所有待爬的url,继续让node去爬。。

return links;

}

};

crawler.on("complete",

function() {

console.log("Finished!");

process.exit();

});

//启动爬虫

crawler.start();

数据展示 

百度云 numDocs: 2009007

斗图啦  numDocs:4646

站内其他资讯 numDocs: 14594

目前为止没有遇到什么大的问题,希望能在爬虫这方面帮助到大家。

同时,

我们是一个新的创业团队,希望得到大家的支持。有空加个收藏哦,

(E家课堂)www.ejiakt.com

都是围绕我们it人的生活的网站,希望大家可以喜欢

相关文章

网友评论

      本文标题:超简单nodejs爬虫框架快速入门 E家课堂出品

      本文链接:https://www.haomeiwen.com/subject/fpmzbttx.html