码迷,mamicode.com
首页 > 其他好文 > 详细

目录扫描编写

时间:2017-08-29 14:13:04      阅读:236      评论:0      收藏:0      [点我收藏+]

标签:设置   art   gen   exists   user   file   async   class   htm   

1. 目录字典
2. HTTP::UserAgent
3. Start创建线程数(也可以用Proc::Async)

 

先创建一个导入字典的函数:

sub MAIN (Str $dict) {
        #判断是否是文件
        if $dict.IO.f {
            #不要把文件一次进数组, 一行一行读就行
            for $dict.IO.lines -> $line {
                  say $line;
            }
        }else {
            say $dict~ Not exists or not a file!;
            #不是文件或不存在就提示
        }
}

 

这样我们就能编历一个字典文件。

我们再设置用户传入一个 url或ip:

sub MAIN (Str $ip, Str $dict) {
        #
        #判断是否是文件
        if $dict.IO.f {
            #不要把文件一次进数组, 一行一行读就行
            for $dict.IO.lines -> $line {
              #拼接url

                  say $ip~/~$line;
            }
        }else {
            say $dict~ Not exists or not a file!;
            #不是文件或不存在就提示
        }
}

注意, 这里的 url我们没有检测是否输入合法。我们这里没有写测试函数。

 

再导入 HTTP::UserAgent 来访问 url:

use HTTP::UserAgent;
sub MAIN (Str $ip, Str $dict) {
        #
        #判断是否是文件
        if $dict.IO.f {
            #不要把文件一次进数组, 一行一行读就行
            for $dict.IO.lines -> $line {
              #拼接url
                  my $ua = HTTP::UserAgent.new;
                  my $target = $ip~/~$line;
                  my $html = $ua.get($target);
                  #查看状态码
                  say $html.status-line;
            }
        }else {
            say $dict~ Not exists or not a file!;
            #不是文件或不存在就提示
        }
}

 

我们把结果保存到一个文件:

use HTTP::UserAgent;
my $fp = open result.txt, :w;
sub MAIN (Str $ip, Str $dict) {
        #
        #判断是否是文件
        if $dict.IO.f {
            #不要把文件一次进数组, 一行一行读就行
            for $dict.IO.lines -> $line {
              #拼接url
                  my $ua = HTTP::UserAgent.new;
                  my $target = $ip~/~$line;
                  say Fetch: ~$target;
                  my $html = $ua.get($target);
                  #查看状态码
                  #say $html.status-line;
                  $fp.say($target => $html.status-line);
            }
        }else {
            say $dict~ Not exists or not a file!;
            #不是文件或不存在就提示
        }
}

 

我们准备创一个多线程的, 用start包住代码块, 再设置一个数组控制线程数量即可:

use HTTP::UserAgent;
my $fp = open result.txt, :w;
my @threads; #控制线程数目
sub MAIN (Str $ip, Str $dict) {
        #
        #判断是否是文件
        if $dict.IO.f {

            #不要把文件一次进数组, 一行一行读就行
            for $dict.IO.lines -> $line {
              push @threads, start {
                  #拼接url
                  my $ua = HTTP::UserAgent.new;
                  my $target = $ip~/~$line;
                  say Fetch: ~$target;
                  my $html = $ua.get($target);
                  #查看状态码
                  #say $html.status-line;
                  $fp.say($target => $html.status-line);
              };
              #控制线程 数
              if @threads == 4 {
                  await @threads;
                  @threads = [];
              }
            }
        }else {
            say $dict~ Not exists or not a file!;
            #不是文件或不存在就提示
        }
    await @threads; }

现在还有一个问题就是, 文件同时写入保存时, 可能会有问题, 我们最后加一个写 的Lock就行:

未完

 

目录扫描编写

标签:设置   art   gen   exists   user   file   async   class   htm   

原文地址:http://www.cnblogs.com/perl6/p/7447702.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!