葡京网上娱乐场2017年终总结

  原文地址:NodeJS网络爬虫
  网上发那么些外语言平台版本的网络爬虫,比如Python,Java。那怎么能少得矣我们无所不能的javascript呢?这个与之前让活狗开发之批量图片下载配置工具,原理非常一般,核心就是调用Node的http模块。

春节前的感慨

无意已来少数个月之年华尚未更新文章了,时间真是了得好快呀,转眼间2017也已赶到了最后一天,这篇稿子就来记录和总结一下千古之这2017年吧!
2017年对自我吧注定是匪略的一个载,有获取有遗憾,在开源世界上出了好重新多之孝敬、阅读了多经文的书籍让好之知识之深和广度上了一个台阶、当然也交了广大情投意合优秀的恋人、同时随着自己大学时光的最终一年吗出去走走看看;当然遗憾也未丢,总感觉到时不足够用,也总感觉好荒废了成千上万珍贵的岁数,每每想到这些心头总是唏嘘不已。

网爬虫基本就是由于如下一些组成:

2017年的回顾

  1. 次入口
  2. 吁模块
  3. 数据说明

成就

  • 设计模式:看了了豪门推荐的《大话设计模式》,以及认真的做扫尾了笔记:simplebam/JavaDesignPatterns:
    Java常用的设计模式
  • 常用之数据结构与算法:虽然此我开了笔记(笔记链接:simplebam/frequentAlgorithm:
    Java常用算法)以及本人之CSDN上且发出很多记,但好不满之饶是当下为了面试而习一点浅,去交腾讯CVTE等这样的大厂时候吃虐成狗,这里要可以
  • 书籍:
    葡京网上娱乐场 1
    于图书馆摆放的《轻松学算法》、《Android第二执行代码》、《Android开放措施探索》等没带来回来,哈哈哈,今年进的开真的还足够吃少不善海底捞了(很谢谢我之蝇头单姐姐,她们的本支持下将这些书籍搬回去了,技术书籍确实怪贵)

  程序入口可以为此web页面实现,还可以以网页上显得抓取的数额和分析结果;但是是自家特想将精力花在基本模块,页面及体制不思花尽多精力去动手。所以也,我就算开发个node的命令行工具,这个比较成熟的就是是commander了。

不足

  • 人性上小小浮躁,好高骛远。关于这或多或少,在YY实习的老师、我大哥大嫂等还与我提及了,在12月眼看一个月吃,我做了深刻的检查,由于过度追求一线二线互联网商家,即使在平年前便已经布下秋招的备选,也坚称在学校里面闭关修炼,但秋招的枪声响起以来,我连连看大庄还是说明星创业公司才发一样客简历过去,最后的产物可想而知,死在了或鄙视要么技术面上
  • 攻上不够专注。记得在优态科技的冯嘉宁总监与自身说罢,先精后博,不忘怀初内心。但自己在追求好之优异而忘掉了投机就是是靠Android起家,没学好Android的而即使失为PHP(纯粹为了简历上得多写一个编程技能),这或多或少委漂亮去潜心修炼
  • 英语方面。其实自己看网上知乎上面说之慌对,即使BAT现在早已跻身了国际一线互联网公司的班,但编程技术的革新还是国外在驱动,因此大部分底流行技术先以海外流行,中国的开发者或者出版社才会错过翻译,等到我们手里早不知都过了多久。之所以一直不上英语的案由是观看培训机构方面“一年得以达成雅思7”等口号误导,以为自己以到秋招满意的Offer就夺报个雅思班,恶补英语就好,殊不知计划永远赶不达生成,很多事情还吃滞后了,关键要异想天开多了碰。
  • 上学效率不如。在旁人看来,我真非常拼命,几乎元旦摸索个好生活都愣住在图书馆,但死好奇我的艺还直接停留呢?但见到简书stay4it的乃的开发为何如此低效? –
    简书以及尚于于是应试教育那无异模仿模拟编程? –
    简书今后,我起来了自身反省,技术是为了采取,一味在坐背背,过几上不怕忘记了,这样子的背有啊作用吧?要记得在特点品种中成长,遇到问题先行想一下,这里呢援引一首文章:控这套路,80%的题材而都能依赖自己解决 –
    简书
  • 逻辑思维能力以及口才表达能力。这里自己在面试中或许为出接触乱造成小办案匪交面试官问题的显要点以及表达出来的意思没有让面试官感觉明白,这或多或少确实用漂亮改正

  请求模块方面,我光想抓到手百度的页面,还有知乎的页面,它们的呼吁都是https协议的,好于Node的https和http模块功能几乎是平的,这里用做的就是是驾轻就熟她的api就哼了,也是easy。

2018年之展望

归结,只想说词:”我2018年的对象,就是搞定2017年那些原来定于2016年到位的布,不呢别的,只吗落实自己2015年每每假如成功的2014年计划之诺言
” 。
葡京网上娱乐场 2

此处还有几单稍目标:

  • 管自之CSDN博客的稿子全部梳一遍,这样使文章质量再胜似,写的假设来深一些,不要想今天那些文章写的那low
  • 适宜时候开通公众号和私人博客

CSDN博客:simplebam
欢迎关注自己,一起学学,一起前行!
末段还得而介绍者在线编神器:Md2All

  数据说明模块,因为抓取出来的页面内容是字符串,所以可以为此正则表达式去匹配,但是如此最好难为了。有无发出还好的章程?抓到手回来但都是html内容,用jQuery以操作dom的法去分析数据未是充分便宜嘛,恰好有只劳务端的jquery库cheerio。

  页面抓到手完,数据也剖析出了,那即便非常简单了,你得选取存入数据库或者写副文件保留。接下来就是开实现地方的功能模块。

程序入口

  开始布局和初始花commander,具体的施用办法参考官方的文档:https://www.npmjs.com/package/commander,这里不再详细解释之所以法了,下面开始部署commander。
  首先要在package.json添加如下节点,表示注册了一个命行 “grab”。

  "bin": {
    "grab": "bin/grab.js"
  },

  就以grab.js开始定义commander,最后我们就是得这样执行命令行:”grab
baidu
“,当然可以据此bd简写代替baidu,知乎的定义跟百度是一律,这里不再重复介绍了。

    program
        // .allowUnknownOption()//不报错误
        .version('0.0.1')
        .usage('这是我的网络爬虫程序😎'
          +'\n  grap [option]'
          +'\n    bd baidu: baidu search'
          +'\n    zh zhihu: zhihu search');

    program
        .command('baidu <cmd>')
        .alias('bd')
        .description('baidu search baidu')
        .option("-t, --tieba", "baidu tieba")
        .action(function(cmd, options){
          console.log('baidu search "%s":', cmd);
          request.baiduSearch(cmd);
        }).on('--help', function() {
          console.log('  Examples:');
          console.log();
          console.log('    grab bd    <cmd>');
          console.log('    grab baidu <cmd>');
          console.log();
        });

    program.parse(process.argv);

吁模块

  https模块发起呼吁主要发生有限种植方法,这里小封装了生:

  1. get方式,主要对的是简简单单的请求,只需要传递url发起get请求。知乎的调用这个就好了。

    function get(url,callback) {
        return https.get(url,function(response) {
            var body = '';
    
            response.on('data', function(data) {
                body += data;
            });
    
            response.on('end', function() {
                callback(body);
            });
        });
    }
    
  2. requerst方式,不但可发起get请求,也堪倡导post请求,还得改端口,请求header。这个重中之重是针对限制于多的百度爬虫。百度必须设置header,同时百度请求参数为比较复杂,需要专门配备,具体可参看网上的资料。

    function request(options,callback){
        // var postData = qs.stringify({});
        var body,
        req = https.request(options, (res) => {
            console.log('STATUS: ' + res.statusCode);
            // console.log('HEADERS: ' + JSON.stringify(res.headers));
            res.setEncoding('utf8');
            res.on('data', function (chunk) {
                body+=chunk;
            });
            res.on('end',function(){
                callback(body)
            });
        });
    
        req.on('error', function(e) {
            console.log('problem with request: ' + e.message);
        });
    
        // write data to request body
        // req.write(postData);
        req.end();
    }
    
    function baiduRequset(pageNo,pageSize,keyword){
        var path='/s?'+qs.stringify({
            ie:'utf-8',
            f:8,
            rsv_bp:1,
            tn:'baidu',
            rn:pageSize,
            pn:pageNo*pageSize,
            wd:keyword
        }),
        options = {
            hostname: 'www.baidu.com',
            port: 443,
            path: path,
            method: 'GET',
            headers: {
                'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36'
            }
        };
    
        request(options,function(body){
            saveFile(pageNo,keyword,body);
            showBaiduResult(pageNo,body);
        });
    }
    

多少说明

  抓取数据以后,我们用举行的就算是调用cheerio,以jquery获取dom内容的办法获得结果,并出示出来,当然也得保留文件或者数据库。

  /**
   * 显示结果
   * @param  {[type]} pageNo [description]
   * @param  {[type]} body   [description]
   * @return {[type]}        [description]
   */
  function showBaiduResult(pageNo,body){
    var title,summary,link,
        reg=/<[^<>]+>/g,
        $ = cheerio.load(body,{decodeEntities: false});

    $('#content_left .result').each(function(i,item){
      var $a = $(item).find('h3 a');
      title = $a.html();
      link = $a.attr('href');
      summary=$(item).find('.c-abstract').html();
      if(title){
        console.log(`第${pageNo+1}页 第${i+1}条`);
        console.log(`link: ${link}`.green);
        // console.log(`title: ${title}`);
        console.log('title: ');
        ouputColor(title);
        if(summary){
          // console.log(`summary: ${summary}`);
          console.log('summary: ');
          ouputColor(summary);
        }
      }
      console.log('------------------------------');
      console.log('');
    });
  }

  // 知乎
  exports.zhihuSearch=function(keyword,cb){
    get('https://www.zhihu.com/search?type=content&q='+keyword,function(content){
      var title,summary;
      var $ = cheerio.load(content,{decodeEntities: false});
      saveFile(0,keyword,content);
      $('.list .item').each(function(i,item){
        title=$(item).find('.js-title-link').html();
        summary=$(item).find('.summary').html();
        if(title){
          // title=(''+title).replace(/<[^<>]+>/g,'');
          // summary=(''+summary).replace(/<.+>/g,'');
          console.log('title: ');
          ouputColor(title);
          if(summary){
            console.log('summary: ');
            ouputColor(summary);
          }
        }
        console.log('------------------------------');
        console.log('');
      });
    });
  };

施行爬虫

功效就后,先试验瞬间抓取知乎的内容

grab zh webgl

抓取到之html文件保留在download文件夹,同时以命令行显示抓取结果。
葡京网上娱乐场 3

万一一旦实行百度的爬虫,运行而下命令行即可

grab bd webgl

总结

  这里落成的凡最为中心的爬虫功能,代码请圈net_grab