Linux 密码生成器

  原来的作品地址:NodeJS网络爬虫
  网上有众多其余语言平台版本的互联网爬虫,比如Python,Java。那怎么能少得了大家手眼通天的javascript呢?这一个和事先给产品狗开发的批量图片下载配置工具,原理很一般,宗旨正是调用Node的http模块。

今昔利用越来越多,常常要输入密码,有的对密码的健壮性没有必要,有的必要大小写,特殊字符,数字,至少不怎么位等等,冥思苦想想不到好一点的密码。

网络爬虫基本就由如下一些构成:

幸好在Linux系统下,大家有广大主意能够生成符号供给的密码。

  1. 程序入口
  2. 呼吁模块
  3. 数码表明
  1. 1般格局随机生成。

  程序入口能够用web页面落成,还足以在网页上呈现抓取的多寡和剖析结果;可是那个本人只想把精力花在主导模块,页面和体制不想花太多精力去弄。所以呢,笔者就开发个node的命令行工具,那些相比较早熟的便是commander了。

  请求模块方面,笔者只想抓取百度的页面,还有新浪的页面,它们的央求都以https协议的,万幸Node的https和http模块功效大概是同样的,那里须要做的就是游刃有余它的api就好了,也是easy。

➜  ~ openssl rand -base64 15
q7X/UN7SL+yEcIYRxacE

  数听大人讲明模块,因为抓取出来的页面内容是字符串,所以能够用正则表明式去匹配,可是这么太难为了。有未有越来越好的情势?抓取回来可都以html内容,用jQuery以操作dom的法子去分析数据不是很有益嘛,恰好有个服务端的jquery库cheerio。

  1. 利用正式的密码生成工具pwgen
    pwgen在各样linux平台上都得以透过包管理器安装,在mac上则采纳brew安装。

  页面抓取完,数据也分析出来了,这就格外不难了,你能够选取存入数据库只怕写入文件保留。接下来就伊始兑现地点的功用模块。

程序入口

  初叶布署和早先花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);
yum install -y pwgen  #CentOS上安装
brew install pwgen #Mac系统上安装

pwgen [ OPTIONS ] [ pw_length ] [ num_pw ]
 -c or --capitalize  至少一个大写字母
  -A or --no-capitalize 不要包含大写字母
  -n or --numerals 至少包含一个数字
  -0 or --no-numerals 不要包含数字
  -y or --symbols 至少包含一个特殊字符
  -r <chars> or --remove-chars=<chars> 从密码中移除某些字符
  -s or --secure 生成完全随机的密码
  -C 已列方式生成密码
  -1 不以列方式生成密码

恳请模块

  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('');
      });
    });
  };
➜  ~ pwgen -cnyC 15
nu6airievei$X[u Xoh#Ph@ai5eu5ai xaM0yiom[iyiek9 heePh#oo5Aithi4 eix6miebooh$ooS
Iec5ahkeX@ohnoo luphah7Fa<a4hah Moh:k6ies1Iet9I aeH0ak0ithee#s4 ohn7ei"N_ohghoo
zo5aw<ee4ooHic8 ohQu0cheethie~w faishuDah#gie1h akahX7ieY}ooN5e uusud-ei8ooxeiJ
shiuL;iec1Shoo4 phe2oov]uyeiZ'e Faim(ie6pe9XahD aelu5eequ4aiG,e zae|x4mu4Chielu
Ohgh|ohc6uv7vou niosah7eo)feiTi AiSh`ein8doo7Ye joh5eit5Shaz!uJ Ivai0ucahMoF!ah
oop=e0fei1kuTa0 aer9zae4AilaeB~ ungieP9ca7fae't Case^x1osheeSa1 iit8haij\oh7ohS
uo}C4zi7Ohqu/ei eong8eeb6OoGif_ Cee4ooYaikoo$Yo Ihae?thou6apa5b PiejahJeil$ah2X
ohpei3eiL2eiz%e uThue3eezah!z\u xo3waeW6pie:Gh| maW"e+o8ohng'ee thu*H0Gae1Muaco
ong6Ce>ij|ahShi ieV5oov8UNge$ik ooW%ooMiu(daeb1 gah6Ahy}aicei6y xe(b+iKooSh<ee3
ahm9ael[ae9UF4o gaichaWee0imai/ Rapo}n5eneecier weeX!aeng4oosed Eeg&am7Nesh0ree
xaeyaexu4Lee@ra chu%a5Shaith1ah uoqu6yair3ooL?i aipae#Ke\d^a4vi eecee2Udoh8ahj]
Iev6roo%ng1weon Ahb4fee>K0eeN}i heeng8pheu-Z~ah at5Jeerei/g{i8i eephaoCha.o%li7
ahf:ush7aingoV0 ShegooV7quuud`u eiw0Noog\aiBei6 lahhoow:aiB2ooY eidai7sah%h2eiM
ku=k0do6thaePhi FoWoose9li&ubei Aip1phie]gh"u-e yieT_uda0heayei iepoe|Paiz3aNga
thah+j0Yeetuz1p Seeroh|wighuc8I oTh[ai2aichemoh ahxaequ4eeyaeV, Ain/oo2Eegiesha
Aos$uboo0ieC8il pi|ma)w1wahie"N bequ1aa7ue~Ch5u ieM}aeweiMie8ai eezie)qu4eeLohv
La2rei^j0raire3 Shochiep7zai=th quae}Nguer9iero wi{k0ailaK4phoo air7eil7aiG\ie>
xen#up4haiR]ooN Inoh]nget3Thee* Bae@h9Lie0ogaew IeY4ohMah:Zohce rae^k5laedohL5U
choh^C7eeHi0ae5 hoNe5sain*eePh8 eb8Fi=phei3ieth UoB4eri>ng9xai7 ieNg%aa*h9eThae
rohP`ei4thi=faL sootaite-a8Uxob ez1ieZ0ohl3Ru>m ieBaevuX{uziTo3 Jilubee'gh9ozi*

推行爬虫

意义实现后,先试验须臾间抓取和讯的情节

grab zh webgl

抓取到的html文件保留在download文件夹,同时在命令行突显抓取结果。
图片 1

借使要实施百度的爬虫,运转如下命令行即可

grab bd webgl

密码生成截图

总结

  那里成功的是最基本的爬虫作用,代码请看net_grab

总结

有个密码生成器,现在再也不用担心要想各样密码了。