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