zoukankan      html  css  js  c++  java
  • 簡單的爬蟲 二 ಥ_ಥ 爬一爬 一個博客的每篇文件的標題

    簡單的爬蟲 二 ಥ_ಥ 爬一爬 一個博客的每篇文件的標題;

    這裏我是通過該博客的首頁裏面的列表進行的,判斷下一頁的標籤是否存在來把這個博客的文
    章都爬出來;不是通過博客的文章分類開始爬的,雖然代碼差不多,但是我這個是簡單的;
    複雜的我不會 ಥ_ಥ_

    • 判斷是否下一頁的標籤是否有效,來進行下一個頁面的獲取數據;如果下一頁的標籤沒有效則,囘調返回錯的;反之 則把爬到的數據合併;
                var nextStep = $('.nextpostslink').attr('href');
                console.log('nextStep--------------------------' + nextStep);
                if (nextStep) {
                    getNext(nextStep, function(err, catList2) {
                        if (!err) {
                            return callback(false, null);
                        };
                        callback(true, catList.concat(catList2));//則把爬到的數據合併;
                    })
                } else {
                    callback(true, catList);//沒有下一頁則 返回
                }
    
    • 這裏爬的博客是 (Holly Schinsky)[http://devgirl.org/],她的首頁底部有的下一頁的標籤 .nextpostslink 我爬的時候爬到了她的2155條文章 ಥ_ಥ
    • 安裝cheerio. async
    • 把爬到的數據存起來 fs.writeFileSync('result.html', liAll);
      新建一個文件 app.js
    var http = require('http');
    var cheerio = require('cheerio');
    var fs = require('fs');
    var async = require('async');
    var max = 50;
    http.globalAgent.maxSockets = (max || 5);
    /**
     * [getNext 通過下一頁標籤判斷是否進行下一頁的獲取數據]
     * @param  {[type]}   url      [鏈接]
     * @param  {Function} callback [囘調函數]
     * 
     */
    function getNext(url, callback) {
        http.get(url, function(res) {
            var size = 0;
            var chunks = [];
            var nextPage;
            res.on('data', function(chunk) {
                size += chunk.length;
                chunks.push(chunk);
            });
            res.on('end', function() {
                var data = Buffer.concat(chunks, size);
                var result = '';
                $ = cheerio.load(data.toString());
                topics = $('#content .post-title  a');
                topics.each(function() {
                    var self = $(this);
                    var item = {
                        'name': self.text(),
                        'href': self.attr('href')
                    };
                    catList.push(item);
    
                });
                var nextStep = $('.nextpostslink').attr('href');
                console.log('nextStep--------------------------' + nextStep);
                if (nextStep) {
                    getNext(nextStep, function(err, catList2) {
                        if (!err) {
                            return callback(false, null);
                        };
                        callback(true, catList.concat(catList2));
                    })
                } else {
                    callback(true, catList);
                }
    
            });
        }).on('error', function(e) {
            console.log(e.message);
            //callback(false, null);
        });
    }
    var catList = []; //側邊的分類
    var allList = []; //各分類的子分類
    var infoPage = [];
    var liAll = '';
    var i=0;//計算有多少條數據
    getNext('http://devgirl.org/', function(err, list) {
        console.log('a 的長度為----------------》'+list.length);
        if (!err) return;
        async.eachSeries(list, function(li, next) {
            liAll += '<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>Document</title></head><body><li><a href="' + li.href + '">' + li.name + '</a></li></body></html>';
            next();
        }, function(err) {
            fs.writeFileSync('result.html', liAll);
            console.log('完成');
        });
    });
    
  • 相关阅读:
    float保留指定位数的小数
    springmvc中拦截器的使用
    springmvc文件上传
    spring注入
    mybatis动态代理
    2017《JAVA技术》预备作业02 计科1502 郎春雨
    2017《JAVA技术》预备作业01 计科1502 郎春雨
    字符串占位符的使用
    Pyenv虚拟环境的创建(虚拟机)
    Git的基本使用
  • 原文地址:https://www.cnblogs.com/xieyier/p/4454289.html
Copyright © 2011-2022 走看看