美文网首页程序员
50行代码抓取一个网站

50行代码抓取一个网站

作者: thisxulz | 来源:发表于2018-04-25 15:31 被阅读0次

    50行代码抓取一个网站

    很多年前写的代码了,只是记录一下

    主要使用nodejs + cheerio

    cheerio可以采用jquery方式解析dom结构,网上很多不做转述

    如果只是json数据的话,可以不用cheerio

    实现数据抓取,数据筛选,频率控制,断点续传

    npm install cheerio

    npm install superagent-prefix

    npm install superagent-charset

    npm install line-reader

    贴代码:

    var prefix = require('superagent-prefix')('/static');

    var request = require('superagent-charset');

    var cheerio = require('cheerio');

    var fs = require('fs');

    var lineReader = require('line-reader'); //日志定义

    var log4js = require('log4js');

    log4js.configure("./log4js.json"); //注:配置里的日志目录要先创建,才能加载配置,不然会出异常

    var logger = log4js.getLogger('log');

    var startUrl = 'http://XXXXXXX.com/search/?q=27age&iy431rzm&per_page=20&wfl=1&page=';//起始地址

    var fileName = 'result.txt';//文件生成目录

    var num=1;

    function doUrl(url){

        request.get(url) .use(prefix) // Prefixes *only* this request

        .charset('utf-8')

        .end(function(err, res){

            if(err){ console.log(err); }

            //获取网页中的json数据

            var json = res.text.substring(res.text.indexOf('app.page["pins"]         =')+19,res.text.indexOf('app.page["page"]')-2);

            var obj = JSON.parse(json);

            var lastId = '';

            if(obj.length > 0){

                for(var i=0;i<obj.length;i++){//数据筛选

                    if(obj[i] != null && obj[i].source != null && obj[i].source=='xxxx'){

                        lastId = obj[i].pin_id;

                        appendToFile(fileName, obj[i].pin_id + ',' + obj[i].link + ',http://xxxx.com/pins/' + obj[i].pin_id + ',' + obj[i].repin_count + ',' + obj[i].like_count + ',' + obj[i].comment_count + '\r\n');

                        }

                    }

                    num++;

                    var nextUrl = startUrl + num;//下一页链接

                    fs.writeFile('num.txt', num);//记录已经抓取的页号

                    logger.info('do next, ulr = ' + nextUrl);//抓取下一页数据

                    setTimeout(function(){doUrl(nextUrl)},600);//控制抓取频率,不然很容易被封

                }else {

                    logger.info('没有更多数据, url = ' + url);

                }

        });

    }

    function appendToFile(fileName,line){

        fs.appendFile(fileName,line,function(err){if(err) throw err});

    }

    lineReader.eachLine('num.txt', function(line, last) {//启动时,从上次抓取的最后一页开始抓取

        num = line;

        doUrl(startUrl + num);//程序启动

        return false;

    });

    相关文章

      网友评论

        本文标题:50行代码抓取一个网站

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