一个百度贴吧下载指定单个帖子所有回复的工具(JavaScript)实现-阿里云开发者社区

开发者社区> 开发者小助手-bz6> 正文

一个百度贴吧下载指定单个帖子所有回复的工具(JavaScript)实现

简介: 一个百度贴吧下载指定单个帖子所有回复的工具(JavaScript)实现
+关注继续查看

var http = require('http'),

   fs = require('fs');

function Spider(postId, seeLz) {

   this.currentPageNum = 1;

   this.numOfPagesToCrawl = 0;

   this.baseUrl = 'http://tieba.baidu.com/p/'  

                  + postId  

                  + '?see_lz='  

                  + (seeLz || 1)

                  + '&pn=';

   this.data = '';

}

Spider.prototype = {

   constructor: Spider,

   

   crawl: function(pageNum) {

       var self = this;

       var url = this.baseUrl + (pageNum || this.currentPageNum);

       http.request(url, function(res){

           res.setEncoding("utf8");

           // response returns chunks

           res.on('data', function(chunk){

               this.data += chunk;

           });

           res.on('end', function(){

               var that = this;

               // because of the nature of asynchronous, can't simply return the data here, but bring in Processor object for data processing

               var processor = new Processor(this.data);

               var title = processor.getTitle();

               this.numOfPagesToCrawl = processor.getPageCount();

               console.log(title);

               console.log('====================');

               console.log('');

               var posts = processor.getPosts();

               var index = 0;

               var interval = setInterval(function() {

                   console.log(posts[index]);

                   console.log("> posts left on the current page: " + (posts.length - index));

                   console.log('~~~~~~~~~~~~~~~~~~~~');

                   processor.writeFile(title, posts[index] + '\n\n');

                   index++;

                   if (index >= posts.length) {

                       

                       console.log("end of this page");

                       

                       this.data = '';

                       self.currentPageNum++;

                       clearInterval(interval);

                       if (self.currentPageNum < that.numOfPagesToCrawl) {

                           console.log("get ready to the next page");

                           self.crawl(self.currentPageNum);

                       } else {

                           console.log("that's all there's to it...");

                       }

                   }  

               }, 500);

           });

       }).end();

   }  

};

function Processor(data) {

   this.data = data;

}

Processor.prototype = {

   constructor: Processor,

   

   // to extract page content that only exists in a single location

   matchSingle: function(regex) {

       var matched = this.data.match(regex);

       var result = !!matched? matched[1] : '';  

       return result;

   },

   // to extract page contents that exist in multiple locations

   matchMulti: function(regex) {

       var matched = this.data.match(regex);

       var results = !!matched? matched : [];

       return results;

   },

   // to remove rubbish contents  

   purify: function(str) {

       var htmlTags = /<.*?>/g;

       var spaces = /\s+/g;

       var purified = str.replace(htmlTags, '')

                         .replace(spaces, '');

       return purified;

   },

   // to extract total page counts

   getPageCount: function() {

       var pageCount = this.matchSingle(/

  •        return pageCount;
  •    },

       // to extract post title

       getTitle: function() {

           var title = this.matchSingle(/core_title_txt.*?title="(.*?)"/);

           return title;

       },

       // to extract all posts in a given page

       getPosts: function() {

           var rawPosts = this.matchMulti(/(.*?)<\/div>/g);

           var posts = [];

           for (var i = 0; i < rawPosts.length; i ++) {

               posts.push(this.purify(rawPosts[i]));

           }

           return posts;

       },

       writeFile: function(fileName, data) {

           fs.appendFile((fileName || 'output') + '.txt', data, function(err) {

               if (err) {

                   throw err;

               }

           })

       }

    };

    var spider = new Spider(process.argv[2] || 3138733512);

    spider.crawl();

    版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

    相关文章
    使用NAT网关轻松为单台云服务器设置多个公网IP
    在应用中,有时会遇到用户询问如何使单台云服务器具备多个公网IP的问题。 具体如何操作呢,有了NAT网关这个也不是难题。
    25920 0
    阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
    如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
    7238 0
    阿里云服务器端口号设置
    阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
    8920 0
    阿里云服务器如何登录?阿里云服务器的三种登录方法
    购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
    10522 0
    腾讯云服务器 设置ngxin + fastdfs +tomcat 开机自启动
    在tomcat中新建一个可以启动的 .sh 脚本文件 /usr/local/tomcat7/bin/ export JAVA_HOME=/usr/local/java/jdk7 export PATH=$JAVA_HOME/bin/:$PATH export CLASSPATH=.
    4446 0
    阿里云服务器ECS登录用户名是什么?系统不同默认账号也不同
    阿里云服务器Windows系统默认用户名administrator,Linux镜像服务器用户名root
    2950 0
    1853
    文章
    0
    问答
    来源圈子
    更多
    + 订阅
    文章排行榜
    最热
    最新
    相关电子书
    更多
    《Nacos架构&原理》
    立即下载
    《看见新力量:二》电子书
    立即下载
    云上自动化运维(CloudOps)白皮书
    立即下载