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('完成');
        });
    });
    
  • 相关阅读:
    DataGridView 设置行不可见时,与货币管理器的位置关联的行不能设置为不可见
    DataGridView 冻结列后出现 无法添加该列,原因是它被冻结并被置于未冻结的列之后
    sql 2000 查询中增加序号列,自动增加列
    SQL 语法大全
    清除vs2003vs2008起始页最近打开项目
    ALTER TABLE 修改表时 因为有一个或多个对象访问此列
    UNIX上C++程序设计守则(信号和线程)(上)
    Thread Cancel 指南
    [C++再学习系列] 深入new/delete:New的3种形态
    设计模式学习(六):重构与模式,推荐书籍(完)
  • 原文地址:https://www.cnblogs.com/xieyier/p/4454289.html
Copyright © 2011-2022 走看看