美文网首页
超简单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